diff --git a/examples/recipes/ecto/.env.example b/examples/recipes/ecto/.env.example new file mode 100644 index 0000000000000..1602f76c65dec --- /dev/null +++ b/examples/recipes/ecto/.env.example @@ -0,0 +1,13 @@ +PORT=4009 +CUBEJS_PG_SQL_PORT=9432 +CUBEJS_DB_TYPE=postgres +CUBEJS_DB_PORT=8432 +CUBEJS_DB_NAME=pot_examples_dev +CUBEJS_DB_USER=postgres +CUBEJS_DB_PASS=postgres +CUBEJS_DB_HOST=localhost +CUBEJS_DEV_MODE=true +CUBEJS_LOG_LEVEL=trace +NODE_ENV=development +CUBEJS_DB_QUERY_TIMEOUT="60m" +CUBEJS_CONCURRENCY=128 diff --git a/examples/recipes/ecto/.gitignore b/examples/recipes/ecto/.gitignore new file mode 100644 index 0000000000000..20de43cd7327a --- /dev/null +++ b/examples/recipes/ecto/.gitignore @@ -0,0 +1,28 @@ +# Runtime logs +*.log + +# Process ID files +*.pid + +# Node modules (uses root workspace) +node_modules/ + +# Yarn lock (uses root workspace yarn.lock) +yarn.lock + +# Environment file (use .env.example as template) +.env + +# Build artifacts +bin/ + +# CubeStore data +.cubestore/ +.venv/ +/__pycache__* +/fix-formatting.sh +/run-ci-tests-local.sh +/rebuild-after-rebase.sh +/run-clippy.sh +/run-quick-checks.sh +/run-tests-only.sh diff --git a/examples/recipes/ecto/compose.yml b/examples/recipes/ecto/compose.yml new file mode 100644 index 0000000000000..287d8e3192400 --- /dev/null +++ b/examples/recipes/ecto/compose.yml @@ -0,0 +1,16 @@ +services: + postgresql: + container_name: cube_postgresql + image: docker.io/postgres:alpine + restart: always + command: -c 'max_connections=1024' -c 'shared_buffers=32GB' + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - 8432:5432 + volumes: + - postgresql:/var/lib/postgresql/data + +volumes: + postgresql: diff --git a/examples/recipes/ecto/model/cubes/datatypes_test.yml b/examples/recipes/ecto/model/cubes/datatypes_test.yml new file mode 100644 index 0000000000000..3d06b38a60969 --- /dev/null +++ b/examples/recipes/ecto/model/cubes/datatypes_test.yml @@ -0,0 +1,109 @@ +cubes: + - name: datatypes_test + sql_table: public.datatypes_test_table + + title: Data Types Test Cube + description: Cube for testing all supported Arrow data types + + dimensions: + - name: an_id + type: number + primary_key: true + sql: id + # Integer types + - name: int8_col + sql: int8_val + type: number + meta: + arrow_type: int8 + + - name: int16_col + sql: int16_val + type: number + meta: + arrow_type: int16 + + - name: int32_col + sql: int32_val + type: number + meta: + arrow_type: int32 + + - name: int64_col + sql: int64_val + type: number + meta: + arrow_type: int64 + + # Unsigned integer types + - name: uint8_col + sql: uint8_val + type: number + meta: + arrow_type: uint8 + + - name: uint16_col + sql: uint16_val + type: number + meta: + arrow_type: uint16 + + - name: uint32_col + sql: uint32_val + type: number + meta: + arrow_type: uint32 + + - name: uint64_col + sql: uint64_val + type: number + meta: + arrow_type: uint64 + + # Float types + - name: float32_col + sql: float32_val + type: number + meta: + arrow_type: float32 + + - name: float64_col + sql: float64_val + type: number + meta: + arrow_type: float64 + + # Boolean + - name: bool_col + sql: bool_val + type: boolean + + # String + - name: string_col + sql: string_val + type: string + + # Date/Time types + - name: date_col + sql: date_val + type: time + meta: + arrow_type: date32 + + - name: timestamp_col + sql: timestamp_val + type: time + meta: + arrow_type: timestamp + + measures: + - name: count + type: count + + - name: int32_sum + type: sum + sql: int32_val + + - name: float64_avg + type: avg + sql: float64_val diff --git a/examples/recipes/ecto/model/cubes/mandata_captate.yaml b/examples/recipes/ecto/model/cubes/mandata_captate.yaml new file mode 100644 index 0000000000000..60acfc03e613f --- /dev/null +++ b/examples/recipes/ecto/model/cubes/mandata_captate.yaml @@ -0,0 +1,162 @@ +--- +cubes: + - name: mandata_captate + description: Auto-generated from public.order + sql_table: public.order + measures: + - name: count + type: count + - meta: + ecto_field: customer_id + ecto_type: integer + name: customer_id_sum + type: sum + sql: customer_id + - meta: + ecto_field: customer_id + ecto_type: integer + name: customer_id_distinct + type: count_distinct + sql: customer_id + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_sum + type: sum + sql: total_amount + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_distinct + type: count_distinct + sql: total_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_sum + type: sum + sql: tax_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_distinct + type: count_distinct + sql: tax_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_sum + type: sum + sql: subtotal_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_distinct + type: count_distinct + sql: subtotal_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_sum + type: sum + sql: discount_total_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_distinct + type: count_distinct + sql: discount_total_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_sum + type: sum + sql: delivery_subtotal_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_distinct + type: count_distinct + sql: delivery_subtotal_amount + dimensions: + - meta: + ecto_field: market_code + ecto_field_type: string + name: market_code + type: string + sql: market_code + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand_code + type: string + sql: brand_code + - meta: + ecto_field: payment_reference + ecto_field_type: string + name: payment_reference + type: string + sql: payment_reference + - meta: + ecto_field: fulfillment_status + ecto_field_type: string + name: fulfillment_status + type: string + sql: fulfillment_status + - meta: + ecto_field: financial_status + ecto_field_type: string + name: financial_status + type: string + sql: financial_status + - meta: + ecto_field: email + ecto_field_type: string + name: email + type: string + sql: email + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated_at + type: time + sql: updated_at + - meta: + ecto_field: inserted_at + ecto_field_type: naive_datetime + name: inserted_at + type: time + sql: inserted_at + pre_aggregations: + - external: true + name: public_order_automatic_for_the_people + type: rollup + measures: + - count + - customer_id_sum + - customer_id_distinct + - total_amount_sum + - total_amount_distinct + - tax_amount_sum + - tax_amount_distinct + - subtotal_amount_sum + - subtotal_amount_distinct + - discount_total_amount_sum + - discount_total_amount_distinct + - delivery_subtotal_amount_sum + - delivery_subtotal_amount_distinct + dimensions: + - market_code + - brand_code + - payment_reference + - fulfillment_status + - financial_status + - email + refresh_key: + sql: SELECT MAX(id) FROM public.order + time_dimension: updated_at + granularity: hour + build_range_start: + sql: "SELECT NOW() - INTERVAL '1 year'" + build_range_end: + sql: SELECT NOW() diff --git a/examples/recipes/ecto/model/cubes/of_addresses.yaml b/examples/recipes/ecto/model/cubes/of_addresses.yaml new file mode 100644 index 0000000000000..d0eb6b05187b4 --- /dev/null +++ b/examples/recipes/ecto/model/cubes/of_addresses.yaml @@ -0,0 +1,135 @@ +--- +cubes: + - name: of_addresses + description: Auto-generated from address + dimensions: + - meta: + ecto_field: summary + ecto_field_type: string + name: summary + type: string + sql: summary + - meta: + ecto_field: market_code + ecto_field_type: string + name: market_code + type: string + sql: market_code + - meta: + ecto_field: province_code + ecto_field_type: string + name: province_code + type: string + sql: province_code + - meta: + ecto_field: province + ecto_field_type: string + name: province + type: string + sql: province + - meta: + ecto_field: postal_code + ecto_field_type: string + name: postal_code + type: string + sql: postal_code + - meta: + ecto_field: phone + ecto_field_type: string + name: phone + type: string + sql: phone + - meta: + ecto_field: last_name + ecto_field_type: string + name: last_name + type: string + sql: last_name + - meta: + ecto_field: first_name + ecto_field_type: string + name: first_name + type: string + sql: first_name + - meta: + ecto_field: country + ecto_field_type: string + name: country + type: string + sql: country + - meta: + ecto_field: country_code + ecto_field_type: string + name: country_code + type: string + sql: country_code + - meta: + ecto_field: company + ecto_field_type: string + name: company + type: string + sql: company + - meta: + ecto_field: city + ecto_field_type: string + name: city + type: string + sql: city + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand_code + type: string + sql: brand_code + - meta: + ecto_field: address_2 + ecto_field_type: string + name: address_2 + type: string + sql: address_2 + - meta: + ecto_field: address_1 + ecto_field_type: string + name: address_1 + type: string + sql: address_1 + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated_at + type: time + sql: updated_at + - meta: + ecto_field: inserted_at + ecto_field_type: naive_datetime + name: inserted_at + type: time + sql: inserted_at + measures: + - name: count + type: count + - meta: + ecto_field: order_id + ecto_type: id + name: order_id_sum + type: sum + sql: order_id + - meta: + ecto_field: order_id + ecto_type: id + name: order_id_distinct + type: count_distinct + sql: order_id + - meta: + ecto_field: customer_id + ecto_type: id + name: customer_id_sum + type: sum + sql: customer_id + - meta: + ecto_field: customer_id + ecto_type: id + name: customer_id_distinct + type: count_distinct + sql: customer_id + sql_table: address diff --git a/examples/recipes/ecto/model/cubes/of_customers.yaml b/examples/recipes/ecto/model/cubes/of_customers.yaml new file mode 100644 index 0000000000000..0c41049730ee7 --- /dev/null +++ b/examples/recipes/ecto/model/cubes/of_customers.yaml @@ -0,0 +1,123 @@ +--- +cubes: + - name: of_customers + description: of Customers + title: customers cube + dimensions: + - meta: + ecto_fields: + - brand_code + - market_code + - email + name: email_per_brand_per_market + type: string + primary_key: true + sql: brand_code||market_code||email + - meta: + ecto_field: first_name + ecto_field_type: string + name: given_name + type: string + description: good documentation + sql: first_name + - meta: + ecto_fields: + - birthday_day + - birthday_month + name: zodiac + type: string + description: SQL for a zodiac sign for given [:birthday_day, :birthday_month], not _gyroscope_, TODO unicode of Emoji + sql: | + CASE + WHEN (birthday_month = 1 AND birthday_day >= 20) OR (birthday_month = 2 AND birthday_day <= 18) THEN 'Aquarius' + WHEN (birthday_month = 2 AND birthday_day >= 19) OR (birthday_month = 3 AND birthday_day <= 20) THEN 'Pisces' + WHEN (birthday_month = 3 AND birthday_day >= 21) OR (birthday_month = 4 AND birthday_day <= 19) THEN 'Aries' + WHEN (birthday_month = 4 AND birthday_day >= 20) OR (birthday_month = 5 AND birthday_day <= 20) THEN 'Taurus' + WHEN (birthday_month = 5 AND birthday_day >= 21) OR (birthday_month = 6 AND birthday_day <= 20) THEN 'Gemini' + WHEN (birthday_month = 6 AND birthday_day >= 21) OR (birthday_month = 7 AND birthday_day <= 22) THEN 'Cancer' + WHEN (birthday_month = 7 AND birthday_day >= 23) OR (birthday_month = 8 AND birthday_day <= 22) THEN 'Leo' + WHEN (birthday_month = 8 AND birthday_day >= 23) OR (birthday_month = 9 AND birthday_day <= 22) THEN 'Virgo' + WHEN (birthday_month = 9 AND birthday_day >= 23) OR (birthday_month = 10 AND birthday_day <= 22) THEN 'Libra' + WHEN (birthday_month = 10 AND birthday_day >= 23) OR (birthday_month = 11 AND birthday_day <= 21) THEN 'Scorpio' + WHEN (birthday_month = 11 AND birthday_day >= 22) OR (birthday_month = 12 AND birthday_day <= 21) THEN 'Sagittarius' + WHEN (birthday_month = 12 AND birthday_day >= 22) OR (birthday_month = 1 AND birthday_day <= 19) THEN 'Capricorn' + ELSE 'Professor Abe Weissman' + END + - meta: + ecto_fields: + - birthday_day + - birthday_month + name: star_sector + type: number + description: integer from 0 to 11 for zodiac signs + sql: | + CASE + WHEN (birthday_month = 1 AND birthday_day >= 20) OR (birthday_month = 2 AND birthday_day <= 18) THEN 0 + WHEN (birthday_month = 2 AND birthday_day >= 19) OR (birthday_month = 3 AND birthday_day <= 20) THEN 1 + WHEN (birthday_month = 3 AND birthday_day >= 21) OR (birthday_month = 4 AND birthday_day <= 19) THEN 2 + WHEN (birthday_month = 4 AND birthday_day >= 20) OR (birthday_month = 5 AND birthday_day <= 20) THEN 3 + WHEN (birthday_month = 5 AND birthday_day >= 21) OR (birthday_month = 6 AND birthday_day <= 20) THEN 4 + WHEN (birthday_month = 6 AND birthday_day >= 21) OR (birthday_month = 7 AND birthday_day <= 22) THEN 5 + WHEN (birthday_month = 7 AND birthday_day >= 23) OR (birthday_month = 8 AND birthday_day <= 22) THEN 6 + WHEN (birthday_month = 8 AND birthday_day >= 23) OR (birthday_month = 9 AND birthday_day <= 22) THEN 7 + WHEN (birthday_month = 9 AND birthday_day >= 23) OR (birthday_month = 10 AND birthday_day <= 22) THEN 8 + WHEN (birthday_month = 10 AND birthday_day >= 23) OR (birthday_month = 11 AND birthday_day <= 21) THEN 9 + WHEN (birthday_month = 11 AND birthday_day >= 22) OR (birthday_month = 12 AND birthday_day <= 21) THEN 10 + WHEN (birthday_month = 12 AND birthday_day >= 22) OR (birthday_month = 1 AND birthday_day <= 19) THEN 11 + ELSE -1 + END + - meta: + ecto_fields: + - brand_code + - market_code + name: bm_code + type: string + sql: "brand_code|| '_' || market_code" + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand + type: string + description: Beer + sql: brand_code + - meta: + ecto_field: market_code + ecto_field_type: string + name: market + type: string + description: market_code, like AU + sql: market_code + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated + type: time + description: updated_at timestamp + sql: updated_at + - meta: + ecto_field: inserted_at + name: inserted_at + type: time + description: inserted_at + sql: inserted_at + measures: + - name: count + type: count + description: no need for fields for :count type measure + - meta: + ecto_field: email + ecto_type: string + name: emails_distinct + type: count_distinct + description: count distinct of emails + sql: email + - meta: + ecto_field: email + ecto_type: string + name: aquarii + type: count_distinct + description: Filtered by start sector = 0 + filters: + - sql: (birthday_month = 1 AND birthday_day >= 20) OR (birthday_month = 2 AND birthday_day <= 18) + sql: email + sql_table: customer diff --git a/examples/recipes/ecto/model/cubes/orders.yaml b/examples/recipes/ecto/model/cubes/orders.yaml new file mode 100644 index 0000000000000..8061d1c6741c7 --- /dev/null +++ b/examples/recipes/ecto/model/cubes/orders.yaml @@ -0,0 +1,119 @@ +--- +cubes: + - name: orders + description: AG Orders + title: Auto Generated Cube of orders + dimensions: + - meta: + ecto_field: market_code + ecto_field_type: string + name: market_code + type: string + sql: market_code + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand_code + type: string + sql: brand_code + - meta: + ecto_field: payment_reference + ecto_field_type: string + name: payment_reference + type: string + sql: payment_reference + - meta: + ecto_field: email + ecto_field_type: string + name: email + type: string + sql: email + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated_at + type: time + sql: updated_at + - meta: + ecto_field: inserted_at + ecto_field_type: naive_datetime + name: inserted_at + type: time + sql: inserted_at + measures: + - name: count + type: count + - meta: + ecto_field: customer_id + ecto_type: id + name: customer_id_sum + type: sum + sql: customer_id + - meta: + ecto_field: customer_id + ecto_type: id + name: customer_id_distinct + type: count_distinct + sql: customer_id + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_sum + type: sum + sql: total_amount + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_distinct + type: count_distinct + sql: total_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_sum + type: sum + sql: tax_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_distinct + type: count_distinct + sql: tax_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_sum + type: sum + sql: subtotal_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_distinct + type: count_distinct + sql: subtotal_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_sum + type: sum + sql: discount_total_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_distinct + type: count_distinct + sql: discount_total_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_sum + type: sum + sql: delivery_subtotal_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_distinct + type: count_distinct + sql: delivery_subtotal_amount + sql_alias: order_facts + sql_table: order diff --git a/examples/recipes/ecto/model/cubes/orders_no_preagg.yaml b/examples/recipes/ecto/model/cubes/orders_no_preagg.yaml new file mode 100644 index 0000000000000..7797ac4fb2b4e --- /dev/null +++ b/examples/recipes/ecto/model/cubes/orders_no_preagg.yaml @@ -0,0 +1,54 @@ +--- +cubes: + - name: orders_no_preagg + description: Orders cube WITHOUT pre-aggregations for performance comparison + title: Orders (No Pre-Aggregation) + sql_table: public.order + + dimensions: + - name: id + type: number + sql: id + primary_key: true + + + - name: market_code + type: string + sql: market_code + + - name: brand_code + type: string + sql: brand_code + + - name: updated_at + type: time + sql: updated_at + + - name: inserted_at + type: time + sql: inserted_at + + measures: + - name: count + type: count + description: Total number of orders + + - name: total_amount_sum + type: sum + sql: total_amount + description: Sum of total amounts + + - name: tax_amount_sum + type: sum + sql: tax_amount + description: Sum of tax amounts + + - name: subtotal_amount_sum + type: sum + sql: subtotal_amount + description: Sum of subtotal amounts + + - name: customer_id_distinct + type: count_distinct + sql: customer_id + description: Distinct customer count diff --git a/examples/recipes/ecto/model/cubes/orders_with_preagg.yaml b/examples/recipes/ecto/model/cubes/orders_with_preagg.yaml new file mode 100644 index 0000000000000..810cf1f3a347d --- /dev/null +++ b/examples/recipes/ecto/model/cubes/orders_with_preagg.yaml @@ -0,0 +1,166 @@ +--- +cubes: + - name: orders_with_preagg + description: Orders cube WITH pre-aggregations for performance comparison + title: Orders (With Pre-Aggregation) + sql_table: public.order + + measures: + - name: count + type: count + - meta: + ecto_field: customer_id + ecto_type: integer + name: customer_id_sum + type: sum + sql: customer_id + - meta: + ecto_field: customer_id + ecto_type: integer + name: customer_id_distinct + type: count_distinct + sql: customer_id + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_sum + type: sum + sql: total_amount + - meta: + ecto_field: total_amount + ecto_type: integer + name: total_amount_distinct + type: count_distinct + sql: total_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_sum + type: sum + sql: tax_amount + - meta: + ecto_field: tax_amount + ecto_type: integer + name: tax_amount_distinct + type: count_distinct + sql: tax_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_sum + type: sum + sql: subtotal_amount + - meta: + ecto_field: subtotal_amount + ecto_type: integer + name: subtotal_amount_distinct + type: count_distinct + sql: subtotal_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_sum + type: sum + sql: discount_total_amount + - meta: + ecto_field: discount_total_amount + ecto_type: integer + name: discount_total_amount_distinct + type: count_distinct + sql: discount_total_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_sum + type: sum + sql: delivery_subtotal_amount + - meta: + ecto_field: delivery_subtotal_amount + ecto_type: integer + name: delivery_subtotal_amount_distinct + type: count_distinct + sql: delivery_subtotal_amount + dimensions: + - meta: + ecto_field: market_code + ecto_field_type: string + name: market_code + type: string + sql: market_code + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand_code + type: string + sql: brand_code + - meta: + ecto_field: payment_reference + ecto_field_type: string + name: payment_reference + type: string + sql: payment_reference + - meta: + ecto_field: fulfillment_status + ecto_field_type: string + name: fulfillment_status + type: string + sql: fulfillment_status + - meta: + ecto_field: financial_status + ecto_field_type: string + name: financial_status + type: string + sql: financial_status + - meta: + ecto_field: email + ecto_field_type: string + name: email + type: string + sql: email + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated_at + type: time + sql: updated_at + - meta: + ecto_field: inserted_at + ecto_field_type: naive_datetime + name: inserted_at + type: time + sql: inserted_at + + # Pre-aggregations for performance testing + pre_aggregations: + - external: true + name: public_order_automatic_for_the_people + type: rollup + measures: + - count + - customer_id_sum + - customer_id_distinct + - total_amount_sum + - total_amount_distinct + - tax_amount_sum + - tax_amount_distinct + - subtotal_amount_sum + - subtotal_amount_distinct + - discount_total_amount_sum + - discount_total_amount_distinct + - delivery_subtotal_amount_sum + - delivery_subtotal_amount_distinct + dimensions: + - market_code + - brand_code + - payment_reference + - fulfillment_status + - financial_status + - email + time_dimension: updated_at + granularity: hour + refresh_key: + sql: SELECT MAX(id) FROM public.order + build_range_start: + sql: SELECT min(inserted_at) FROM public.order # "SELECT NOW() - INTERVAL '1 year'" + build_range_end: + sql: SELECT MAX(updated_at) FROM public.order diff --git a/examples/recipes/ecto/model/cubes/power_customers.yaml b/examples/recipes/ecto/model/cubes/power_customers.yaml new file mode 100644 index 0000000000000..5745c78f51bfb --- /dev/null +++ b/examples/recipes/ecto/model/cubes/power_customers.yaml @@ -0,0 +1,92 @@ +--- +cubes: + - name: power_customers + description: of Customers + title: customers cube + dimensions: + - meta: + ecto_field: first_name + ecto_field_type: string + name: given_name + type: string + description: good documentation + sql: first_name + - meta: + ecto_field: brand_code + ecto_field_type: string + name: brand + type: string + description: Beer + sql: brand_code + - meta: + ecto_field: market_code + ecto_field_type: string + name: market + type: string + description: market_code, like AU + sql: market_code + - meta: + ecto_fields: + - birthday_day + - birthday_month + name: zodiac + type: string + description: SQL for a zodiac sign + sql: | + CASE + WHEN (birthday_month = 1 AND birthday_day >= 20) OR (birthday_month = 2 AND birthday_day <= 18) THEN 'Aquarius' + WHEN (birthday_month = 2 AND birthday_day >= 19) OR (birthday_month = 3 AND birthday_day <= 20) THEN 'Pisces' + WHEN (birthday_month = 3 AND birthday_day >= 21) OR (birthday_month = 4 AND birthday_day <= 19) THEN 'Aries' + WHEN (birthday_month = 4 AND birthday_day >= 20) OR (birthday_month = 5 AND birthday_day <= 20) THEN 'Taurus' + WHEN (birthday_month = 5 AND birthday_day >= 21) OR (birthday_month = 6 AND birthday_day <= 20) THEN 'Gemini' + WHEN (birthday_month = 6 AND birthday_day >= 21) OR (birthday_month = 7 AND birthday_day <= 22) THEN 'Cancer' + WHEN (birthday_month = 7 AND birthday_day >= 23) OR (birthday_month = 8 AND birthday_day <= 22) THEN 'Leo' + WHEN (birthday_month = 8 AND birthday_day >= 23) OR (birthday_month = 9 AND birthday_day <= 22) THEN 'Virgo' + WHEN (birthday_month = 9 AND birthday_day >= 23) OR (birthday_month = 10 AND birthday_day <= 22) THEN 'Libra' + WHEN (birthday_month = 10 AND birthday_day >= 23) OR (birthday_month = 11 AND birthday_day <= 21) THEN 'Scorpio' + WHEN (birthday_month = 11 AND birthday_day >= 22) OR (birthday_month = 12 AND birthday_day <= 21) THEN 'Sagittarius' + WHEN (birthday_month = 12 AND birthday_day >= 22) OR (birthday_month = 1 AND birthday_day <= 19) THEN 'Capricorn' + ELSE 'Professor Abe Weissman' + END + - meta: + ecto_fields: + - birthday_day + - birthday_month + name: star_sector + type: number + description: integer from 0 to 11 for zodiac signs + sql: | + CASE + WHEN (birthday_month = 1 AND birthday_day >= 20) OR (birthday_month = 2 AND birthday_day <= 18) THEN 0 + WHEN (birthday_month = 2 AND birthday_day >= 19) OR (birthday_month = 3 AND birthday_day <= 20) THEN 1 + WHEN (birthday_month = 3 AND birthday_day >= 21) OR (birthday_month = 4 AND birthday_day <= 19) THEN 2 + WHEN (birthday_month = 4 AND birthday_day >= 20) OR (birthday_month = 5 AND birthday_day <= 20) THEN 3 + WHEN (birthday_month = 5 AND birthday_day >= 21) OR (birthday_month = 6 AND birthday_day <= 20) THEN 4 + WHEN (birthday_month = 6 AND birthday_day >= 21) OR (birthday_month = 7 AND birthday_day <= 22) THEN 5 + WHEN (birthday_month = 7 AND birthday_day >= 23) OR (birthday_month = 8 AND birthday_day <= 22) THEN 6 + WHEN (birthday_month = 8 AND birthday_day >= 23) OR (birthday_month = 9 AND birthday_day <= 22) THEN 7 + WHEN (birthday_month = 9 AND birthday_day >= 23) OR (birthday_month = 10 AND birthday_day <= 22) THEN 8 + WHEN (birthday_month = 10 AND birthday_day >= 23) OR (birthday_month = 11 AND birthday_day <= 21) THEN 9 + WHEN (birthday_month = 11 AND birthday_day >= 22) OR (birthday_month = 12 AND birthday_day <= 21) THEN 10 + WHEN (birthday_month = 12 AND birthday_day >= 22) OR (birthday_month = 1 AND birthday_day <= 19) THEN 11 + ELSE -1 + END + - meta: + ecto_fields: + - brand_code + - market_code + name: bm_code + type: string + sql: "brand_code|| '_' || market_code" + - meta: + ecto_field: updated_at + ecto_field_type: naive_datetime + name: updated + type: time + description: updated_at timestamp + sql: updated_at + measures: + - name: count + type: count + description: no need for fields for :count type measure + sql_table: customer diff --git a/examples/recipes/ecto/package.json b/examples/recipes/ecto/package.json new file mode 100644 index 0000000000000..43da4324e2080 --- /dev/null +++ b/examples/recipes/ecto/package.json @@ -0,0 +1,12 @@ +{ + "name": "ecto-adbc-postgres", + "private": true, + "scripts": { + "dev": "../../../node_modules/.bin/cubejs-server", + "build": "../../../node_modules/.bin/cubejs build" + }, + "devDependencies": { + "@cubejs-backend/server": "*", + "@cubejs-backend/postgres-driver": "*" + } +} diff --git a/examples/recipes/ecto/rebuild-after-rebase.sh b/examples/recipes/ecto/rebuild-after-rebase.sh new file mode 100755 index 0000000000000..cf53121e4170c --- /dev/null +++ b/examples/recipes/ecto/rebuild-after-rebase.sh @@ -0,0 +1,322 @@ +#!/bin/bash +# Rebuild Cube.js and CubeSQL after git rebase +# This script rebuilds all necessary components for the arrow-ipc recipe + +set -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Rebuild After Rebase${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" +echo "This script will rebuild:" +echo " 1. Cube.js packages (TypeScript)" +echo " 2. CubeSQL binary (Rust)" +echo "" + +# Ask about deep clean +echo -e "${YELLOW}Do you want to perform a deep clean first?${NC}" +echo "This will remove all caches, build artifacts, and node_modules." +echo "Choose this after major rebases or when experiencing build issues." +echo "" +echo "Options:" +echo " 1) Quick rebuild (incremental, fastest)" +echo " 2) Deep clean + full rebuild (removes everything, slowest but safest)" +echo "" +read -p "Choose option (1/2) [default: 1]: " -n 1 -r +echo "" +echo "" + +DEEP_CLEAN=false +if [[ $REPLY == "2" ]]; then + DEEP_CLEAN=true + echo -e "${RED}⚠️ DEEP CLEAN MODE ENABLED${NC}" + echo "This will remove:" + echo " - All node_modules directories" + echo " - All Rust target directories" + echo " - All TypeScript build artifacts" + echo " - Recipe binaries and caches" + echo "" + read -p "Are you sure? This will take 5-10 minutes to rebuild. (y/n): " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Cancelled. Running quick rebuild instead..." + DEEP_CLEAN=false + fi + echo "" +fi + +# Function to check if a command succeeded +check_status() { + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ $1${NC}" + else + echo -e "${RED}✗ $1 failed${NC}" + exit 1 + fi +} + +# Deep clean if requested +if [ "$DEEP_CLEAN" = true ]; then + echo -e "${BLUE}======================================${NC}" + echo -e "${BLUE}Deep Clean Phase${NC}" + echo -e "${BLUE}======================================${NC}" + echo "" + + # Clean recipe directory + echo -e "${GREEN}Cleaning recipe directory...${NC}" + cd "$SCRIPT_DIR" + rm -rf node_modules yarn.lock bin .cubestore *.log *.pid + check_status "Recipe directory cleaned" + + # Clean Cube.js build artifacts + echo "" + echo -e "${GREEN}Cleaning Cube.js build artifacts...${NC}" + cd "$CUBE_ROOT" + + # Use yarn clean if available + if grep -q '"clean"' package.json; then + yarn clean + check_status "Cube.js build artifacts cleaned" + else + echo -e "${YELLOW}No clean script found, manually cleaning dist directories${NC}" + find packages -type d -name "dist" -exec rm -rf {} + 2>/dev/null || true + find packages -type d -name "lib" -exec rm -rf {} + 2>/dev/null || true + find packages -type f -name "tsconfig.tsbuildinfo" -delete 2>/dev/null || true + check_status "Manual cleanup complete" + fi + + # Clean node_modules (this is the slowest part) + echo "" + echo -e "${GREEN}Removing node_modules...${NC}" + echo -e "${YELLOW}This may take 1-2 minutes...${NC}" + cd "$CUBE_ROOT" + rm -rf node_modules + check_status "node_modules removed" + + # Clean Rust target directories + echo "" + echo -e "${GREEN}Cleaning Rust build artifacts...${NC}" + cd "$CUBE_ROOT/rust/cubesql" + if [ -d "target" ]; then + rm -rf target + check_status "CubeSQL target directory removed" + else + echo -e "${YELLOW}CubeSQL target directory not found, skipping${NC}" + fi + + # Clean other Rust crates if they exist + for rust_dir in "$CUBE_ROOT/rust"/*; do + if [ -d "$rust_dir/target" ]; then + echo -e "${YELLOW}Cleaning $(basename $rust_dir)/target${NC}" + rm -rf "$rust_dir/target" + fi + done + + if [ -d "$CUBE_ROOT/packages/cubejs-backend-native/target" ]; then + echo -e "${YELLOW}Cleaning cubejs-backend-native/target${NC}" + rm -rf "$CUBE_ROOT/packages/cubejs-backend-native/target" + fi + + check_status "All Rust artifacts cleaned" + + echo "" + echo -e "${GREEN}✓ Deep clean complete!${NC}" + echo "" + echo -e "${BLUE}======================================${NC}" + echo -e "${BLUE}Rebuild Phase${NC}" + echo -e "${BLUE}======================================${NC}" + echo "" +fi + +# Step 1: Install root dependencies (skip post-install scripts first) +echo -e "${GREEN}Step 1: Installing root dependencies...${NC}" +cd "$CUBE_ROOT" + +# If deep clean was done, need to install without post-install scripts first +# because post-install scripts depend on built packages +if [ "$DEEP_CLEAN" = true ]; then + echo -e "${YELLOW}Installing without post-install scripts (packages not built yet)...${NC}" + yarn install --ignore-scripts + check_status "Dependencies installed (scripts skipped)" +else + yarn install + check_status "Root dependencies installed" +fi + +# Step 2: Build all packages (TypeScript + client bundles) +echo "" +echo -e "${GREEN}Step 2: Building TypeScript packages...${NC}" +echo -e "${YELLOW}This may take 30-40 seconds...${NC}" +cd "$CUBE_ROOT" + +# Use yarn tsc which runs "tsc --build" for proper TypeScript project references +yarn tsc +check_status "TypeScript packages built" + +echo "" +echo -e "${GREEN}Step 2b: Building client bundles...${NC}" +cd "$CUBE_ROOT" +yarn build +check_status "Client bundles built" + +# Step 2c: Generate oclif manifest for cubejs-server +echo "" +echo -e "${GREEN}Step 2c: Generating oclif manifest...${NC}" +cd "$CUBE_ROOT/packages/cubejs-server" +OCLIF_TS_NODE=0 yarn run oclif-dev manifest +check_status "Oclif manifest generated" +cd "$CUBE_ROOT" + +# Step 2.5: Re-run install with post-install scripts if they were skipped +if [ "$DEEP_CLEAN" = true ]; then + echo "" + echo -e "${GREEN}Step 2.5: Running post-install scripts...${NC}" + echo -e "${YELLOW}(Optional module failures can be safely ignored)${NC}" + cd "$CUBE_ROOT" + # Allow post-install to fail on optional modules + yarn install || true + echo -e "${GREEN}✓ Install completed (some optional modules may have failed)${NC}" +fi + +# Step 3: Verify workspace setup +echo "" +echo -e "${GREEN}Step 3: Verifying workspace setup...${NC}" +cd "$SCRIPT_DIR" + +# Remove local yarn.lock if it exists (should use root workspace) +if [ -f "yarn.lock" ]; then + echo -e "${YELLOW}Removing local yarn.lock (using root workspace instead)${NC}" + rm yarn.lock +fi + +# Remove local node_modules if it exists (should use root workspace) +if [ -d "node_modules" ]; then + echo -e "${YELLOW}Removing local node_modules (using root workspace instead)${NC}" + rm -rf node_modules +fi + +echo -e "${GREEN}✓ Recipe will use root workspace dependencies${NC}" + +# Step 4: Build CubeSQL (optional - ask user, or automatic after deep clean) +echo "" +echo -e "${YELLOW}Step 4: Build CubeSQL?${NC}" + +# Automatic build after deep clean (since we removed target directory) +BUILD_CUBESQL=false +if [ "$DEEP_CLEAN" = true ]; then + echo -e "${YELLOW}Deep clean was performed, CubeSQL must be rebuilt.${NC}" + BUILD_CUBESQL=true +else + echo "Building CubeSQL (Rust) takes 5-10 minutes." + read -p "Build CubeSQL now? (y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + BUILD_CUBESQL=true + fi +fi + +if [ "$BUILD_CUBESQL" = true ]; then + echo -e "${GREEN}Building CubeSQL...${NC}" + cd "$CUBE_ROOT/rust/cubesql" + + # Check if we should do release or debug build + if [ "$DEEP_CLEAN" = true ]; then + # Default to release build after deep clean + echo -e "${YELLOW}Deep clean mode: building release version (recommended)${NC}" + echo "This will take 5-10 minutes..." + cargo build --release --bin cubesqld + check_status "CubeSQL built (release)" + CUBESQLD_BIN="$CUBE_ROOT/rust/cubesql/target/release/cubesqld" + else + echo -e "${YELLOW}Build type:${NC}" + echo " 1) Debug (faster build, slower runtime)" + echo " 2) Release (slower build, faster runtime)" + read -p "Choose build type (1/2): " -n 1 -r + echo + + if [[ $REPLY == "2" ]]; then + cargo build --release --bin cubesqld + check_status "CubeSQL built (release)" + CUBESQLD_BIN="$CUBE_ROOT/rust/cubesql/target/release/cubesqld" + else + cargo build --bin cubesqld + check_status "CubeSQL built (debug)" + CUBESQLD_BIN="$CUBE_ROOT/rust/cubesql/target/debug/cubesqld" + fi + fi + + # Copy to recipe bin directory + mkdir -p "$SCRIPT_DIR/bin" + cp "$CUBESQLD_BIN" "$SCRIPT_DIR/bin/" + chmod +x "$SCRIPT_DIR/bin/cubesqld" + echo -e "${GREEN}✓ CubeSQL binary copied to recipe/bin/${NC}" +else + echo -e "${YELLOW}Skipping CubeSQL build${NC}" + echo "You can build it later with:" + echo " cd $CUBE_ROOT/rust/cubesql" + echo " cargo build --release --bin cubesqld" +fi + +# Step 5: Verify the build +echo "" +echo -e "${GREEN}Step 5: Verifying build...${NC}" + +# Check if cubejs-server-core dist exists +if [ -d "$CUBE_ROOT/packages/cubejs-server-core/dist" ]; then + echo -e "${GREEN}✓ Cube.js server-core dist found${NC}" +else + echo -e "${RED}✗ Cube.js server-core dist not found${NC}" + exit 1 +fi + +# Check if cubesqld exists +if [ -f "$SCRIPT_DIR/bin/cubesqld" ]; then + echo -e "${GREEN}✓ CubeSQL binary found in recipe/bin/${NC}" +elif [ -f "$CUBE_ROOT/rust/cubesql/target/release/cubesqld" ]; then + echo -e "${YELLOW}⚠ CubeSQL binary found in target/release/ but not copied to recipe/bin/${NC}" +elif [ -f "$CUBE_ROOT/rust/cubesql/target/debug/cubesqld" ]; then + echo -e "${YELLOW}⚠ CubeSQL binary found in target/debug/ but not copied to recipe/bin/${NC}" +else + echo -e "${YELLOW}⚠ CubeSQL binary not found (you can build it later)${NC}" +fi + +# Done! +echo "" +echo -e "${BLUE}======================================${NC}" +echo -e "${GREEN}Rebuild Complete!${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +# Show what was done +if [ "$DEEP_CLEAN" = true ]; then + echo -e "${GREEN}✓ Deep clean performed${NC}" + echo " - Removed all caches and build artifacts" + echo " - Fresh install of all dependencies" + echo " - Complete rebuild of all packages" + echo "" +fi + +echo "You can now start the services:" +echo "" +echo -e "${YELLOW}Start Cube.js API server:${NC}" +echo " cd $SCRIPT_DIR" +echo " ./start-cube-api.sh" +echo "" +echo -e "${YELLOW}Start CubeSQL server:${NC}" +echo " cd $SCRIPT_DIR" +echo " ./start-cubesqld.sh" +echo "" +echo -e "${YELLOW}Or start everything:${NC}" +echo " cd $SCRIPT_DIR" +echo " ./dev-start.sh" +echo "" diff --git a/examples/recipes/ecto/start-cube-api.sh b/examples/recipes/ecto/start-cube-api.sh new file mode 100755 index 0000000000000..6e1e5fb699b5a --- /dev/null +++ b/examples/recipes/ecto/start-cube-api.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# Start only the Cube.js API server (without Arrow/PostgreSQL protocols) +# This allows cubesqld to handle the protocols instead + +set -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "$SCRIPT_DIR" + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Cube.js API Server (Standalone)${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +# Check if .env exists +if [ ! -f ".env" ]; then + echo -e "${RED}Error: .env file not found${NC}" + echo "Please create .env file based on .env.example" + exit 1 +fi + +# Source environment - but override protocol ports to disable them +source .env + +# Override to disable built-in protocol servers +# (cubesqld will provide these instead) +unset CUBEJS_PG_SQL_PORT +export CUBEJS_PG_SQL_PORT="9432" +#export CUBEJS_ADBC_PORT="8120" +#export CUBEJS_SQL_PORT="4445" + +export PORT=${PORT:-4008} + +export CUBEJS_DB_TYPE=${CUBEJS_DB_TYPE:-postgres} +export CUBEJS_DB_PORT=${CUBEJS_DB_PORT:-8432} +export CUBEJS_DB_NAME=${CUBEJS_DB_NAME:-pot_examples_dev} +export CUBEJS_DB_USER=${CUBEJS_DB_USER:-postgres} +export CUBEJS_DB_PASS=${CUBEJS_DB_PASS:-postgres} +export CUBEJS_DB_HOST=${CUBEJS_DB_HOST:-localhost} +export CUBEJS_DEV_MODE=${CUBEJS_DEV_MODE:-true} +export CUBEJS_LOG_LEVEL=${CUBEJS_LOG_LEVEL:-trace} +export CUBESTORE_LOG_LEVEL=${CUBEJS_LOG_LEVEL:-trace} +export NODE_ENV=${NODE_ENV:-development} + +# Function to check if a port is in use +check_port() { + local port=$1 + if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1 ; then + return 0 # Port is in use + else + return 1 # Port is free + fi +} + +# Check PostgreSQL +echo -e "${GREEN}Checking PostgreSQL database...${NC}" +if check_port ${CUBEJS_DB_PORT}; then + echo -e "${YELLOW}PostgreSQL is running on port ${CUBEJS_DB_PORT}${NC}" +else + echo -e "${YELLOW}PostgreSQL is NOT running on port ${CUBEJS_DB_PORT}${NC}" + echo "Starting PostgreSQL with docker-compose..." + docker-compose up -d postgres + sleep 3 +fi + +# Check if API is already running +echo "" +echo -e "${GREEN}Starting Cube.js API server...${NC}" +if check_port ${PORT}; then + echo -e "${YELLOW}Cube.js API already running on port ${PORT}${NC}" + echo "Kill it first with: kill \$(lsof -ti:${PORT})" + exit 1 +fi + +echo "" +echo -e "${BLUE}Configuration:${NC}" +echo -e " API Port: ${PORT}" +echo -e " API URL: http://localhost:${PORT}/cubejs-api" +echo -e " Database: ${CUBEJS_DB_TYPE} at ${CUBEJS_DB_HOST}:${CUBEJS_DB_PORT}" +echo -e " Database Name: ${CUBEJS_DB_NAME}" +echo -e " Log Level: ${CUBEJS_LOG_LEVEL}" +echo "" +echo -e "${YELLOW}Note: PostgreSQL and ADBC(Arrow Native) protocols are DISABLED${NC}" +echo -e "${YELLOW} Use cubesqld for those (see start-cubesqld.sh)${NC}" +echo "" +echo -e "${YELLOW}Logs will be written to: $SCRIPT_DIR/cube-api.log${NC}" +echo -e "${YELLOW}Press Ctrl+C to stop${NC}" +echo "" + +# Cleanup function +cleanup() { + echo "" + echo -e "${YELLOW}Shutting down Cube.js API...${NC}" + echo -e "${GREEN}Cleanup complete${NC}" +} + +trap cleanup EXIT + +# Run Cube.js API server +env | grep CUBE | sort +exec yarn dev 2>&1 | tee cube-api.log diff --git a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/cross_join_to_left_join.rs b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/cross_join_to_left_join.rs new file mode 100644 index 0000000000000..aaa7847e37dcf --- /dev/null +++ b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/cross_join_to_left_join.rs @@ -0,0 +1,287 @@ +use std::sync::Arc; + +use datafusion::{ + error::Result, + logical_plan::{ + plan::{CrossJoin, Filter, Join, JoinConstraint, TableScan}, + Column, Expr, JoinType, LogicalPlan, Operator, + }, + optimizer::optimizer::{OptimizerConfig, OptimizerRule}, +}; + +/// CrossJoinToLeftJoin optimizer rule converts Filter(CrossJoin) patterns +/// back to LeftJoin when appropriate. +/// +/// DataFusion converts LEFT JOIN with complex ON conditions (containing OR) +/// to Filter(CrossJoin), which loses the LEFT JOIN semantics. This optimizer +/// detects specific patterns (especially for pg_catalog queries) and converts +/// them back to proper LEFT JOINs. +pub struct CrossJoinToLeftJoin; + +impl CrossJoinToLeftJoin { + pub fn new() -> Self { + Self + } +} + +impl OptimizerRule for CrossJoinToLeftJoin { + fn optimize( + &self, + plan: &LogicalPlan, + optimizer_config: &OptimizerConfig, + ) -> Result { + cross_join_to_left_join(plan, optimizer_config) + } + + fn name(&self) -> &str { + "__cube__cross_join_to_left_join" + } +} + +fn cross_join_to_left_join( + plan: &LogicalPlan, + optimizer_config: &OptimizerConfig, +) -> Result { + match plan { + LogicalPlan::Filter(Filter { predicate, input }) => { + if let LogicalPlan::CrossJoin(CrossJoin { + left, + right, + schema: _, + }) = input.as_ref() + { + // Check if this is a pg_catalog join that should be LEFT JOIN + if should_convert_to_left_join(left, right, predicate) { + // Extract join columns from the predicate + if let Some((left_cols, right_cols)) = + extract_join_columns(predicate, left, right) + { + let left = Arc::new(cross_join_to_left_join(left, optimizer_config)?); + let right = Arc::new(cross_join_to_left_join(right, optimizer_config)?); + + // Build the ON clause as pairs of columns + let on: Vec<(Column, Column)> = + left_cols.into_iter().zip(right_cols).collect(); + + if on.is_empty() { + // Can't convert without join columns - keep as cross join with filter + let cross_join = LogicalPlan::CrossJoin(CrossJoin { + left, + right, + schema: input.schema().clone(), + }); + return Ok(LogicalPlan::Filter(Filter { + predicate: predicate.clone(), + input: Arc::new(cross_join), + })); + } + + // Create a LEFT JOIN + let join_schema = datafusion::logical_plan::build_join_schema( + left.schema(), + right.schema(), + &JoinType::Left, + )?; + + return Ok(LogicalPlan::Join(Join { + left, + right, + on, + join_type: JoinType::Left, + join_constraint: JoinConstraint::On, + schema: Arc::new(join_schema), + null_equals_null: false, + })); + } + } + } + + // Recurse into the input + let input = cross_join_to_left_join(input, optimizer_config)?; + Ok(LogicalPlan::Filter(Filter { + predicate: predicate.clone(), + input: Arc::new(input), + })) + } + + // Recurse into other plan nodes + LogicalPlan::Projection(proj) => { + let input = cross_join_to_left_join(&proj.input, optimizer_config)?; + Ok(LogicalPlan::Projection( + datafusion::logical_plan::plan::Projection { + expr: proj.expr.clone(), + input: Arc::new(input), + schema: proj.schema.clone(), + alias: proj.alias.clone(), + }, + )) + } + + LogicalPlan::CrossJoin(CrossJoin { + left, + right, + schema, + }) => { + let left = Arc::new(cross_join_to_left_join(left, optimizer_config)?); + let right = Arc::new(cross_join_to_left_join(right, optimizer_config)?); + Ok(LogicalPlan::CrossJoin(CrossJoin { + left, + right, + schema: schema.clone(), + })) + } + + LogicalPlan::Join(join) => { + let left = Arc::new(cross_join_to_left_join(&join.left, optimizer_config)?); + let right = Arc::new(cross_join_to_left_join(&join.right, optimizer_config)?); + Ok(LogicalPlan::Join(Join { + left, + right, + on: join.on.clone(), + join_type: join.join_type, + join_constraint: join.join_constraint, + schema: join.schema.clone(), + null_equals_null: join.null_equals_null, + })) + } + + // For other nodes, just clone them + other => Ok(other.clone()), + } +} + +/// Check if this CrossJoin should be converted to a LEFT JOIN. +/// We specifically target pg_catalog queries where we know the original +/// intent was a LEFT JOIN. +fn should_convert_to_left_join(left: &LogicalPlan, right: &LogicalPlan, _predicate: &Expr) -> bool { + // Check if either side is a pg_catalog table scan + let left_is_pg_catalog = is_pg_catalog_scan(left); + let right_is_pg_catalog = is_pg_catalog_scan(right); + + // Convert to LEFT JOIN if both sides are pg_catalog tables + // This is a conservative heuristic - we only convert known-safe cases + left_is_pg_catalog && right_is_pg_catalog +} + +/// Check if the plan involves pg_catalog tables. +/// We identify pg_catalog tables by checking if their schema contains +/// characteristic column names. +fn is_pg_catalog_scan(plan: &LogicalPlan) -> bool { + match plan { + LogicalPlan::TableScan(TableScan { + projected_schema, .. + }) => is_pg_catalog_schema(projected_schema), + LogicalPlan::Projection(proj) => is_pg_catalog_scan(&proj.input), + LogicalPlan::Filter(filter) => is_pg_catalog_scan(&filter.input), + LogicalPlan::Join(join) => { + // For joins, check if either side involves pg_catalog tables + is_pg_catalog_scan(&join.left) || is_pg_catalog_scan(&join.right) + } + LogicalPlan::CrossJoin(cross) => { + is_pg_catalog_scan(&cross.left) || is_pg_catalog_scan(&cross.right) + } + _ => false, + } +} + +/// Check if a schema has characteristic pg_catalog column names +fn is_pg_catalog_schema(schema: &datafusion::logical_plan::DFSchemaRef) -> bool { + let field_names: Vec<&str> = schema.fields().iter().map(|f| f.name().as_str()).collect(); + + // pg_type has columns like: oid, typname, typnamespace, typowner, etc. + let is_pg_type = field_names.contains(&"oid") + && field_names.contains(&"typname") + && field_names.contains(&"typnamespace"); + + // pg_range has columns like: rngtypid, rngsubtype, rngmultitypid + let is_pg_range = field_names.contains(&"rngtypid") && field_names.contains(&"rngsubtype"); + + // pg_namespace has columns like: oid, nspname + let is_pg_namespace = field_names.contains(&"oid") && field_names.contains(&"nspname"); + + // pg_class has columns like: oid, relname, relnamespace + let is_pg_class = field_names.contains(&"oid") + && field_names.contains(&"relname") + && field_names.contains(&"relnamespace"); + + is_pg_type || is_pg_range || is_pg_namespace || is_pg_class +} + +/// Extract join columns from a predicate. +/// Returns (left_columns, right_columns) if the predicate contains equi-join conditions. +fn extract_join_columns( + predicate: &Expr, + left: &LogicalPlan, + right: &LogicalPlan, +) -> Option<(Vec, Vec)> { + let left_schema = left.schema(); + let right_schema = right.schema(); + + let mut left_cols = Vec::new(); + let mut right_cols = Vec::new(); + + // Collect all equi-join conditions from the predicate + collect_equi_conditions( + predicate, + left_schema, + right_schema, + &mut left_cols, + &mut right_cols, + ); + + if left_cols.is_empty() { + None + } else { + Some((left_cols, right_cols)) + } +} + +/// Recursively collect equi-join conditions from a predicate +fn collect_equi_conditions( + predicate: &Expr, + left_schema: &datafusion::logical_plan::DFSchemaRef, + right_schema: &datafusion::logical_plan::DFSchemaRef, + left_cols: &mut Vec, + right_cols: &mut Vec, +) { + match predicate { + Expr::BinaryExpr { left, op, right } => { + match op { + Operator::Eq => { + // Check if this is a column = column condition + if let (Expr::Column(left_col), Expr::Column(right_col)) = + (left.as_ref(), right.as_ref()) + { + // Determine which column belongs to which side + let left_in_left = left_schema.field_from_column(left_col).is_ok(); + let right_in_right = right_schema.field_from_column(right_col).is_ok(); + + if left_in_left && right_in_right { + left_cols.push(left_col.clone()); + right_cols.push(right_col.clone()); + } else if right_schema.field_from_column(left_col).is_ok() + && left_schema.field_from_column(right_col).is_ok() + { + // Columns are swapped + left_cols.push(right_col.clone()); + right_cols.push(left_col.clone()); + } + } + } + Operator::Or | Operator::And => { + // Recurse into OR/AND conditions + collect_equi_conditions(left, left_schema, right_schema, left_cols, right_cols); + collect_equi_conditions( + right, + left_schema, + right_schema, + left_cols, + right_cols, + ); + } + _ => {} + } + } + _ => {} + } +} diff --git a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/mod.rs b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/mod.rs index d480a5b291407..30b8c0529bf6c 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/mod.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/mod.rs @@ -1,11 +1,13 @@ pub mod utils; +mod cross_join_to_left_join; mod filter_push_down; mod filter_split_meta; mod limit_push_down; mod plan_normalize; mod sort_push_down; +pub use cross_join_to_left_join::CrossJoinToLeftJoin; pub use filter_push_down::FilterPushDown; pub use filter_split_meta::FilterSplitMeta; pub use limit_push_down::LimitPushDown; diff --git a/rust/cubesql/cubesql/src/compile/engine/information_schema/postgres/pg_type.rs b/rust/cubesql/cubesql/src/compile/engine/information_schema/postgres/pg_type.rs index 445064ef28804..1e2fb104e517a 100644 --- a/rust/cubesql/cubesql/src/compile/engine/information_schema/postgres/pg_type.rs +++ b/rust/cubesql/cubesql/src/compile/engine/information_schema/postgres/pg_type.rs @@ -40,10 +40,8 @@ struct PgCatalogTypeBuilder { typelem: UInt32Builder, typarray: UInt32Builder, typinput: StringBuilder, - // TODO: Check typoutput: StringBuilder, - // In real tables, it's an additional type, but in pg_proc it's an oid - typreceive: UInt32Builder, + typreceive: StringBuilder, typsend: StringBuilder, typmodin: StringBuilder, typmodout: StringBuilder, @@ -82,10 +80,8 @@ impl PgCatalogTypeBuilder { typsubscript: StringBuilder::new(capacity), typelem: UInt32Builder::new(capacity), typarray: UInt32Builder::new(capacity), - // In real tables, it's an additional type, but in pg_proc it's an oid - typreceive: UInt32Builder::new(capacity), + typreceive: StringBuilder::new(capacity), typinput: StringBuilder::new(capacity), - // TODO: Check typoutput: StringBuilder::new(capacity), typsend: StringBuilder::new(capacity), typmodin: StringBuilder::new(capacity), @@ -121,11 +117,10 @@ impl PgCatalogTypeBuilder { self.typsubscript.append_value(typ.typsubscript).unwrap(); self.typelem.append_value(typ.typelem).unwrap(); self.typarray.append_value(typ.typarray).unwrap(); - self.typreceive.append_value(typ.typreceive_oid).unwrap(); + self.typreceive.append_value(typ.typreceive).unwrap(); self.typinput.append_value(typ.get_typinput()).unwrap(); - // TODO: Check - self.typoutput.append_null().unwrap(); - self.typsend.append_null().unwrap(); + self.typoutput.append_value(typ.get_typoutput()).unwrap(); + self.typsend.append_value(typ.get_typsend()).unwrap(); self.typmodin.append_null().unwrap(); self.typmodout.append_null().unwrap(); self.typanalyze.append_null().unwrap(); @@ -212,14 +207,13 @@ impl PgCatalogTypeProvider { typsubscript: "-", typelem: 0, typarray: table.array_handler_oid, - // TODO Verify typalign: "i", typstorage: "x", typbasetype: 0, - // TODO Verify - typreceive: "", - // TODO: Get from pg_proc + typreceive: "record_recv", typreceive_oid: 0, + typsend: "record_send", + typoutput: "record_out", }); builder.add_type(&PgType { @@ -238,14 +232,13 @@ impl PgCatalogTypeProvider { typsubscript: "array_subscript_handler", typelem: table.record_oid, typarray: 0, - // TODO Verify typalign: "d", typstorage: "x", typbasetype: 0, - // TODO Verify - typreceive: "", - // TODO: Get from pg_proc + typreceive: "array_recv", typreceive_oid: 0, + typsend: "array_send", + typoutput: "array_out", }); } @@ -283,11 +276,9 @@ impl TableProvider for PgCatalogTypeProvider { Field::new("typelem", DataType::UInt32, true), Field::new("typarray", DataType::UInt32, true), Field::new("typinput", DataType::Utf8, false), - // TODO: Check - Field::new("typoutput", DataType::Utf8, true), - // In real tables, it's an additional type, but in pg_proc it's an oid - Field::new("typreceive", DataType::UInt32, true), - Field::new("typsend", DataType::Utf8, true), + Field::new("typoutput", DataType::Utf8, false), + Field::new("typreceive", DataType::Utf8, false), + Field::new("typsend", DataType::Utf8, false), Field::new("typmodin", DataType::Utf8, true), Field::new("typmodout", DataType::Utf8, true), Field::new("typanalyze", DataType::Utf8, true), diff --git a/rust/cubesql/cubesql/src/compile/query_engine.rs b/rust/cubesql/cubesql/src/compile/query_engine.rs index 9441dc8dcde0d..8a935671b10aa 100644 --- a/rust/cubesql/cubesql/src/compile/query_engine.rs +++ b/rust/cubesql/cubesql/src/compile/query_engine.rs @@ -8,7 +8,8 @@ use crate::{ engine::{ df::{ optimizers::{ - FilterPushDown, FilterSplitMeta, LimitPushDown, PlanNormalize, SortPushDown, + CrossJoinToLeftJoin, FilterPushDown, FilterSplitMeta, LimitPushDown, + PlanNormalize, SortPushDown, }, planner::CubeQueryPlanner, scan::CubeScanNode, @@ -147,6 +148,8 @@ pub trait QueryEngine { let optimizer_config = OptimizerConfig::new(); let optimizers: Vec> = vec![ + // Convert Filter(CrossJoin) back to LEFT JOIN for pg_catalog queries + Arc::new(CrossJoinToLeftJoin::new()), Arc::new(PlanNormalize::new(&cube_ctx)), Arc::new(ProjectionDropOut::new()), Arc::new(FilterPushDown::new()), diff --git a/rust/cubesql/cubesql/src/compile/snapshots/cubesql__compile__tests__pgcatalog_pgtype_postgres.snap b/rust/cubesql/cubesql/src/compile/snapshots/cubesql__compile__tests__pgcatalog_pgtype_postgres.snap index e01d1f51f1af3..00a69fc7ae49b 100644 --- a/rust/cubesql/cubesql/src/compile/snapshots/cubesql__compile__tests__pgcatalog_pgtype_postgres.snap +++ b/rust/cubesql/cubesql/src/compile/snapshots/cubesql__compile__tests__pgcatalog_pgtype_postgres.snap @@ -2,115 +2,115 @@ source: cubesql/src/compile/mod.rs expression: "execute_query(\"SELECT * FROM pg_catalog.pg_type ORDER BY oid ASC\".to_string(),\nDatabaseProtocol::PostgreSQL).await?" --- -+-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ -| oid | typname | typnamespace | typowner | typlen | typbyval | typtype | typcategory | typisprefered | typisdefined | typdelim | typrelid | typsubscript | typelem | typarray | typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typcollation | typdefaultbin | typdefault | typacl | xmin | -+-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ -| 16 | bool | 11 | 10 | 1 | true | b | B | true | true | , | 0 | - | 0 | 1000 | boolin | NULL | 2436 | NULL | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 17 | bytea | 11 | 10 | -1 | false | b | U | false | true | , | 0 | - | 0 | 1001 | byteain | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 19 | name | 11 | 10 | 64 | false | b | S | false | true | , | 0 | raw_array_subscript_handler | 0 | 1003 | namein | NULL | 0 | NULL | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 20 | int8 | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 1016 | int8in | NULL | 2408 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 21 | int2 | 11 | 10 | 2 | true | b | N | false | true | , | 0 | - | 0 | 1005 | int2in | NULL | 0 | NULL | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 23 | int4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1007 | int4in | NULL | 2406 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 25 | text | 11 | 10 | -1 | false | b | S | true | true | , | 0 | - | 0 | 1009 | textin | NULL | 2414 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 26 | oid | 11 | 10 | 4 | true | b | N | true | true | , | 0 | - | 0 | 1028 | oidin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 27 | tid | 11 | 10 | 6 | false | b | U | false | true | , | 0 | - | 0 | 1010 | tidin | NULL | 0 | NULL | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 83 | pg_class | 11 | 10 | -1 | false | c | C | false | true | , | 1259 | - | 0 | 273 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 273 | _pg_class | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 83 | 0 | _pg_classin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 700 | float4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1021 | float4in | NULL | 2424 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 701 | float8 | 11 | 10 | 8 | true | b | N | true | true | , | 0 | - | 0 | 1022 | float8in | NULL | 2426 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 790 | money | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 791 | cash_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 791 | _money | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 790 | 0 | _moneyin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 869 | inet | 11 | 10 | -1 | false | b | I | true | true | , | 0 | - | 0 | 1041 | inetin | NULL | 0 | NULL | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1000 | _bool | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 16 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1001 | _bytea | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 17 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1003 | _name | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 19 | 0 | _namein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1005 | _int2 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 21 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1007 | _int4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 23 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1009 | _text | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 25 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1010 | _tid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 27 | 0 | _tidin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1014 | _bpchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1042 | 0 | _bpcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1015 | _varchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1043 | 0 | _varcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1016 | _int8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 20 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1021 | _float4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 700 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1022 | _float8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 701 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1028 | _oid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 26 | 0 | _oidin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1033 | aclitem | 11 | 10 | 12 | false | b | U | false | true | , | 0 | - | 0 | 1034 | aclitemin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1034 | _aclitem | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1033 | 0 | _aclitemin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1041 | _inet | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 869 | 0 | _inetin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1042 | bpchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1014 | bpcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1043 | varchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1015 | varcharin | NULL | 2432 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1082 | date | 11 | 10 | 4 | true | b | D | false | true | , | 0 | - | 0 | 1182 | date_in | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1083 | time | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1183 | time_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1114 | timestamp | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1115 | timestamp_in | NULL | 2474 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1115 | _timestamp | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1114 | 0 | _timestampin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1182 | _date | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1082 | 0 | _datein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1183 | _time | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1083 | 0 | _timein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1184 | timestamptz | 11 | 10 | 8 | true | b | D | true | true | , | 0 | - | 0 | 1185 | timestamptz_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1185 | _timestamptz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1184 | 0 | _timestamptzin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1186 | interval | 11 | 10 | 16 | false | b | T | true | true | , | 0 | - | 0 | 1187 | intervalin | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1187 | _interval | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1186 | 0 | _intervalin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1231 | _numeric | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1700 | 0 | _numericin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1266 | timetz | 11 | 10 | 12 | false | b | D | false | true | , | 0 | - | 0 | 1270 | timetz_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1270 | _timetz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1266 | 0 | _timetzin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 1700 | numeric | 11 | 10 | -1 | false | b | N | false | true | , | 0 | - | 0 | 1231 | numericin | NULL | 2460 | NULL | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 2249 | record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 2287 | recordin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 2277 | anyarray | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyarrayin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 2283 | anyelement | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyelementin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 2287 | _record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | array_subscript_handler | 2249 | 0 | _recordin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3220 | pg_lsn | 11 | 10 | 8 | true | b | U | false | true | , | 0 | - | 0 | 3221 | pg_lsnin | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3221 | _pg_lsn | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3220 | 0 | _pg_lsnin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3500 | anyenum | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyenumin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3831 | anyrange | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3904 | int4range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3905 | int4rangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3905 | _int4range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3904 | 0 | _int4rangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3906 | numrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3907 | numrangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3907 | _numrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3906 | 0 | _numrangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3908 | tsrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3909 | tsrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3909 | _tsrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3908 | 0 | _tsrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3910 | tstzrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3911 | tstzrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3911 | _tstzrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3910 | 0 | _tstzrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3912 | daterange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3913 | daterangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3913 | _daterange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3912 | 0 | _daterangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3926 | int8range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3927 | int8rangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 3927 | _int8range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3926 | 0 | _int8rangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 4451 | int4multirange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 6150 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 4532 | nummultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6151 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 4533 | tsmultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6152 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 4535 | datemultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6155 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 4536 | int8multirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6157 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 6150 | _int4multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4451 | 0 | _int4multirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 6151 | _nummultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4532 | 0 | _nummultirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 6152 | _tsmultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4533 | 0 | _tsmultirangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 6155 | _datemultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4535 | 0 | _datemultirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 6157 | _int8multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4536 | 0 | _int8multirangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10014 | _pg_am | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10015 | 0 | _pg_amin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10015 | pg_am | 11 | 10 | -1 | false | c | C | false | true | , | 2601 | - | 0 | 10014 | pg_amin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10020 | _pg_language | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10021 | 0 | _pg_languagein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10021 | pg_language | 11 | 10 | -1 | false | c | C | false | true | , | 2612 | - | 0 | 10020 | pg_languagein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10038 | _pg_event_trigger | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10039 | 0 | _pg_event_triggerin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10039 | pg_event_trigger | 11 | 10 | -1 | false | c | C | false | true | , | 3466 | - | 0 | 10038 | pg_event_triggerin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10042 | _pg_cast | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10043 | 0 | _pg_castin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10043 | pg_cast | 11 | 10 | -1 | false | c | C | false | true | , | 2605 | - | 0 | 10042 | pg_castin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10073 | _pg_extension | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10074 | 0 | _pg_extensionin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10074 | pg_extension | 11 | 10 | -1 | false | c | C | false | true | , | 3079 | - | 0 | 10073 | pg_extensionin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10075 | _pg_foreign_data_wrapper | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10076 | 0 | _pg_foreign_data_wrapperin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10076 | pg_foreign_data_wrapper | 11 | 10 | -1 | false | c | C | false | true | , | 2328 | - | 0 | 10075 | pg_foreign_data_wrapperin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10077 | _pg_foreign_server | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10078 | 0 | _pg_foreign_serverin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 10078 | pg_foreign_server | 11 | 10 | -1 | false | c | C | false | true | , | 1417 | - | 0 | 10077 | pg_foreign_serverin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 12002 | _pg_constraint | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 12003 | 0 | _pg_constraintin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 12003 | pg_constraint | 11 | 10 | -1 | false | c | C | false | true | , | 2606 | - | 0 | 12002 | pg_constraintin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 12046 | _pg_namespace | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 12047 | 0 | _pg_namespacein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 12047 | pg_namespace | 11 | 10 | -1 | false | c | C | false | true | , | 2615 | - | 0 | 12046 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 13408 | character_data | 13000 | 10 | -1 | false | d | S | false | true | , | 0 | - | 0 | 0 | character_datain | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 1043 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 13410 | sql_identifier | 13000 | 10 | 64 | false | d | S | false | true | , | 0 | - | 0 | 0 | sql_identifierin | NULL | 0 | NULL | NULL | NULL | NULL | c | p | false | 19 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18001 | KibanaSampleDataEcommerce | 2200 | 10 | -1 | false | c | C | false | true | , | 18000 | - | 0 | 18002 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18002 | _KibanaSampleDataEcommerce | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18001 | 0 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18021 | Logs | 2200 | 10 | -1 | false | c | C | false | true | , | 18020 | - | 0 | 18022 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18022 | _Logs | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18021 | 0 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18031 | NumberCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18030 | - | 0 | 18032 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18032 | _NumberCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18031 | 0 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18037 | WideCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18036 | - | 0 | 18038 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18038 | _WideCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18037 | 0 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18247 | MultiTypeCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18246 | - | 0 | 18248 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -| 18248 | _MultiTypeCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18247 | 0 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | -+-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ ++-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ +| oid | typname | typnamespace | typowner | typlen | typbyval | typtype | typcategory | typisprefered | typisdefined | typdelim | typrelid | typsubscript | typelem | typarray | typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typcollation | typdefaultbin | typdefault | typacl | xmin | ++-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ +| 16 | bool | 11 | 10 | 1 | true | b | B | true | true | , | 0 | - | 0 | 1000 | boolin | boolout | boolrecv | boolsend | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 17 | bytea | 11 | 10 | -1 | false | b | U | false | true | , | 0 | - | 0 | 1001 | byteain | byteaout | bytearecv | byteasend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 19 | name | 11 | 10 | 64 | false | b | S | false | true | , | 0 | raw_array_subscript_handler | 0 | 1003 | namein | nameout | namerecv | namesend | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 20 | int8 | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 1016 | int8in | int8out | int8recv | int8send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 21 | int2 | 11 | 10 | 2 | true | b | N | false | true | , | 0 | - | 0 | 1005 | int2in | int2out | int2recv | int2send | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 23 | int4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1007 | int4in | int4out | int4recv | int4send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 25 | text | 11 | 10 | -1 | false | b | S | true | true | , | 0 | - | 0 | 1009 | textin | textout | textrecv | textsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 26 | oid | 11 | 10 | 4 | true | b | N | true | true | , | 0 | - | 0 | 1028 | oidin | oidout | oidrecv | oidsend | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 27 | tid | 11 | 10 | 6 | false | b | U | false | true | , | 0 | - | 0 | 1010 | tidin | tidout | tidrecv | tidsend | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 83 | pg_class | 11 | 10 | -1 | false | c | C | false | true | , | 1259 | - | 0 | 273 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 273 | _pg_class | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 83 | 0 | _pg_classin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 700 | float4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1021 | float4in | float4out | float4recv | float4send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 701 | float8 | 11 | 10 | 8 | true | b | N | true | true | , | 0 | - | 0 | 1022 | float8in | float8out | float8recv | float8send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 790 | money | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 791 | cash_in | cash_out | cash_recv | cash_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 791 | _money | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 790 | 0 | _moneyin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 869 | inet | 11 | 10 | -1 | false | b | I | true | true | , | 0 | - | 0 | 1041 | inetin | inetout | inet_recv | inetsend | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1000 | _bool | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 16 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1001 | _bytea | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 17 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1003 | _name | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 19 | 0 | _namein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1005 | _int2 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 21 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1007 | _int4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 23 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1009 | _text | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 25 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1010 | _tid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 27 | 0 | _tidin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1014 | _bpchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1042 | 0 | _bpcharin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1015 | _varchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1043 | 0 | _varcharin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1016 | _int8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 20 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1021 | _float4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 700 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1022 | _float8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 701 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1028 | _oid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 26 | 0 | _oidin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1033 | aclitem | 11 | 10 | 12 | false | b | U | false | true | , | 0 | - | 0 | 1034 | aclitemin | aclitemout | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1034 | _aclitem | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1033 | 0 | _aclitemin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1041 | _inet | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 869 | 0 | _inetin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1042 | bpchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1014 | bpcharin | bpcharout | bpcharrecv | bpcharsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1043 | varchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1015 | varcharin | varcharout | varcharrecv | varcharsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1082 | date | 11 | 10 | 4 | true | b | D | false | true | , | 0 | - | 0 | 1182 | date_in | date_out | date_recv | date_send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1083 | time | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1183 | time_in | time_out | time_recv | time_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1114 | timestamp | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1115 | timestamp_in | timestamp_out | timestamp_recv | timestamp_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1115 | _timestamp | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1114 | 0 | _timestampin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1182 | _date | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1082 | 0 | _datein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1183 | _time | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1083 | 0 | _timein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1184 | timestamptz | 11 | 10 | 8 | true | b | D | true | true | , | 0 | - | 0 | 1185 | timestamptz_in | timestamptz_out | timestamptz_recv | timestamptz_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1185 | _timestamptz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1184 | 0 | _timestamptzin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1186 | interval | 11 | 10 | 16 | false | b | T | true | true | , | 0 | - | 0 | 1187 | intervalin | intervalout | interval_recv | intervalsend | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1187 | _interval | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1186 | 0 | _intervalin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1231 | _numeric | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1700 | 0 | _numericin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1266 | timetz | 11 | 10 | 12 | false | b | D | false | true | , | 0 | - | 0 | 1270 | timetz_in | timetz_out | timetz_recv | timetz_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1270 | _timetz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1266 | 0 | _timetzin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 1700 | numeric | 11 | 10 | -1 | false | b | N | false | true | , | 0 | - | 0 | 1231 | numericin | numericout | numeric_recv | numericsend | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 2249 | record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 2287 | recordin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 2277 | anyarray | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyarrayin | anyarray_out | anyarray_recv | anyarray_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 2283 | anyelement | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyelementin | - | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 2287 | _record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | array_subscript_handler | 2249 | 0 | _recordin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3220 | pg_lsn | 11 | 10 | 8 | true | b | U | false | true | , | 0 | - | 0 | 3221 | pg_lsnin | pg_lsnout | pg_lsn_recv | pg_lsnsend | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3221 | _pg_lsn | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3220 | 0 | _pg_lsnin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3500 | anyenum | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyenumin | - | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3831 | anyrange | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyrangein | range_out | - | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3904 | int4range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3905 | int4rangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3905 | _int4range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3904 | 0 | _int4rangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3906 | numrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3907 | numrangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3907 | _numrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3906 | 0 | _numrangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3908 | tsrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3909 | tsrangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3909 | _tsrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3908 | 0 | _tsrangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3910 | tstzrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3911 | tstzrangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3911 | _tstzrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3910 | 0 | _tstzrangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3912 | daterange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3913 | daterangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3913 | _daterange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3912 | 0 | _daterangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3926 | int8range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3927 | int8rangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 3927 | _int8range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3926 | 0 | _int8rangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 4451 | int4multirange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 6150 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 4532 | nummultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6151 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 4533 | tsmultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6152 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 4535 | datemultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6155 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 4536 | int8multirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6157 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 6150 | _int4multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4451 | 0 | _int4multirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 6151 | _nummultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4532 | 0 | _nummultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 6152 | _tsmultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4533 | 0 | _tsmultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 6155 | _datemultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4535 | 0 | _datemultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 6157 | _int8multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4536 | 0 | _int8multirangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10014 | _pg_am | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10015 | 0 | _pg_amin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10015 | pg_am | 11 | 10 | -1 | false | c | C | false | true | , | 2601 | - | 0 | 10014 | pg_amin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10020 | _pg_language | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10021 | 0 | _pg_languagein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10021 | pg_language | 11 | 10 | -1 | false | c | C | false | true | , | 2612 | - | 0 | 10020 | pg_languagein | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10038 | _pg_event_trigger | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10039 | 0 | _pg_event_triggerin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10039 | pg_event_trigger | 11 | 10 | -1 | false | c | C | false | true | , | 3466 | - | 0 | 10038 | pg_event_triggerin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10042 | _pg_cast | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10043 | 0 | _pg_castin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10043 | pg_cast | 11 | 10 | -1 | false | c | C | false | true | , | 2605 | - | 0 | 10042 | pg_castin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10073 | _pg_extension | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10074 | 0 | _pg_extensionin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10074 | pg_extension | 11 | 10 | -1 | false | c | C | false | true | , | 3079 | - | 0 | 10073 | pg_extensionin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10075 | _pg_foreign_data_wrapper | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10076 | 0 | _pg_foreign_data_wrapperin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10076 | pg_foreign_data_wrapper | 11 | 10 | -1 | false | c | C | false | true | , | 2328 | - | 0 | 10075 | pg_foreign_data_wrapperin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10077 | _pg_foreign_server | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 10078 | 0 | _pg_foreign_serverin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 10078 | pg_foreign_server | 11 | 10 | -1 | false | c | C | false | true | , | 1417 | - | 0 | 10077 | pg_foreign_serverin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 12002 | _pg_constraint | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 12003 | 0 | _pg_constraintin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 12003 | pg_constraint | 11 | 10 | -1 | false | c | C | false | true | , | 2606 | - | 0 | 12002 | pg_constraintin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 12046 | _pg_namespace | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 12047 | 0 | _pg_namespacein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 12047 | pg_namespace | 11 | 10 | -1 | false | c | C | false | true | , | 2615 | - | 0 | 12046 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 13408 | character_data | 13000 | 10 | -1 | false | d | S | false | true | , | 0 | - | 0 | 0 | character_datain | domain_out | domain_recv | domain_send | NULL | NULL | NULL | i | x | false | 1043 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 13410 | sql_identifier | 13000 | 10 | 64 | false | d | S | false | true | , | 0 | - | 0 | 0 | sql_identifierin | domain_out | domain_recv | domain_send | NULL | NULL | NULL | c | p | false | 19 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18001 | KibanaSampleDataEcommerce | 2200 | 10 | -1 | false | c | C | false | true | , | 18000 | - | 0 | 18002 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18002 | _KibanaSampleDataEcommerce | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18001 | 0 | record_in | record_out | array_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18021 | Logs | 2200 | 10 | -1 | false | c | C | false | true | , | 18020 | - | 0 | 18022 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18022 | _Logs | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18021 | 0 | record_in | record_out | array_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18031 | NumberCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18030 | - | 0 | 18032 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18032 | _NumberCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18031 | 0 | record_in | record_out | array_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18037 | WideCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18036 | - | 0 | 18038 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18038 | _WideCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18037 | 0 | record_in | record_out | array_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18247 | MultiTypeCube | 2200 | 10 | -1 | false | c | C | false | true | , | 18246 | - | 0 | 18248 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | +| 18248 | _MultiTypeCube | 2200 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 18247 | 0 | record_in | record_out | array_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | ++-------+----------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+----------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+ diff --git a/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__dbeaver_introspection_types.snap b/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__dbeaver_introspection_types.snap index b8c4e404f7776..7fa2b65e2d80f 100644 --- a/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__dbeaver_introspection_types.snap +++ b/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__dbeaver_introspection_types.snap @@ -2,94 +2,94 @@ source: cubesql/src/compile/test/test_introspection.rs expression: "execute_query(\"SELECT t.oid,t.*,c.relkind,format_type(nullif(t.typbasetype, 0), t.typtypmod) as base_type_name, d.description\n FROM pg_catalog.pg_type t\n LEFT OUTER JOIN pg_catalog.pg_type et ON et.oid=t.typelem\n LEFT OUTER JOIN pg_catalog.pg_class c ON c.oid=t.typrelid\n LEFT OUTER JOIN pg_catalog.pg_description d ON t.oid=d.objoid\n WHERE t.typname IS NOT NULL\n AND (c.relkind IS NULL OR c.relkind = 'c') AND (et.typcategory IS NULL OR et.typcategory <> 'C')\n ORDER BY t.oid ASC\".to_string(),\nDatabaseProtocol::PostgreSQL).await?" --- -+-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ -| oid | oid__1 | typname | typnamespace | typowner | typlen | typbyval | typtype | typcategory | typisprefered | typisdefined | typdelim | typrelid | typsubscript | typelem | typarray | typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typcollation | typdefaultbin | typdefault | typacl | xmin | relkind | base_type_name | description | -+-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ -| 16 | 16 | bool | 11 | 10 | 1 | true | b | B | true | true | , | 0 | - | 0 | 1000 | boolin | NULL | 2436 | NULL | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 17 | 17 | bytea | 11 | 10 | -1 | false | b | U | false | true | , | 0 | - | 0 | 1001 | byteain | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 19 | 19 | name | 11 | 10 | 64 | false | b | S | false | true | , | 0 | raw_array_subscript_handler | 0 | 1003 | namein | NULL | 0 | NULL | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 20 | 20 | int8 | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 1016 | int8in | NULL | 2408 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 21 | 21 | int2 | 11 | 10 | 2 | true | b | N | false | true | , | 0 | - | 0 | 1005 | int2in | NULL | 0 | NULL | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 23 | 23 | int4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1007 | int4in | NULL | 2406 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 25 | 25 | text | 11 | 10 | -1 | false | b | S | true | true | , | 0 | - | 0 | 1009 | textin | NULL | 2414 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 26 | 26 | oid | 11 | 10 | 4 | true | b | N | true | true | , | 0 | - | 0 | 1028 | oidin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 27 | 27 | tid | 11 | 10 | 6 | false | b | U | false | true | , | 0 | - | 0 | 1010 | tidin | NULL | 0 | NULL | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 700 | 700 | float4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1021 | float4in | NULL | 2424 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 701 | 701 | float8 | 11 | 10 | 8 | true | b | N | true | true | , | 0 | - | 0 | 1022 | float8in | NULL | 2426 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 790 | 790 | money | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 791 | cash_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 791 | 791 | _money | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 790 | 0 | _moneyin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 869 | 869 | inet | 11 | 10 | -1 | false | b | I | true | true | , | 0 | - | 0 | 1041 | inetin | NULL | 0 | NULL | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1000 | 1000 | _bool | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 16 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1001 | 1001 | _bytea | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 17 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1003 | 1003 | _name | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 19 | 0 | _namein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1005 | 1005 | _int2 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 21 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1007 | 1007 | _int4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 23 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1009 | 1009 | _text | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 25 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1010 | 1010 | _tid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 27 | 0 | _tidin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1014 | 1014 | _bpchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1042 | 0 | _bpcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1015 | 1015 | _varchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1043 | 0 | _varcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1016 | 1016 | _int8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 20 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1021 | 1021 | _float4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 700 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1022 | 1022 | _float8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 701 | 0 | array_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1028 | 1028 | _oid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 26 | 0 | _oidin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1033 | 1033 | aclitem | 11 | 10 | 12 | false | b | U | false | true | , | 0 | - | 0 | 1034 | aclitemin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1034 | 1034 | _aclitem | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1033 | 0 | _aclitemin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1041 | 1041 | _inet | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 869 | 0 | _inetin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1042 | 1042 | bpchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1014 | bpcharin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1043 | 1043 | varchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1015 | varcharin | NULL | 2432 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1082 | 1082 | date | 11 | 10 | 4 | true | b | D | false | true | , | 0 | - | 0 | 1182 | date_in | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1083 | 1083 | time | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1183 | time_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1114 | 1114 | timestamp | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1115 | timestamp_in | NULL | 2474 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1115 | 1115 | _timestamp | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1114 | 0 | _timestampin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1182 | 1182 | _date | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1082 | 0 | _datein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1183 | 1183 | _time | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1083 | 0 | _timein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1184 | 1184 | timestamptz | 11 | 10 | 8 | true | b | D | true | true | , | 0 | - | 0 | 1185 | timestamptz_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1185 | 1185 | _timestamptz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1184 | 0 | _timestamptzin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1186 | 1186 | interval | 11 | 10 | 16 | false | b | T | true | true | , | 0 | - | 0 | 1187 | intervalin | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1187 | 1187 | _interval | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1186 | 0 | _intervalin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1231 | 1231 | _numeric | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1700 | 0 | _numericin | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1266 | 1266 | timetz | 11 | 10 | 12 | false | b | D | false | true | , | 0 | - | 0 | 1270 | timetz_in | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1270 | 1270 | _timetz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1266 | 0 | _timetzin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 1700 | 1700 | numeric | 11 | 10 | -1 | false | b | N | false | true | , | 0 | - | 0 | 1231 | numericin | NULL | 2460 | NULL | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 2249 | 2249 | record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 2287 | recordin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 2277 | 2277 | anyarray | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyarrayin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 2283 | 2283 | anyelement | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyelementin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 2287 | 2287 | _record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | array_subscript_handler | 2249 | 0 | _recordin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3220 | 3220 | pg_lsn | 11 | 10 | 8 | true | b | U | false | true | , | 0 | - | 0 | 3221 | pg_lsnin | NULL | 0 | NULL | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3221 | 3221 | _pg_lsn | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3220 | 0 | _pg_lsnin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3500 | 3500 | anyenum | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyenumin | NULL | 0 | NULL | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3831 | 3831 | anyrange | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3904 | 3904 | int4range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3905 | int4rangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3905 | 3905 | _int4range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3904 | 0 | _int4rangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3906 | 3906 | numrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3907 | numrangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3907 | 3907 | _numrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3906 | 0 | _numrangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3908 | 3908 | tsrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3909 | tsrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3909 | 3909 | _tsrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3908 | 0 | _tsrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3910 | 3910 | tstzrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3911 | tstzrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3911 | 3911 | _tstzrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3910 | 0 | _tstzrangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3912 | 3912 | daterange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3913 | daterangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3913 | 3913 | _daterange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3912 | 0 | _daterangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3926 | 3926 | int8range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3927 | int8rangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 3927 | 3927 | _int8range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3926 | 0 | _int8rangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 4451 | 4451 | int4multirange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 6150 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 4532 | 4532 | nummultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6151 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 4533 | 4533 | tsmultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6152 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 4535 | 4535 | datemultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6155 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 4536 | 4536 | int8multirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6157 | multirange_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 6150 | 6150 | _int4multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4451 | 0 | _int4multirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 6151 | 6151 | _nummultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4532 | 0 | _nummultirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 6152 | 6152 | _tsmultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4533 | 0 | _tsmultirangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 6155 | 6155 | _datemultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4535 | 0 | _datemultirangein | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 6157 | 6157 | _int8multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4536 | 0 | _int8multirangein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10015 | 10015 | pg_am | 11 | 10 | -1 | false | c | C | false | true | , | 2601 | - | 0 | 10014 | pg_amin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10021 | 10021 | pg_language | 11 | 10 | -1 | false | c | C | false | true | , | 2612 | - | 0 | 10020 | pg_languagein | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10039 | 10039 | pg_event_trigger | 11 | 10 | -1 | false | c | C | false | true | , | 3466 | - | 0 | 10038 | pg_event_triggerin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10043 | 10043 | pg_cast | 11 | 10 | -1 | false | c | C | false | true | , | 2605 | - | 0 | 10042 | pg_castin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10074 | 10074 | pg_extension | 11 | 10 | -1 | false | c | C | false | true | , | 3079 | - | 0 | 10073 | pg_extensionin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10076 | 10076 | pg_foreign_data_wrapper | 11 | 10 | -1 | false | c | C | false | true | , | 2328 | - | 0 | 10075 | pg_foreign_data_wrapperin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 10078 | 10078 | pg_foreign_server | 11 | 10 | -1 | false | c | C | false | true | , | 1417 | - | 0 | 10077 | pg_foreign_serverin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 12003 | 12003 | pg_constraint | 11 | 10 | -1 | false | c | C | false | true | , | 2606 | - | 0 | 12002 | pg_constraintin | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 12047 | 12047 | pg_namespace | 11 | 10 | -1 | false | c | C | false | true | , | 2615 | - | 0 | 12046 | record_in | NULL | 0 | NULL | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | -| 13408 | 13408 | character_data | 13000 | 10 | -1 | false | d | S | false | true | , | 0 | - | 0 | 0 | character_datain | NULL | 0 | NULL | NULL | NULL | NULL | i | x | false | 1043 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | character varying | NULL | -| 13410 | 13410 | sql_identifier | 13000 | 10 | 64 | false | d | S | false | true | , | 0 | - | 0 | 0 | sql_identifierin | NULL | 0 | NULL | NULL | NULL | NULL | c | p | false | 19 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | name | NULL | -+-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------+------------+---------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ ++-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ +| oid | oid__1 | typname | typnamespace | typowner | typlen | typbyval | typtype | typcategory | typisprefered | typisdefined | typdelim | typrelid | typsubscript | typelem | typarray | typinput | typoutput | typreceive | typsend | typmodin | typmodout | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typcollation | typdefaultbin | typdefault | typacl | xmin | relkind | base_type_name | description | ++-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ +| 16 | 16 | bool | 11 | 10 | 1 | true | b | B | true | true | , | 0 | - | 0 | 1000 | boolin | boolout | boolrecv | boolsend | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 17 | 17 | bytea | 11 | 10 | -1 | false | b | U | false | true | , | 0 | - | 0 | 1001 | byteain | byteaout | bytearecv | byteasend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 19 | 19 | name | 11 | 10 | 64 | false | b | S | false | true | , | 0 | raw_array_subscript_handler | 0 | 1003 | namein | nameout | namerecv | namesend | NULL | NULL | NULL | c | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 20 | 20 | int8 | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 1016 | int8in | int8out | int8recv | int8send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 21 | 21 | int2 | 11 | 10 | 2 | true | b | N | false | true | , | 0 | - | 0 | 1005 | int2in | int2out | int2recv | int2send | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 23 | 23 | int4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1007 | int4in | int4out | int4recv | int4send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 25 | 25 | text | 11 | 10 | -1 | false | b | S | true | true | , | 0 | - | 0 | 1009 | textin | textout | textrecv | textsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 26 | 26 | oid | 11 | 10 | 4 | true | b | N | true | true | , | 0 | - | 0 | 1028 | oidin | oidout | oidrecv | oidsend | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 27 | 27 | tid | 11 | 10 | 6 | false | b | U | false | true | , | 0 | - | 0 | 1010 | tidin | tidout | tidrecv | tidsend | NULL | NULL | NULL | s | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 700 | 700 | float4 | 11 | 10 | 4 | true | b | N | false | true | , | 0 | - | 0 | 1021 | float4in | float4out | float4recv | float4send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 701 | 701 | float8 | 11 | 10 | 8 | true | b | N | true | true | , | 0 | - | 0 | 1022 | float8in | float8out | float8recv | float8send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 790 | 790 | money | 11 | 10 | 8 | true | b | N | false | true | , | 0 | - | 0 | 791 | cash_in | cash_out | cash_recv | cash_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 791 | 791 | _money | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 790 | 0 | _moneyin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 869 | 869 | inet | 11 | 10 | -1 | false | b | I | true | true | , | 0 | - | 0 | 1041 | inetin | inetout | inet_recv | inetsend | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1000 | 1000 | _bool | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 16 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1001 | 1001 | _bytea | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 17 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1003 | 1003 | _name | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 19 | 0 | _namein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1005 | 1005 | _int2 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 21 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1007 | 1007 | _int4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 23 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1009 | 1009 | _text | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 25 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1010 | 1010 | _tid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 27 | 0 | _tidin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1014 | 1014 | _bpchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1042 | 0 | _bpcharin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1015 | 1015 | _varchar | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1043 | 0 | _varcharin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1016 | 1016 | _int8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 20 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1021 | 1021 | _float4 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 700 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1022 | 1022 | _float8 | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 701 | 0 | array_in | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1028 | 1028 | _oid | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 26 | 0 | _oidin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1033 | 1033 | aclitem | 11 | 10 | 12 | false | b | U | false | true | , | 0 | - | 0 | 1034 | aclitemin | aclitemout | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1034 | 1034 | _aclitem | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1033 | 0 | _aclitemin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1041 | 1041 | _inet | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 869 | 0 | _inetin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1042 | 1042 | bpchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1014 | bpcharin | bpcharout | bpcharrecv | bpcharsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1043 | 1043 | varchar | 11 | 10 | -1 | false | b | S | false | true | , | 0 | - | 0 | 1015 | varcharin | varcharout | varcharrecv | varcharsend | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1082 | 1082 | date | 11 | 10 | 4 | true | b | D | false | true | , | 0 | - | 0 | 1182 | date_in | date_out | date_recv | date_send | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1083 | 1083 | time | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1183 | time_in | time_out | time_recv | time_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1114 | 1114 | timestamp | 11 | 10 | 8 | true | b | D | false | true | , | 0 | - | 0 | 1115 | timestamp_in | timestamp_out | timestamp_recv | timestamp_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1115 | 1115 | _timestamp | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1114 | 0 | _timestampin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1182 | 1182 | _date | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1082 | 0 | _datein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1183 | 1183 | _time | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1083 | 0 | _timein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1184 | 1184 | timestamptz | 11 | 10 | 8 | true | b | D | true | true | , | 0 | - | 0 | 1185 | timestamptz_in | timestamptz_out | timestamptz_recv | timestamptz_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1185 | 1185 | _timestamptz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1184 | 0 | _timestamptzin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1186 | 1186 | interval | 11 | 10 | 16 | false | b | T | true | true | , | 0 | - | 0 | 1187 | intervalin | intervalout | interval_recv | intervalsend | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1187 | 1187 | _interval | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1186 | 0 | _intervalin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1231 | 1231 | _numeric | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1700 | 0 | _numericin | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1266 | 1266 | timetz | 11 | 10 | 12 | false | b | D | false | true | , | 0 | - | 0 | 1270 | timetz_in | timetz_out | timetz_recv | timetz_send | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1270 | 1270 | _timetz | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 1266 | 0 | _timetzin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 1700 | 1700 | numeric | 11 | 10 | -1 | false | b | N | false | true | , | 0 | - | 0 | 1231 | numericin | numericout | numeric_recv | numericsend | NULL | NULL | NULL | i | m | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 2249 | 2249 | record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 2287 | recordin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 2277 | 2277 | anyarray | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyarrayin | anyarray_out | anyarray_recv | anyarray_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 2283 | 2283 | anyelement | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyelementin | - | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 2287 | 2287 | _record | 11 | 10 | -1 | false | p | P | false | true | , | 0 | array_subscript_handler | 2249 | 0 | _recordin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3220 | 3220 | pg_lsn | 11 | 10 | 8 | true | b | U | false | true | , | 0 | - | 0 | 3221 | pg_lsnin | pg_lsnout | pg_lsn_recv | pg_lsnsend | NULL | NULL | NULL | d | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3221 | 3221 | _pg_lsn | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3220 | 0 | _pg_lsnin | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3500 | 3500 | anyenum | 11 | 10 | 4 | true | p | P | false | true | , | 0 | - | 0 | 0 | anyenumin | - | - | - | NULL | NULL | NULL | i | p | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3831 | 3831 | anyrange | 11 | 10 | -1 | false | p | P | false | true | , | 0 | - | 0 | 0 | anyrangein | range_out | - | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3904 | 3904 | int4range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3905 | int4rangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3905 | 3905 | _int4range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3904 | 0 | _int4rangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3906 | 3906 | numrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3907 | numrangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3907 | 3907 | _numrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3906 | 0 | _numrangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3908 | 3908 | tsrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3909 | tsrangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3909 | 3909 | _tsrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3908 | 0 | _tsrangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3910 | 3910 | tstzrange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3911 | tstzrangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3911 | 3911 | _tstzrange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3910 | 0 | _tstzrangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3912 | 3912 | daterange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3913 | daterangein | range_out | range_recv | range_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3913 | 3913 | _daterange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3912 | 0 | _daterangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3926 | 3926 | int8range | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 3927 | int8rangein | range_out | range_recv | range_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 3927 | 3927 | _int8range | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 3926 | 0 | _int8rangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 4451 | 4451 | int4multirange | 11 | 10 | -1 | false | r | R | false | true | , | 0 | - | 0 | 6150 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 4532 | 4532 | nummultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6151 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 4533 | 4533 | tsmultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6152 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 4535 | 4535 | datemultirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6155 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 4536 | 4536 | int8multirange | 11 | 10 | -1 | false | m | R | false | true | , | 0 | - | 0 | 6157 | multirange_in | multirange_out | multirange_recv | multirange_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 6150 | 6150 | _int4multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4451 | 0 | _int4multirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 6151 | 6151 | _nummultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4532 | 0 | _nummultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 6152 | 6152 | _tsmultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4533 | 0 | _tsmultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 6155 | 6155 | _datemultirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4535 | 0 | _datemultirangein | array_out | array_recv | array_send | NULL | NULL | NULL | i | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 6157 | 6157 | _int8multirange | 11 | 10 | -1 | false | b | A | false | true | , | 0 | array_subscript_handler | 4536 | 0 | _int8multirangein | array_out | array_recv | array_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10015 | 10015 | pg_am | 11 | 10 | -1 | false | c | C | false | true | , | 2601 | - | 0 | 10014 | pg_amin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10021 | 10021 | pg_language | 11 | 10 | -1 | false | c | C | false | true | , | 2612 | - | 0 | 10020 | pg_languagein | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10039 | 10039 | pg_event_trigger | 11 | 10 | -1 | false | c | C | false | true | , | 3466 | - | 0 | 10038 | pg_event_triggerin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10043 | 10043 | pg_cast | 11 | 10 | -1 | false | c | C | false | true | , | 2605 | - | 0 | 10042 | pg_castin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10074 | 10074 | pg_extension | 11 | 10 | -1 | false | c | C | false | true | , | 3079 | - | 0 | 10073 | pg_extensionin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10076 | 10076 | pg_foreign_data_wrapper | 11 | 10 | -1 | false | c | C | false | true | , | 2328 | - | 0 | 10075 | pg_foreign_data_wrapperin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 10078 | 10078 | pg_foreign_server | 11 | 10 | -1 | false | c | C | false | true | , | 1417 | - | 0 | 10077 | pg_foreign_serverin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 12003 | 12003 | pg_constraint | 11 | 10 | -1 | false | c | C | false | true | , | 2606 | - | 0 | 12002 | pg_constraintin | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 12047 | 12047 | pg_namespace | 11 | 10 | -1 | false | c | C | false | true | , | 2615 | - | 0 | 12046 | record_in | record_out | record_recv | record_send | NULL | NULL | NULL | d | x | false | 0 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | NULL | NULL | +| 13408 | 13408 | character_data | 13000 | 10 | -1 | false | d | S | false | true | , | 0 | - | 0 | 0 | character_datain | domain_out | domain_recv | domain_send | NULL | NULL | NULL | i | x | false | 1043 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | character varying | NULL | +| 13410 | 13410 | sql_identifier | 13000 | 10 | 64 | false | d | S | false | true | , | 0 | - | 0 | 0 | sql_identifierin | domain_out | domain_recv | domain_send | NULL | NULL | NULL | c | p | false | 19 | -1 | NULL | NULL | NULL | NULL | NULL | 1 | NULL | name | NULL | ++-------+--------+-------------------------+--------------+----------+--------+----------+---------+-------------+---------------+--------------+----------+----------+-----------------------------+---------+----------+---------------------------+-----------------+------------------+------------------+----------+-----------+------------+----------+------------+------------+-------------+-----------+----------+--------------+---------------+------------+--------+------+---------+-------------------+-------------+ diff --git a/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__powerbi_supported_types.snap b/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__powerbi_supported_types.snap index 41fe3b513d6b1..4cf9e9f947781 100644 --- a/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__powerbi_supported_types.snap +++ b/rust/cubesql/cubesql/src/compile/test/snapshots/cubesql__compile__test__test_introspection__powerbi_supported_types.snap @@ -2,16 +2,7 @@ source: cubesql/src/compile/test/test_introspection.rs expression: "execute_query(\"/*** Load all supported types ***/\n SELECT ns.nspname, a.typname, a.oid, a.typrelid, a.typbasetype,\n CASE WHEN pg_proc.proname='array_recv' THEN 'a' ELSE a.typtype END AS type,\n CASE\n WHEN pg_proc.proname='array_recv' THEN a.typelem\n WHEN a.typtype='r' THEN rngsubtype\n ELSE 0\n END AS elemoid,\n CASE\n WHEN pg_proc.proname IN ('array_recv','oidvectorrecv') THEN 3 /* Arrays last */\n WHEN a.typtype='r' THEN 2 /* Ranges before */\n WHEN a.typtype='d' THEN 1 /* Domains before */\n ELSE 0 /* Base types first */\n END AS ord\n FROM pg_type AS a\n JOIN pg_namespace AS ns ON (ns.oid = a.typnamespace)\n JOIN pg_proc ON pg_proc.oid = a.typreceive\n LEFT OUTER JOIN pg_class AS cls ON (cls.oid = a.typrelid)\n LEFT OUTER JOIN pg_type AS b ON (b.oid = a.typelem)\n LEFT OUTER JOIN pg_class AS elemcls ON (elemcls.oid = b.typrelid)\n LEFT OUTER JOIN pg_range ON (pg_range.rngtypid = a.oid)\n WHERE\n a.typtype IN ('b', 'r', 'e', 'd') OR /* Base, range, enum, domain */\n (a.typtype = 'c' AND cls.relkind='c') OR /* User-defined free-standing composites (not table composites) by default */\n (pg_proc.proname='array_recv' AND (\n b.typtype IN ('b', 'r', 'e', 'd') OR /* Array of base, range, enum, domain */\n (b.typtype = 'p' AND b.typname IN ('record', 'void')) OR /* Arrays of special supported pseudo-types */\n (b.typtype = 'c' AND elemcls.relkind='c') /* Array of user-defined free-standing composites (not table composites) */\n )) OR\n (a.typtype = 'p' AND a.typname IN ('record', 'void')) /* Some special supported pseudo-types */\n /* changed for stable sort ORDER BY ord */\n ORDER BY a.typname\".to_string(),\nDatabaseProtocol::PostgreSQL).await?" --- -+------------+-----------+------+----------+-------------+------+---------+-----+ -| nspname | typname | oid | typrelid | typbasetype | type | elemoid | ord | -+------------+-----------+------+----------+-------------+------+---------+-----+ -| pg_catalog | bool | 16 | 0 | 0 | b | 0 | 0 | -| pg_catalog | float4 | 700 | 0 | 0 | b | 0 | 0 | -| pg_catalog | float8 | 701 | 0 | 0 | b | 0 | 0 | -| pg_catalog | int4 | 23 | 0 | 0 | b | 0 | 0 | -| pg_catalog | int8 | 20 | 0 | 0 | b | 0 | 0 | -| pg_catalog | numeric | 1700 | 0 | 0 | b | 0 | 0 | -| pg_catalog | text | 25 | 0 | 0 | b | 0 | 0 | -| pg_catalog | timestamp | 1114 | 0 | 0 | b | 0 | 0 | -| pg_catalog | varchar | 1043 | 0 | 0 | b | 0 | 0 | -+------------+-----------+------+----------+-------------+------+---------+-----+ ++---------+---------+-----+----------+-------------+------+---------+-----+ +| nspname | typname | oid | typrelid | typbasetype | type | elemoid | ord | ++---------+---------+-----+----------+-------------+------+---------+-----+ ++---------+---------+-----+----------+-------------+------+---------+-----+ diff --git a/rust/cubesql/pg-srv/src/pg_type.rs b/rust/cubesql/pg-srv/src/pg_type.rs index 9a89bde9b5a46..6f69161c8a509 100644 --- a/rust/cubesql/pg-srv/src/pg_type.rs +++ b/rust/cubesql/pg-srv/src/pg_type.rs @@ -13,7 +13,7 @@ pub struct PgType<'a> { pub typnamespace: u32, /// Owner of the type. references pg_authid.oid pub typowner: u32, - /// For a fixed-size type, typlen is the number of bytes in the internal representation of the type. But for a variable-length type, typlen is negative. -1 indicates a “varlena” type (one that has a length word), -2 indicates a null-terminated C string. + /// For a fixed-size type, typlen is the number of bytes in the internal representation of the type. But for a variable-length type, typlen is negative. -1 indicates a "varlena" type (one that has a length word), -2 indicates a null-terminated C string. pub typlen: i16, pub typbyval: bool, pub typtype: &'a str, @@ -29,6 +29,8 @@ pub struct PgType<'a> { pub typbasetype: u32, pub typreceive: &'static str, pub typreceive_oid: u32, + pub typsend: &'static str, + pub typoutput: &'static str, } impl PgType<'_> { @@ -63,6 +65,183 @@ impl PgType<'_> { } } + pub fn get_typoutput(&self) -> String { + if let Some(ty_id) = PgTypeId::from_oid(self.oid) { + match ty_id { + PgTypeId::ARRAYTEXT + | PgTypeId::ARRAYINT2 + | PgTypeId::ARRAYINT4 + | PgTypeId::ARRAYINT8 + | PgTypeId::ARRAYFLOAT4 + | PgTypeId::ARRAYFLOAT8 + | PgTypeId::ARRAYBOOL + | PgTypeId::ARRAYBYTEA + | PgTypeId::ARRAYNAME + | PgTypeId::ARRAYTID + | PgTypeId::ARRAYBPCHAR + | PgTypeId::ARRAYVARCHAR + | PgTypeId::ARRAYOID + | PgTypeId::ARRAYACLITEM + | PgTypeId::ARRAYINET + | PgTypeId::ARRAYTIMESTAMP + | PgTypeId::ARRAYDATE + | PgTypeId::ARRAYTIME + | PgTypeId::ARRAYTIMESTAMPTZ + | PgTypeId::ARRAYINTERVAL + | PgTypeId::ARRAYNUMERIC + | PgTypeId::ARRAYTIMETZ + | PgTypeId::ARRAYRECORD + | PgTypeId::ARRAYPGLSN + | PgTypeId::ARRAYINT4RANGE + | PgTypeId::ARRAYNUMRANGE + | PgTypeId::ARRAYTSRANGE + | PgTypeId::ARRAYTSTZRANGE + | PgTypeId::ARRAYDATERANGE + | PgTypeId::ARRAYINT8RANGE + | PgTypeId::ARRAYINT4MULTIRANGE + | PgTypeId::ARRAYNUMMULTIRANGE + | PgTypeId::ARRAYTSMULTIRANGE + | PgTypeId::ARRAYDATEMULTIRANGE + | PgTypeId::ARRAYINT8MULTIRANGE + | PgTypeId::ARRAYPGAM + | PgTypeId::ARRAYPGLANGUAGE + | PgTypeId::ARRAYPGEVENTTRIGGER + | PgTypeId::ARRAYPGCAST + | PgTypeId::ARRAYPGEXTENSION + | PgTypeId::ARRAYPGFOREIGNDATAWRAPPER + | PgTypeId::ARRAYPGFOREIGNSERVER + | PgTypeId::ARRAYPGCONSTRAINT + | PgTypeId::ARRAYPGNAMESPACE + | PgTypeId::ARRAYPGCLASS + | PgTypeId::ARRAYMONEY => "array_out".to_string(), + PgTypeId::TIMESTAMP + | PgTypeId::TIMESTAMPTZ + | PgTypeId::DATE + | PgTypeId::TIME + | PgTypeId::TIMETZ => self.typname.to_owned() + "_out", + PgTypeId::TSMULTIRANGE + | PgTypeId::NUMMULTIRANGE + | PgTypeId::DATEMULTIRANGE + | PgTypeId::INT4MULTIRANGE + | PgTypeId::INT8MULTIRANGE => "multirange_out".to_string(), + PgTypeId::INT4RANGE + | PgTypeId::INT8RANGE + | PgTypeId::NUMRANGE + | PgTypeId::TSRANGE + | PgTypeId::TSTZRANGE + | PgTypeId::DATERANGE + | PgTypeId::ANYRANGE => "range_out".to_string(), + PgTypeId::MONEY => "cash_out".to_string(), + PgTypeId::RECORD => "record_out".to_string(), + PgTypeId::PGCLASS + | PgTypeId::PGNAMESPACE + | PgTypeId::PGAM + | PgTypeId::PGLANGUAGE + | PgTypeId::PGEVENTTRIGGER + | PgTypeId::PGCAST + | PgTypeId::PGEXTENSION + | PgTypeId::PGFOREIGNDATAWRAPPER + | PgTypeId::PGFOREIGNSERVER + | PgTypeId::PGCONSTRAINT => "record_out".to_string(), + PgTypeId::ANYARRAY => "anyarray_out".to_string(), + PgTypeId::ANYELEMENT | PgTypeId::ANYENUM => "-".to_string(), + PgTypeId::CHARACTERDATA | PgTypeId::SQLIDENTIFIER => "domain_out".to_string(), + _ => self.typname.to_owned() + "out", + } + } else { + "record_out".to_string() + } + } + + pub fn get_typsend(&self) -> String { + if let Some(ty_id) = PgTypeId::from_oid(self.oid) { + match ty_id { + PgTypeId::ARRAYTEXT + | PgTypeId::ARRAYINT2 + | PgTypeId::ARRAYINT4 + | PgTypeId::ARRAYINT8 + | PgTypeId::ARRAYFLOAT4 + | PgTypeId::ARRAYFLOAT8 + | PgTypeId::ARRAYBOOL + | PgTypeId::ARRAYBYTEA + | PgTypeId::ARRAYNAME + | PgTypeId::ARRAYTID + | PgTypeId::ARRAYBPCHAR + | PgTypeId::ARRAYVARCHAR + | PgTypeId::ARRAYOID + | PgTypeId::ARRAYACLITEM + | PgTypeId::ARRAYINET + | PgTypeId::ARRAYTIMESTAMP + | PgTypeId::ARRAYDATE + | PgTypeId::ARRAYTIME + | PgTypeId::ARRAYTIMESTAMPTZ + | PgTypeId::ARRAYINTERVAL + | PgTypeId::ARRAYNUMERIC + | PgTypeId::ARRAYTIMETZ + | PgTypeId::ARRAYRECORD + | PgTypeId::ARRAYPGLSN + | PgTypeId::ARRAYINT4RANGE + | PgTypeId::ARRAYNUMRANGE + | PgTypeId::ARRAYTSRANGE + | PgTypeId::ARRAYTSTZRANGE + | PgTypeId::ARRAYDATERANGE + | PgTypeId::ARRAYINT8RANGE + | PgTypeId::ARRAYINT4MULTIRANGE + | PgTypeId::ARRAYNUMMULTIRANGE + | PgTypeId::ARRAYTSMULTIRANGE + | PgTypeId::ARRAYDATEMULTIRANGE + | PgTypeId::ARRAYINT8MULTIRANGE + | PgTypeId::ARRAYPGAM + | PgTypeId::ARRAYPGLANGUAGE + | PgTypeId::ARRAYPGEVENTTRIGGER + | PgTypeId::ARRAYPGCAST + | PgTypeId::ARRAYPGEXTENSION + | PgTypeId::ARRAYPGFOREIGNDATAWRAPPER + | PgTypeId::ARRAYPGFOREIGNSERVER + | PgTypeId::ARRAYPGCONSTRAINT + | PgTypeId::ARRAYPGNAMESPACE + | PgTypeId::ARRAYPGCLASS + | PgTypeId::ARRAYMONEY => "array_send".to_string(), + PgTypeId::TIMESTAMP + | PgTypeId::TIMESTAMPTZ + | PgTypeId::DATE + | PgTypeId::TIME + | PgTypeId::TIMETZ => self.typname.to_owned() + "_send", + PgTypeId::TSMULTIRANGE + | PgTypeId::NUMMULTIRANGE + | PgTypeId::DATEMULTIRANGE + | PgTypeId::INT4MULTIRANGE + | PgTypeId::INT8MULTIRANGE => "multirange_send".to_string(), + PgTypeId::INT4RANGE + | PgTypeId::INT8RANGE + | PgTypeId::NUMRANGE + | PgTypeId::TSRANGE + | PgTypeId::TSTZRANGE + | PgTypeId::DATERANGE + | PgTypeId::ANYRANGE => "range_send".to_string(), + PgTypeId::MONEY => "cash_send".to_string(), + PgTypeId::RECORD => "record_send".to_string(), + PgTypeId::PGCLASS + | PgTypeId::PGNAMESPACE + | PgTypeId::PGAM + | PgTypeId::PGLANGUAGE + | PgTypeId::PGEVENTTRIGGER + | PgTypeId::PGCAST + | PgTypeId::PGEXTENSION + | PgTypeId::PGFOREIGNDATAWRAPPER + | PgTypeId::PGFOREIGNSERVER + | PgTypeId::PGCONSTRAINT => "record_send".to_string(), + PgTypeId::ANYARRAY => "anyarray_send".to_string(), + PgTypeId::ANYELEMENT | PgTypeId::ANYENUM => "-".to_string(), + PgTypeId::ACLITEM => "-".to_string(), + PgTypeId::CHARACTERDATA | PgTypeId::SQLIDENTIFIER => "domain_send".to_string(), + _ => self.typname.to_owned() + "send", + } + } else { + "record_send".to_string() + } + } + pub const fn is_binary_supported(&self) -> bool { // Right now, We assume that all types have binary encoding support true @@ -133,6 +312,8 @@ const UNSPECIFIED: &PgType = &PgType { typbasetype: 0, typreceive: "", typreceive_oid: 0, + typsend: "-", + typoutput: "-", }; define_pg_types![ @@ -156,6 +337,8 @@ define_pg_types![ typbasetype: 0, typreceive: "boolrecv", typreceive_oid: 2436, + typsend: "boolsend", + typoutput: "boolout", }, BYTEA (17) { @@ -177,8 +360,9 @@ define_pg_types![ typstorage: "x", typbasetype: 0, typreceive: "bytearecv", - // TODO: Get from pg_proc - typreceive_oid: 0, + typreceive_oid: 2412, + typsend: "byteasend", + typoutput: "byteaout", }, NAME (19) { @@ -200,8 +384,9 @@ define_pg_types![ typstorage: "p", typbasetype: 0, typreceive: "namerecv", - // TODO: Get from pg_proc - typreceive_oid: 0, + typreceive_oid: 2422, + typsend: "namesend", + typoutput: "nameout", }, INT8 (20) { @@ -224,6 +409,8 @@ define_pg_types![ typbasetype: 0, typreceive: "int8recv", typreceive_oid: 2408, + typsend: "int8send", + typoutput: "int8out", }, INT2 (21) { @@ -245,8 +432,9 @@ define_pg_types![ typstorage: "p", typbasetype: 0, typreceive: "int2recv", - // TODO: Get from pg_proc - typreceive_oid: 0, + typreceive_oid: 2404, + typsend: "int2send", + typoutput: "int2out", }, INT4 (23) { @@ -269,6 +457,8 @@ define_pg_types![ typbasetype: 0, typreceive: "int4recv", typreceive_oid: 2406, + typsend: "int4send", + typoutput: "int4out", }, TEXT (25) { @@ -291,6 +481,8 @@ define_pg_types![ typbasetype: 0, typreceive: "textrecv", typreceive_oid: 2414, + typsend: "textsend", + typoutput: "textout", }, OID (26) { @@ -312,8 +504,9 @@ define_pg_types![ typstorage: "p", typbasetype: 0, typreceive: "oidrecv", - // TODO: Get from pg_proc - typreceive_oid: 0, + typreceive_oid: 2418, + typsend: "oidsend", + typoutput: "oidout", }, TID (27) { @@ -335,8 +528,9 @@ define_pg_types![ typstorage: "p", typbasetype: 0, typreceive: "tidrecv", - // TODO: Get from pg_proc - typreceive_oid: 0, + typreceive_oid: 2440, + typsend: "tidsend", + typoutput: "tidout", }, PGCLASS (83) { @@ -360,6 +554,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGCLASS (273) { @@ -383,6 +579,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, FLOAT4 (700) { @@ -405,6 +603,8 @@ define_pg_types![ typbasetype: 0, typreceive: "float4recv", typreceive_oid: 2424, + typsend: "-", + typoutput: "-", }, FLOAT8 (701) { @@ -427,6 +627,8 @@ define_pg_types![ typbasetype: 0, typreceive: "float8recv", typreceive_oid: 2426, + typsend: "-", + typoutput: "-", }, MONEY (790) { @@ -450,6 +652,8 @@ define_pg_types![ typreceive: "cash_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYMONEY (791) { @@ -473,6 +677,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INET (869) { @@ -496,6 +702,8 @@ define_pg_types![ typreceive: "inet_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYBOOL (1000) { @@ -519,6 +727,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYBYTEA (1001) { @@ -542,6 +752,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYNAME (1003) { @@ -565,6 +777,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT2 (1005) { @@ -588,6 +802,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT4 (1007) { @@ -611,6 +827,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTEXT (1009) { @@ -634,6 +852,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTID (1010) { @@ -657,6 +877,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYBPCHAR (1014) { @@ -680,6 +902,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYVARCHAR (1015) { @@ -703,6 +927,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT8 (1016) { @@ -726,6 +952,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYFLOAT4 (1021) { @@ -749,6 +977,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYFLOAT8 (1022) { @@ -772,6 +1002,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYOID (1028) { @@ -795,6 +1027,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ACLITEM (1033) { @@ -818,6 +1052,8 @@ define_pg_types![ typreceive: "-", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYACLITEM (1034) { @@ -841,6 +1077,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINET (1041) { @@ -864,6 +1102,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, BPCHAR (1042) { @@ -887,6 +1127,8 @@ define_pg_types![ typreceive: "bpcharrecv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, VARCHAR (1043) { @@ -909,6 +1151,8 @@ define_pg_types![ typbasetype: 0, typreceive: "varcharrecv", typreceive_oid: 2432, + typsend: "-", + typoutput: "-", }, DATE (1082) { @@ -932,6 +1176,8 @@ define_pg_types![ typreceive: "date_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TIME (1083) { @@ -955,6 +1201,8 @@ define_pg_types![ typreceive: "time_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TIMESTAMP (1114) { @@ -977,6 +1225,8 @@ define_pg_types![ typbasetype: 0, typreceive: "timestamp_recv", typreceive_oid: 2474, + typsend: "-", + typoutput: "-", }, ARRAYTIMESTAMP (1115) { @@ -1000,6 +1250,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYDATE (1182) { @@ -1023,6 +1275,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTIME (1183) { @@ -1046,6 +1300,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TIMESTAMPTZ (1184) { @@ -1069,6 +1325,8 @@ define_pg_types![ typreceive: "timestamptz_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTIMESTAMPTZ (1185) { @@ -1092,6 +1350,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INTERVAL (1186) { @@ -1115,6 +1375,8 @@ define_pg_types![ typreceive: "interval_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINTERVAL (1187) { @@ -1138,6 +1400,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYNUMERIC (1231) { @@ -1161,6 +1425,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TIMETZ (1266) { @@ -1184,6 +1450,8 @@ define_pg_types![ typreceive: "timetz_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTIMETZ (1270) { @@ -1207,6 +1475,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, NUMERIC (1700) { @@ -1229,6 +1499,8 @@ define_pg_types![ typbasetype: 0, typreceive: "numeric_recv", typreceive_oid: 2460, + typsend: "-", + typoutput: "-", }, RECORD (2249) { @@ -1252,6 +1524,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ANYARRAY (2277) { @@ -1275,6 +1549,8 @@ define_pg_types![ typreceive: "anyarray_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ANYELEMENT (2283) { @@ -1298,6 +1574,8 @@ define_pg_types![ typreceive: "-", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYRECORD (2287) { @@ -1321,6 +1599,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGLSN (3220) { @@ -1344,6 +1624,8 @@ define_pg_types![ typreceive: "pg_lsn_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGLSN (3221) { @@ -1367,6 +1649,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ANYENUM (3500) { @@ -1390,6 +1674,8 @@ define_pg_types![ typreceive: "-", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ANYRANGE (3831) { @@ -1413,6 +1699,8 @@ define_pg_types![ typreceive: "-", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INT4RANGE (3904) { @@ -1436,6 +1724,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT4RANGE (3905) { @@ -1459,6 +1749,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, NUMRANGE (3906) { @@ -1482,6 +1774,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYNUMRANGE (3907) { @@ -1505,6 +1799,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TSRANGE (3908) { @@ -1528,6 +1824,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTSRANGE (3909) { @@ -1551,6 +1849,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TSTZRANGE (3910) { @@ -1574,6 +1874,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTSTZRANGE (3911) { @@ -1597,6 +1899,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, DATERANGE (3912) { @@ -1620,6 +1924,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYDATERANGE (3913) { @@ -1643,6 +1949,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INT8RANGE (3926) { @@ -1666,6 +1974,8 @@ define_pg_types![ typreceive: "range_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT8RANGE (3927) { @@ -1689,6 +1999,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INT4MULTIRANGE (4451) { @@ -1712,6 +2024,8 @@ define_pg_types![ typreceive: "multirange_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, NUMMULTIRANGE (4532) { @@ -1735,6 +2049,8 @@ define_pg_types![ typreceive: "multirange_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, TSMULTIRANGE (4533) { @@ -1758,6 +2074,8 @@ define_pg_types![ typreceive: "multirange_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, DATEMULTIRANGE (4535) { @@ -1781,6 +2099,8 @@ define_pg_types![ typreceive: "multirange_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, INT8MULTIRANGE (4536) { @@ -1804,6 +2124,8 @@ define_pg_types![ typreceive: "multirange_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT4MULTIRANGE (6150) { @@ -1827,6 +2149,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYNUMMULTIRANGE (6151) { @@ -1850,6 +2174,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYTSMULTIRANGE (6152) { @@ -1873,6 +2199,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYDATEMULTIRANGE (6155) { @@ -1896,6 +2224,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYINT8MULTIRANGE (6157) { @@ -1919,6 +2249,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGAM (10014) { @@ -1942,6 +2274,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGAM (10015) { @@ -1965,6 +2299,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGLANGUAGE (10020) { @@ -1988,6 +2324,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGLANGUAGE (10021) { @@ -2011,6 +2349,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGEVENTTRIGGER (10038) { @@ -2034,6 +2374,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGEVENTTRIGGER (10039) { @@ -2057,6 +2399,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGCAST (10042) { @@ -2080,6 +2424,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGCAST (10043) { @@ -2103,6 +2449,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGEXTENSION (10073) { @@ -2126,6 +2474,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGEXTENSION (10074) { @@ -2149,6 +2499,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGFOREIGNDATAWRAPPER (10075) { @@ -2172,6 +2524,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGFOREIGNDATAWRAPPER (10076) { @@ -2195,6 +2549,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGFOREIGNSERVER (10077) { @@ -2218,6 +2574,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGFOREIGNSERVER (10078) { @@ -2241,6 +2599,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGCONSTRAINT (12002) { @@ -2264,6 +2624,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGCONSTRAINT (12003) { @@ -2287,6 +2649,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ARRAYPGNAMESPACE (12046) { @@ -2310,6 +2674,8 @@ define_pg_types![ typreceive: "array_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, PGNAMESPACE (12047) { @@ -2333,6 +2699,8 @@ define_pg_types![ typreceive: "record_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, CHARACTERDATA (13408) { @@ -2356,6 +2724,8 @@ define_pg_types![ typreceive: "domain_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, SQLIDENTIFIER (13410) { @@ -2379,6 +2749,8 @@ define_pg_types![ typreceive: "domain_recv", // TODO: Get from pg_proc typreceive_oid: 0, + typsend: "-", + typoutput: "-", }, ];