From 7afa6fdb69c9d1fd97c976b253551988c2dccf8d Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Sun, 11 Jan 2026 19:54:42 -0500 Subject: [PATCH 1/6] start --- examples/recipes/ecto/compose.yml | 42 +++++ .../ecto/model/cubes/datatypes_test.yml | 109 ++++++++++++ .../ecto/model/cubes/mandata_captate.yaml | 162 +++++++++++++++++ .../ecto/model/cubes/of_addresses.yaml | 135 ++++++++++++++ .../ecto/model/cubes/of_customers.yaml | 123 +++++++++++++ examples/recipes/ecto/model/cubes/orders.yaml | 119 +++++++++++++ .../ecto/model/cubes/orders_no_preagg.yaml | 54 ++++++ .../ecto/model/cubes/orders_with_preagg.yaml | 166 ++++++++++++++++++ .../ecto/model/cubes/power_customers.yaml | 92 ++++++++++ 9 files changed, 1002 insertions(+) create mode 100644 examples/recipes/ecto/compose.yml create mode 100644 examples/recipes/ecto/model/cubes/datatypes_test.yml create mode 100644 examples/recipes/ecto/model/cubes/mandata_captate.yaml create mode 100644 examples/recipes/ecto/model/cubes/of_addresses.yaml create mode 100644 examples/recipes/ecto/model/cubes/of_customers.yaml create mode 100644 examples/recipes/ecto/model/cubes/orders.yaml create mode 100644 examples/recipes/ecto/model/cubes/orders_no_preagg.yaml create mode 100644 examples/recipes/ecto/model/cubes/orders_with_preagg.yaml create mode 100644 examples/recipes/ecto/model/cubes/power_customers.yaml diff --git a/examples/recipes/ecto/compose.yml b/examples/recipes/ecto/compose.yml new file mode 100644 index 0000000000000..196400b65ba62 --- /dev/null +++ b/examples/recipes/ecto/compose.yml @@ -0,0 +1,42 @@ +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 + + cube_api: + container_name: cube_cube_api + restart: always + image: cubejs/cube:latest + ports: + - 4009:4000 + - 9432:9432 + environment: + CUBEJS_DB_QUERY_TIMEOUT: 60m + CUBEJS_CONCURRENCY: 128 + CUBEJS_PG_SQL_PORT: 9432 + CUBEJS_DB_MAX_POOL: 128 + CUBEJS_DB_TYPE: postgres + CUBEJS_DB_PORT: 5432 + CUBEJS_DB_NAME: pot_examples_dev + CUBEJS_DB_HOST: postgresql + CUBEJS_DB_USER: postgres + CUBEJS_DB_PASS: postgres + CUBEJS_API_SECRET: secret + CUBEJS_DEV_MODE: true + DEBUG_LOG: true + CUBESQL_LOG_LEVEL: debug + CUBEJS_LOG_LEVEL: debug + volumes: + - ./:/cube/conf + +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 From 26c6e64ccd81704d65740c92a955d77f2b94bce2 Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Sun, 11 Jan 2026 20:29:35 -0500 Subject: [PATCH 2/6] copy old --- examples/recipes/ecto/.gitignore | 22 ++ examples/recipes/ecto/_compose.yml | 42 +++ examples/recipes/ecto/build-and-run.sh | 66 ++++ examples/recipes/ecto/cleanup.sh | 35 ++ examples/recipes/ecto/compose.yml | 26 -- examples/recipes/ecto/dev-start.sh | 139 ++++++++ examples/recipes/ecto/fix-formatting.sh | 38 +++ examples/recipes/ecto/package.json | 78 +++++ examples/recipes/ecto/rebuild-after-rebase.sh | 322 ++++++++++++++++++ examples/recipes/ecto/run-ci-tests-local.sh | 145 ++++++++ examples/recipes/ecto/run-clippy.sh | 78 +++++ examples/recipes/ecto/run-docker.sh | 12 + examples/recipes/ecto/run-quick-checks.sh | 87 +++++ examples/recipes/ecto/run-tests-only.sh | 91 +++++ examples/recipes/ecto/setup_test_data.sh | 49 +++ examples/recipes/ecto/start-cube-api.sh | 108 ++++++ examples/recipes/ecto/start-cubesqld.sh | 144 ++++++++ examples/recipes/ecto/verify-build.sh | 86 +++++ 18 files changed, 1542 insertions(+), 26 deletions(-) create mode 100644 examples/recipes/ecto/.gitignore create mode 100644 examples/recipes/ecto/_compose.yml create mode 100755 examples/recipes/ecto/build-and-run.sh create mode 100755 examples/recipes/ecto/cleanup.sh create mode 100755 examples/recipes/ecto/dev-start.sh create mode 100755 examples/recipes/ecto/fix-formatting.sh create mode 100644 examples/recipes/ecto/package.json create mode 100755 examples/recipes/ecto/rebuild-after-rebase.sh create mode 100755 examples/recipes/ecto/run-ci-tests-local.sh create mode 100755 examples/recipes/ecto/run-clippy.sh create mode 100644 examples/recipes/ecto/run-docker.sh create mode 100755 examples/recipes/ecto/run-quick-checks.sh create mode 100755 examples/recipes/ecto/run-tests-only.sh create mode 100755 examples/recipes/ecto/setup_test_data.sh create mode 100755 examples/recipes/ecto/start-cube-api.sh create mode 100755 examples/recipes/ecto/start-cubesqld.sh create mode 100755 examples/recipes/ecto/verify-build.sh diff --git a/examples/recipes/ecto/.gitignore b/examples/recipes/ecto/.gitignore new file mode 100644 index 0000000000000..5fa1b78134fee --- /dev/null +++ b/examples/recipes/ecto/.gitignore @@ -0,0 +1,22 @@ +# 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__* diff --git a/examples/recipes/ecto/_compose.yml b/examples/recipes/ecto/_compose.yml new file mode 100644 index 0000000000000..196400b65ba62 --- /dev/null +++ b/examples/recipes/ecto/_compose.yml @@ -0,0 +1,42 @@ +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 + + cube_api: + container_name: cube_cube_api + restart: always + image: cubejs/cube:latest + ports: + - 4009:4000 + - 9432:9432 + environment: + CUBEJS_DB_QUERY_TIMEOUT: 60m + CUBEJS_CONCURRENCY: 128 + CUBEJS_PG_SQL_PORT: 9432 + CUBEJS_DB_MAX_POOL: 128 + CUBEJS_DB_TYPE: postgres + CUBEJS_DB_PORT: 5432 + CUBEJS_DB_NAME: pot_examples_dev + CUBEJS_DB_HOST: postgresql + CUBEJS_DB_USER: postgres + CUBEJS_DB_PASS: postgres + CUBEJS_API_SECRET: secret + CUBEJS_DEV_MODE: true + DEBUG_LOG: true + CUBESQL_LOG_LEVEL: debug + CUBEJS_LOG_LEVEL: debug + volumes: + - ./:/cube/conf + +volumes: + postgresql: diff --git a/examples/recipes/ecto/build-and-run.sh b/examples/recipes/ecto/build-and-run.sh new file mode 100755 index 0000000000000..7bd5df5bcc7b5 --- /dev/null +++ b/examples/recipes/ecto/build-and-run.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Building Cube with ADBC(Arrow Native) Support${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# Get the root directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." +CUBESQL_DIR="$CUBE_ROOT/rust/cubesql" + +# Build cubesql binary +echo -e "${GREEN}Step 1: Building cubesqld binary...${NC}" +cd "$CUBESQL_DIR" +cargo build --release --bin cubesqld + +# Copy binary to dev project bin directory +echo -e "${GREEN}Step 2: Copying cubesqld binary...${NC}" +mkdir -p "$SCRIPT_DIR/bin" +cp "$CUBESQL_DIR/target/release/cubesqld" "$SCRIPT_DIR/bin/" +chmod +x "$SCRIPT_DIR/bin/cubesqld" + +echo "" +echo -e "${GREEN}Build complete!${NC}" +echo "" +echo -e "${YELLOW}Binary location: $SCRIPT_DIR/bin/cubesqld${NC}" +echo "" + +# Check if .env file exists +if [ ! -f "$SCRIPT_DIR/.env" ]; then + echo -e "${YELLOW}Warning: .env file not found. Please create one based on .env.example${NC}" + exit 1 +fi + +# Source the .env file to get configuration +source "$SCRIPT_DIR/.env" + +# Start the server +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Starting Cube SQL Server${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" +echo -e "${GREEN}Configuration:${NC}" +echo -e " PostgreSQL Port: ${CUBEJS_PG_SQL_PORT:-4444}" +echo -e " ADBC Port: ${CUBEJS_ADBC_PORT:-8120}" +echo -e " Database: ${CUBEJS_DB_TYPE}://${CUBEJS_DB_USER}@${CUBEJS_DB_HOST}:${CUBEJS_DB_PORT}/${CUBEJS_DB_NAME}" +echo -e " Log Level: ${CUBESQL_LOG_LEVEL:-info}" +echo "" +echo -e "${YELLOW}Press Ctrl+C to stop the server${NC}" +echo "" + +# Export environment variables for cubesqld +export CUBESQL_PG_PORT="${CUBEJS_PG_SQL_PORT:-4444}" +export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-info}" + +# Run the cubesqld binary +cd "$SCRIPT_DIR" +exec "./bin/cubesqld" diff --git a/examples/recipes/ecto/cleanup.sh b/examples/recipes/ecto/cleanup.sh new file mode 100755 index 0000000000000..7f4c122017837 --- /dev/null +++ b/examples/recipes/ecto/cleanup.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Colors for output +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo -e "${GREEN}Cleaning up Cube development environment...${NC}" + +# Kill any running cube processes +PROCS=$(ps aux | grep -E "(cubesqld|cube-api|cubestore|cubejs)" | grep -v grep | awk '{print $2}') +if [ ! -z "$PROCS" ]; then + echo -e "${YELLOW}Stopping processes: $PROCS${NC}" + echo "$PROCS" | xargs kill 2>/dev/null || true + sleep 1 + # Force kill if still running + echo "$PROCS" | xargs kill -9 2>/dev/null || true +fi + +# Check for processes using our ports +for port in 3030 4008 4444 8120 7432; do + PID=$(lsof -ti :$port 2>/dev/null) + if [ ! -z "$PID" ]; then + echo -e "${YELLOW}Killing process using port $port (PID: $PID)${NC}" + kill $PID 2>/dev/null || kill -9 $PID 2>/dev/null || true + fi +done + +# Remove PID files +rm -f cube-api.pid 2>/dev/null + +echo -e "${GREEN}Cleanup complete!${NC}" +echo "" +echo "You can now start fresh with:" +echo " ./dev-start.sh" diff --git a/examples/recipes/ecto/compose.yml b/examples/recipes/ecto/compose.yml index 196400b65ba62..287d8e3192400 100644 --- a/examples/recipes/ecto/compose.yml +++ b/examples/recipes/ecto/compose.yml @@ -12,31 +12,5 @@ services: volumes: - postgresql:/var/lib/postgresql/data - cube_api: - container_name: cube_cube_api - restart: always - image: cubejs/cube:latest - ports: - - 4009:4000 - - 9432:9432 - environment: - CUBEJS_DB_QUERY_TIMEOUT: 60m - CUBEJS_CONCURRENCY: 128 - CUBEJS_PG_SQL_PORT: 9432 - CUBEJS_DB_MAX_POOL: 128 - CUBEJS_DB_TYPE: postgres - CUBEJS_DB_PORT: 5432 - CUBEJS_DB_NAME: pot_examples_dev - CUBEJS_DB_HOST: postgresql - CUBEJS_DB_USER: postgres - CUBEJS_DB_PASS: postgres - CUBEJS_API_SECRET: secret - CUBEJS_DEV_MODE: true - DEBUG_LOG: true - CUBESQL_LOG_LEVEL: debug - CUBEJS_LOG_LEVEL: debug - volumes: - - ./:/cube/conf - volumes: postgresql: diff --git a/examples/recipes/ecto/dev-start.sh b/examples/recipes/ecto/dev-start.sh new file mode 100755 index 0000000000000..330dec355f6e7 --- /dev/null +++ b/examples/recipes/ecto/dev-start.sh @@ -0,0 +1,139 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "$SCRIPT_DIR" + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Cube ADBC(Arrow Native) Development Setup${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 +source .env + +# 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 +} + +# Step 1: Start PostgreSQL +echo -e "${GREEN}Step 1: Starting PostgreSQL database...${NC}" +if check_port 7432; then + echo -e "${YELLOW}PostgreSQL already running on port 7432${NC}" +else + docker-compose up -d postgres + echo "Waiting for PostgreSQL to be ready..." + sleep 3 +fi + +# Step 2: Build cubesql with ADBC(Arrow Native) support +echo "" +echo -e "${GREEN}Step 2: Building cubesqld with ADBC(Arrow Native) support...${NC}" +CUBE_ROOT="$SCRIPT_DIR/../../.." +cd "$CUBE_ROOT/rust/cubesql" +cargo build --release --bin cubesqld +mkdir -p "$SCRIPT_DIR/bin" +cp "target/release/cubesqld" "$SCRIPT_DIR/bin/" +chmod +x "$SCRIPT_DIR/bin/cubesqld" +cd "$SCRIPT_DIR" + +# Step 3: Start Cube.js API server +echo "" +echo -e "${GREEN}Step 3: Starting Cube.js API server...${NC}" +if check_port ${PORT:-4008}; then + echo -e "${YELLOW}Cube.js API already running on port ${PORT:-4008}${NC}" + CUBE_API_URL="http://localhost:${PORT:-4008}" +else + echo "Starting Cube.js server in background..." + yarn dev > cube-api.log 2>&1 & + CUBE_API_PID=$! + echo $CUBE_API_PID > cube-api.pid + + # Wait for Cube.js to be ready + echo "Waiting for Cube.js API to be ready..." + for i in {1..30}; do + if check_port ${PORT:-4008}; then + echo -e "${GREEN}Cube.js API is ready!${NC}" + break + fi + sleep 1 + done + + CUBE_API_URL="http://localhost:${PORT:-4008}" +fi + +# Generate a test token (in production this would be from auth) +# For dev mode, Cube.js typically uses 'test' or generates one +CUBE_TOKEN="${CUBESQL_CUBE_TOKEN:-test}" + +# Step 4: Start cubesql with both PostgreSQL and ADBC(Arrow Native) protocols +echo "" +echo -e "${GREEN}Step 4: Starting cubesqld with ADBC(Arrow Native) support...${NC}" +echo "" +echo -e "${BLUE}Configuration:${NC}" +echo -e " Cube.js API: ${CUBE_API_URL}/cubejs-api/v1" +echo -e " PostgreSQL Port: ${CUBEJS_PG_SQL_PORT:-4444}" +echo -e " ADBC Port: ${CUBEJS_ADBC_PORT:-8120}" +echo -e " Log Level: ${CUBESQL_LOG_LEVEL:-info}" +echo "" +echo -e "${YELLOW}To test the connections:${NC}" +echo -e " PostgreSQL: psql -h 127.0.0.1 -p ${CUBEJS_PG_SQL_PORT:-4444} -U root" +echo -e " ADBC: Use ADBC driver on port ${CUBEJS_ADBC_PORT:-8120}" +echo "" +echo -e "${YELLOW}Logs:${NC}" +echo -e " Cube.js API: tail -f $SCRIPT_DIR/cube-api.log" +echo -e " cubesqld: See output below" +echo "" +echo -e "${YELLOW}Press Ctrl+C to stop${NC}" +echo "" + +# Export environment variables for cubesqld +export CUBESQL_CUBE_URL="${CUBE_API_URL}/cubejs-api/v1" +export CUBESQL_CUBE_TOKEN="${CUBE_TOKEN}" +export CUBESQL_PG_PORT="${CUBEJS_PG_SQL_PORT:-4444}" +export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-info}" + +# Cleanup function +cleanup() { + echo "" + echo -e "${YELLOW}Shutting down...${NC}" + + # Kill cubesql (handled by trap) + + # Optionally stop Cube.js API + if [ -f cube-api.pid ]; then + CUBE_PID=$(cat cube-api.pid) + if ps -p $CUBE_PID > /dev/null 2>&1; then + echo "Stopping Cube.js API (PID: $CUBE_PID)..." + kill $CUBE_PID 2>/dev/null || true + rm cube-api.pid + fi + fi + + echo -e "${GREEN}Cleanup complete${NC}" +} + +trap cleanup EXIT + +# Run cubesqld +exec ./bin/cubesqld diff --git a/examples/recipes/ecto/fix-formatting.sh b/examples/recipes/ecto/fix-formatting.sh new file mode 100755 index 0000000000000..3167241cc4920 --- /dev/null +++ b/examples/recipes/ecto/fix-formatting.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Fixing Rust Formatting${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +echo -e "${YELLOW}Formatting CubeSQL...${NC}" +cd "$CUBE_ROOT/rust/cubesql" && cargo fmt --all +echo -e "${GREEN}✓ CubeSQL formatted${NC}" + +echo -e "${YELLOW}Formatting Native...${NC}" +cd "$CUBE_ROOT/packages/cubejs-backend-native" && cargo fmt --all +echo -e "${GREEN}✓ Native formatted${NC}" + +echo -e "${YELLOW}Formatting cubenativeutils...${NC}" +cd "$CUBE_ROOT/rust/cubenativeutils" && cargo fmt --all +echo -e "${GREEN}✓ cubenativeutils formatted${NC}" + +echo -e "${YELLOW}Formatting cubesqlplanner...${NC}" +cd "$CUBE_ROOT/rust/cubesqlplanner" && cargo fmt --all +echo -e "${GREEN}✓ cubesqlplanner formatted${NC}" + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}✓ All Rust code formatted!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo "You can now commit your changes." diff --git a/examples/recipes/ecto/package.json b/examples/recipes/ecto/package.json new file mode 100644 index 0000000000000..15665cfbdda6d --- /dev/null +++ b/examples/recipes/ecto/package.json @@ -0,0 +1,78 @@ +{ + "name": "cubejs", + "version": "0.1.0", + "description": "", + "private": true, + "workspaces": { + "packages": [ + "rust/*", + "packages/*" + ], + "nohoist": [ + "packages/cubejs-client-ngx/*", + "**/vue/*", + "**/inquirer" + ] + }, + "scripts": { + "build": "yarn lerna run build:client-core && rollup -c", + "watch": "rollup -c -w", + "watch-local": "CUBEJS_API_URL=http://localhost:6020/cubejs-api/v1 rollup -c -w", + "lint:npm": "yarn npmPkgJsonLint packages/*/package.json rust/package.json", + "lint": "yarn lint:npm && yarn lerna run lint", + "lint:fix": "lerna run lint:fix", + "tsc": "tsc --build", + "tsc:watch": "tsc --build --watch", + "clean": "rimraf packages/*/{tsconfig.tsbuildinfo,lib,dist}" + }, + "author": "Cube Dev, Inc.", + "dependencies": { + "core-js": "^3.34.0", + "lerna": "^9.0.0" + }, + "files": [ + "src", + "dist" + ], + "devDependencies": { + "@babel/core": "^7.13.8", + "@babel/plugin-transform-runtime": "^7.13.9", + "@babel/preset-env": "^7.13.9", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/runtime": "^7.13.9", + "@rollup/plugin-alias": "^3.1.2", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^17.1.0", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^11.2.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@types/fs-extra": "^9.0.1", + "@types/jest": "^27", + "flush-promises": "^1.0.2", + "husky": "^5.0.4", + "is-ci": "^2.0.0", + "less": "^3.13.1", + "npm-package-json-lint": "^5.1.0", + "postcss": "^8.2.8", + "prettier": "^2.0.5", + "rimraf": "^3.0.2", + "rollup": "2.53.1", + "rollup-plugin-peer-deps-external": "^2.2.4", + "rollup-plugin-tsconfig-paths": "^1.5.2", + "typescript": "~5.2.2" + }, + "repository": { + "type": "git", + "url": "https://github.com/cube-js/cube.git" + }, + "resolutions": { + "es5-ext": "0.10.53", + "lodash": "^4.17.0", + "@types/node": "^20", + "@types/ramda": "0.27.40", + "thrift": "0.20.0" + }, + "license": "MIT", + "packageManager": "yarn@1.22.19" +} 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/run-ci-tests-local.sh b/examples/recipes/ecto/run-ci-tests-local.sh new file mode 100755 index 0000000000000..c7a7c1b1c5bd4 --- /dev/null +++ b/examples/recipes/ecto/run-ci-tests-local.sh @@ -0,0 +1,145 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Running Local CI Tests (like GitHub)${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +# Track failures +FAILURES=0 + +# Function to run a test step +run_test() { + local name="$1" + local command="$2" + + echo -e "${BLUE}>>> $name${NC}" + if eval "$command"; then + echo -e "${GREEN}✓ $name passed${NC}" + echo "" + return 0 + else + echo -e "${RED}✗ $name failed${NC}" + echo "" + FAILURES=$((FAILURES + 1)) + return 1 + fi +} + +# ============================================ +# 1. LINT CHECKS (fmt + clippy) +# ============================================ + +echo -e "${YELLOW}=== LINT CHECKS ===${NC}" +echo "" + +run_test "Lint CubeSQL (fmt)" \ + "cd $CUBE_ROOT/rust/cubesql && cargo fmt --all -- --check" + +run_test "Lint Native (fmt)" \ + "cd $CUBE_ROOT/packages/cubejs-backend-native && cargo fmt --all -- --check" + +run_test "Lint cubenativeutils (fmt)" \ + "cd $CUBE_ROOT/rust/cubenativeutils && cargo fmt --all -- --check" + +run_test "Lint cubesqlplanner (fmt)" \ + "cd $CUBE_ROOT/rust/cubesqlplanner && cargo fmt --all -- --check" + +run_test "Clippy CubeSQL" \ + "cd $CUBE_ROOT/rust/cubesql && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" + +run_test "Clippy Native" \ + "cd $CUBE_ROOT/packages/cubejs-backend-native && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" + +run_test "Clippy cubenativeutils" \ + "cd $CUBE_ROOT/rust/cubenativeutils && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" + +run_test "Clippy cubesqlplanner" \ + "cd $CUBE_ROOT/rust/cubesqlplanner && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" + +# ============================================ +# 2. UNIT TESTS (Rewrite Engine) +# ============================================ + +echo -e "${YELLOW}=== UNIT TESTS ===${NC}" +echo "" + +# Check if cargo-insta is installed +if ! command -v cargo-insta &> /dev/null; then + echo -e "${YELLOW}Installing cargo-insta...${NC}" + cargo install cargo-insta --version 1.42.0 +fi + +run_test "Unit tests (Rewrite Engine)" \ + "cd $CUBE_ROOT/rust/cubesql && \ + export CUBESQL_SQL_PUSH_DOWN=true && \ + export CUBESQL_REWRITE_CACHE=true && \ + export CUBESQL_REWRITE_TIMEOUT=60 && \ + cargo insta test --all-features --workspace --unreferenced warn" + +# ============================================ +# 3. NATIVE BUILD & TESTS +# ============================================ + +echo -e "${YELLOW}=== NATIVE BUILD & TESTS ===${NC}" +echo "" + +# Ensure dependencies are installed +run_test "Yarn install" \ + "cd $CUBE_ROOT && yarn install --frozen-lockfile" + +run_test "Lerna tsc" \ + "cd $CUBE_ROOT && yarn tsc" + +run_test "Build native (debug)" \ + "cd $CUBE_ROOT/packages/cubejs-backend-native && yarn run native:build-debug" + +run_test "Native unit tests" \ + "cd $CUBE_ROOT/packages/cubejs-backend-native && \ + export CUBESQL_STREAM_MODE=true && \ + export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ + yarn run test:unit" + +# ============================================ +# 4. E2E SMOKE TESTS +# ============================================ + +echo -e "${YELLOW}=== E2E SMOKE TESTS ===${NC}" +echo "" + +run_test "E2E Smoke testing over whole Cube" \ + "cd $CUBE_ROOT/packages/cubejs-testing && \ + export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ + yarn smoke:cubesql" + +# ============================================ +# SUMMARY +# ============================================ + +echo "" +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}TEST SUMMARY${NC}" +echo -e "${BLUE}========================================${NC}" + +if [ $FAILURES -eq 0 ]; then + echo -e "${GREEN}✓ All tests passed!${NC}" + echo "" + echo "You can commit and push with confidence!" + exit 0 +else + echo -e "${RED}✗ $FAILURES test(s) failed${NC}" + echo "" + echo "Please fix the failing tests before committing." + exit 1 +fi diff --git a/examples/recipes/ecto/run-clippy.sh b/examples/recipes/ecto/run-clippy.sh new file mode 100755 index 0000000000000..c27a6c4f4c50e --- /dev/null +++ b/examples/recipes/ecto/run-clippy.sh @@ -0,0 +1,78 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Running Clippy (Rust Linter)${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +FAILURES=0 + +run_clippy() { + local name="$1" + local dir="$2" + local extra_flags="$3" + + echo -e "${BLUE}>>> Clippy: $name${NC}" + if cd "$dir" && cargo clippy --locked --workspace --all-targets --keep-going $extra_flags -- -D warnings; then + echo -e "${GREEN}✓ $name passed${NC}" + echo "" + return 0 + else + echo -e "${RED}✗ $name failed${NC}" + echo "" + FAILURES=$((FAILURES + 1)) + return 1 + fi +} + +# ============================================ +# RUN CLIPPY ON ALL COMPONENTS +# ============================================ + +run_clippy "CubeSQL" \ + "$CUBE_ROOT/rust/cubesql" \ + "" + +run_clippy "Native" \ + "$CUBE_ROOT/packages/cubejs-backend-native" \ + "" + +run_clippy "Native (with Python)" \ + "$CUBE_ROOT/packages/cubejs-backend-native" \ + "--features python" + +run_clippy "cubenativeutils" \ + "$CUBE_ROOT/rust/cubenativeutils" \ + "" + +run_clippy "cubesqlplanner" \ + "$CUBE_ROOT/rust/cubesqlplanner" \ + "" + +# ============================================ +# SUMMARY +# ============================================ + +echo "" +echo -e "${BLUE}========================================${NC}" + +if [ $FAILURES -eq 0 ]; then + echo -e "${GREEN}✓ All clippy checks passed!${NC}" + exit 0 +else + echo -e "${RED}✗ $FAILURES clippy check(s) failed${NC}" + echo "" + echo "Please fix the clippy warnings before committing." + exit 1 +fi diff --git a/examples/recipes/ecto/run-docker.sh b/examples/recipes/ecto/run-docker.sh new file mode 100644 index 0000000000000..ef187c3274b6d --- /dev/null +++ b/examples/recipes/ecto/run-docker.sh @@ -0,0 +1,12 @@ +#localhost/cubejs/cube:mine + +docker run -d -p 3000:3000 -p 4000:4000 \ + -e CUBEJS_DB_HOST=postgres://localhost \ + -e CUBEJS_DB_NAME= \ + -e CUBEJS_DB_USER= \ + -e CUBEJS_DB_PASS= \ + -e CUBEJS_DB_TYPE= \ + -e CUBEJS_API_SECRET= \ + -v $(pwd):/cube/conf \ + localhost/cubejs/cube:mine +# cubejs/cube:latest diff --git a/examples/recipes/ecto/run-quick-checks.sh b/examples/recipes/ecto/run-quick-checks.sh new file mode 100755 index 0000000000000..79f3a5f5dc891 --- /dev/null +++ b/examples/recipes/ecto/run-quick-checks.sh @@ -0,0 +1,87 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Quick Pre-Commit Checks${NC}" +echo -e "${BLUE}(Runs in ~1-2 minutes)${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +FAILURES=0 + +run_test() { + local name="$1" + local command="$2" + + echo -e "${BLUE}>>> $name${NC}" + if eval "$command"; then + echo -e "${GREEN}✓ $name passed${NC}" + echo "" + return 0 + else + echo -e "${RED}✗ $name failed${NC}" + echo "" + FAILURES=$((FAILURES + 1)) + return 1 + fi +} + +# ============================================ +# QUICK CHECKS (most likely to catch issues) +# ============================================ + +echo -e "${YELLOW}=== FORMAT CHECKS ===${NC}" +echo "" + +run_test "Check Rust formatting" \ + "cd $CUBE_ROOT/rust/cubesql && cargo fmt --all -- --check && \ + cd $CUBE_ROOT/packages/cubejs-backend-native && cargo fmt --all -- --check && \ + cd $CUBE_ROOT/rust/cubenativeutils && cargo fmt --all -- --check && \ + cd $CUBE_ROOT/rust/cubesqlplanner && cargo fmt --all -- --check" + +echo -e "${YELLOW}=== CLIPPY (CubeSQL only) ===${NC}" +echo "" + +run_test "Clippy CubeSQL" \ + "cd $CUBE_ROOT/rust/cubesql && cargo clippy --workspace --all-targets -- -D warnings" + +echo -e "${YELLOW}=== UNIT TESTS (CubeSQL only) ===${NC}" +echo "" + +# Check if cargo-insta is installed +if ! command -v cargo-insta &> /dev/null; then + echo -e "${YELLOW}Installing cargo-insta...${NC}" + cargo install cargo-insta --version 1.42.0 +fi + +run_test "CubeSQL unit tests" \ + "cd $CUBE_ROOT/rust/cubesql && cargo insta test --all-features --unreferenced warn" + +# ============================================ +# SUMMARY +# ============================================ + +echo "" +echo -e "${BLUE}========================================${NC}" + +if [ $FAILURES -eq 0 ]; then + echo -e "${GREEN}✓ Quick checks passed!${NC}" + echo "" + echo -e "${YELLOW}Note: This is a quick check. Run ./run-ci-tests-local.sh for full CI tests.${NC}" + exit 0 +else + echo -e "${RED}✗ $FAILURES check(s) failed${NC}" + echo "" + echo "Please fix the issues before committing." + exit 1 +fi diff --git a/examples/recipes/ecto/run-tests-only.sh b/examples/recipes/ecto/run-tests-only.sh new file mode 100755 index 0000000000000..85ac5a94d690f --- /dev/null +++ b/examples/recipes/ecto/run-tests-only.sh @@ -0,0 +1,91 @@ +#!/bin/bash +set -e + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CUBE_ROOT="$SCRIPT_DIR/../../.." + +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Running Tests Only${NC}" +echo -e "${BLUE}========================================${NC}" +echo "" + +FAILURES=0 + +run_test() { + local name="$1" + local command="$2" + + echo -e "${BLUE}>>> $name${NC}" + if eval "$command"; then + echo -e "${GREEN}✓ $name passed${NC}" + echo "" + return 0 + else + echo -e "${RED}✗ $name failed${NC}" + echo "" + FAILURES=$((FAILURES + 1)) + return 1 + fi +} + +# Check if cargo-insta is installed +if ! command -v cargo-insta &> /dev/null; then + echo -e "${YELLOW}Installing cargo-insta...${NC}" + cargo install cargo-insta --version 1.42.0 + echo "" +fi + +# ============================================ +# RUST UNIT TESTS +# ============================================ + +echo -e "${YELLOW}=== RUST UNIT TESTS ===${NC}" +echo "" + +run_test "CubeSQL unit tests (Rewrite Engine)" \ + "cd $CUBE_ROOT/rust/cubesql && \ + export CUBESQL_SQL_PUSH_DOWN=true && \ + export CUBESQL_REWRITE_CACHE=true && \ + export CUBESQL_REWRITE_TIMEOUT=60 && \ + cargo insta test --all-features --workspace --unreferenced warn" + +# ============================================ +# NATIVE TESTS (if built) +# ============================================ + +if [ -f "$CUBE_ROOT/packages/cubejs-backend-native/index.node" ]; then + echo -e "${YELLOW}=== NATIVE TESTS ===${NC}" + echo "" + + run_test "Native unit tests" \ + "cd $CUBE_ROOT/packages/cubejs-backend-native && \ + export CUBESQL_STREAM_MODE=true && \ + export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ + yarn run test:unit" +else + echo -e "${YELLOW}Skipping native tests (not built)${NC}" + echo -e "${YELLOW}Run: cd packages/cubejs-backend-native && yarn run native:build-debug${NC}" + echo "" +fi + +# ============================================ +# SUMMARY +# ============================================ + +echo "" +echo -e "${BLUE}========================================${NC}" + +if [ $FAILURES -eq 0 ]; then + echo -e "${GREEN}✓ All tests passed!${NC}" + exit 0 +else + echo -e "${RED}✗ $FAILURES test(s) failed${NC}" + exit 1 +fi diff --git a/examples/recipes/ecto/setup_test_data.sh b/examples/recipes/ecto/setup_test_data.sh new file mode 100755 index 0000000000000..2c41426361a45 --- /dev/null +++ b/examples/recipes/ecto/setup_test_data.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Setup test data for ADBC(Arrow Native) cache performance testing + +set -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DB_HOST=${DB_HOST:-localhost} +DB_PORT=${DB_PORT:-7432} +DB_NAME=${DB_NAME:-pot_examples_dev} +DB_USER=${DB_USER:-postgres} +DB_PASS=${DB_PASS:-postgres} + +echo "Setting up test data for ADBC(Arrow Native) performance tests..." +echo "" +echo "Database connection:" +echo " Host: $DB_HOST" +echo " Port: $DB_PORT" +echo " Database: $DB_NAME" +echo " User: $DB_USER" +echo "" + +# Check if database is running +if ! PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c "SELECT 1" > /dev/null 2>&1; then + echo "Error: Cannot connect to PostgreSQL database" + echo "Make sure PostgreSQL is running: docker-compose up -d postgres" + exit 1 +fi + +# Create database if it doesn't exist +PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c "CREATE DATABASE $DB_NAME" 2>/dev/null || true + +# Load sample data +echo "Loading sample data (3000 orders)..." +if [ -f "$SCRIPT_DIR/sample_data.sql.gz" ]; then + gunzip -c "$SCRIPT_DIR/sample_data.sql.gz" | PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME + echo "✓ Sample data loaded successfully" +else + echo "Warning: sample_data.sql.gz not found, skipping data load" +fi + +# Verify data +ROW_COUNT=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c "SELECT COUNT(*) FROM public.order" 2>/dev/null || echo "0") +echo "" +echo "✓ Database ready with $ROW_COUNT orders" +echo "" +echo "Next steps:" +echo " 1. Start Cube API: ./start-cube-api.sh" +echo " 2. Start CubeSQL: ./start-cubesqld.sh" +echo " 3. Run Python tests: python test_arrow_cache_performance.py" diff --git a/examples/recipes/ecto/start-cube-api.sh b/examples/recipes/ecto/start-cube-api.sh new file mode 100755 index 0000000000000..5de5aaf61bdda --- /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/examples/recipes/ecto/start-cubesqld.sh b/examples/recipes/ecto/start-cubesqld.sh new file mode 100755 index 0000000000000..02134b4490f0b --- /dev/null +++ b/examples/recipes/ecto/start-cubesqld.sh @@ -0,0 +1,144 @@ +#!/bin/bash +# Start only the Rust cubesqld server with ADBC Server and PostgreSQL protocols +# Requires Cube.js API server to be running (see start-cube-api.sh) + +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 SQL (cubesqld) Server${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 +source .env + +# 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 if Cube.js API is running +CUBE_API_PORT=${PORT:-4008} +echo -e "${GREEN}Checking Cube.js API server...${NC}" +if ! check_port ${CUBE_API_PORT}; then + echo -e "${RED}Error: Cube.js API is NOT running on port ${CUBE_API_PORT}${NC}" + echo "" + echo "Please start it first with:" + echo " cd $SCRIPT_DIR" + echo " ./start-cube-api.sh" + exit 1 +fi +echo -e "${YELLOW}Cube.js API is running on port ${CUBE_API_PORT}${NC}" + +# Check if cubesqld ports are free +#PG_PORT=${CUBEJS_PG_SQL_PORT:-4444} +ADBC_PORT=${CUBEJS_ADBC_PORT:-8120} + +echo "" +echo -e "${GREEN}Checking port availability...${NC}" +if check_port ${PG_PORT}; then + echo -e "${RED}Error: Port ${PG_PORT} is already in use${NC}" + echo "Kill the process with: kill \$(lsof -ti:${PG_PORT})" + exit 1 +fi + +if check_port ${ADBC_PORT}; then + echo -e "${RED}Error: Port ${ADBC_PORT} is already in use${NC}" + echo "Kill the process with: kill \$(lsof -ti:${ADBC_PORT})" + exit 1 +fi +echo -e "${YELLOW}Ports ${PG_PORT} and ${ADBC_PORT} are available${NC}" + +# Determine cubesqld binary location +CUBE_ROOT="$SCRIPT_DIR/../../.." +CUBESQLD_DEBUG="$CUBE_ROOT/rust/cubesql/target/debug/cubesqld" +CUBESQLD_RELEASE="$CUBE_ROOT/rust/cubesql/target/release/cubesqld" +CUBESQLD_LOCAL="$SCRIPT_DIR/bin/cubesqld" + +echo "---> "${CUBESQLD_RELEASE} + +CUBESQLD_BIN="" +if [ -f "$CUBESQLD_DEBUG" ]; then + CUBESQLD_BIN="$CUBESQLD_DEBUG" + BUILD_TYPE="debug" +elif [ -f "$CUBESQLD_RELEASE" ]; then + CUBESQLD_BIN="$CUBESQLD_RELEASE" + BUILD_TYPE="release" +elif [ -f "$CUBESQLD_LOCAL" ]; then + CUBESQLD_BIN="$CUBESQLD_LOCAL" + BUILD_TYPE="local" +else + echo -e "${RED}Error: cubesqld binary not found${NC}" + echo "" + echo "Build it with:" + echo " cd $CUBE_ROOT/rust/cubesql" + echo " cargo build --bin cubesqld # for debug build" + echo " cargo build --release --bin cubesqld # for release build" + exit 1 +fi + +echo "" +echo -e "${GREEN}Found cubesqld binary (${BUILD_TYPE}):${NC}" +echo " $CUBESQLD_BIN" + +# Set environment variables for cubesqld +CUBE_API_URL="http://localhost:${CUBE_API_PORT}/cubejs-api" +CUBE_TOKEN="${CUBESQL_CUBE_TOKEN:-test}" + +export CUBESQL_CUBE_URL="${CUBE_API_URL}" +export CUBESQL_CUBE_TOKEN="${CUBE_TOKEN}" +export CUBEJS_ADBC_PORT="${ADBC_PORT}" +export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-error}" +export CUBESTORE_LOG_LEVEL="error" + +# Enable Arrow Results Cache (default: true, can be overridden) +export CUBESQL_ARROW_RESULTS_CACHE_ENABLED="${CUBESQL_ARROW_RESULTS_CACHE_ENABLED:-true}" +export CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES="${CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES:-1000}" +export CUBESQL_ARROW_RESULTS_CACHE_TTL="${CUBESQL_ARROW_RESULTS_CACHE_TTL:-3600}" + +echo "" +echo -e "${BLUE}Configuration:${NC}" +echo -e " Cube API URL: ${CUBESQL_CUBE_URL}" +echo -e " Cube Token: ${CUBESQL_CUBE_TOKEN}" +echo -e " PostgreSQL Port: ${CUBESQL_PG_PORT}" +echo -e " ADBC Port: ${CUBEJS_ADBC_PORT}" +echo -e " Log Level: ${CUBESQL_LOG_LEVEL}" +echo -e " Arrow Results Cache: ${CUBESQL_ARROW_RESULTS_CACHE_ENABLED} (max: ${CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES}, ttl: ${CUBESQL_ARROW_RESULTS_CACHE_TTL}s)" +echo "" +echo "" +echo -e "${YELLOW}Press Ctrl+C to stop${NC}" +echo "" + +# Cleanup function +cleanup() { + echo "" + echo -e "${YELLOW}Shutting down cubesqld...${NC}" + echo -e "${GREEN}Cleanup complete${NC}" +} + +trap cleanup EXIT + +# Run cubesqld +exec "$CUBESQLD_BIN" diff --git a/examples/recipes/ecto/verify-build.sh b/examples/recipes/ecto/verify-build.sh new file mode 100755 index 0000000000000..fa5840403d9d4 --- /dev/null +++ b/examples/recipes/ecto/verify-build.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo "Verifying Cube ADBC(Arrow Native) Build" +echo "==================================" +echo "" + +# Check if binary exists +if [ ! -f "bin/cubesqld" ]; then + echo -e "${RED}✗ cubesqld binary not found${NC}" + echo "Run: ./dev-start.sh to build" + exit 1 +fi + +echo -e "${GREEN}✓ cubesqld binary found ($(ls -lh bin/cubesqld | awk '{print $5}'))${NC}" + +# Check for ADBC(Arrow Native) symbols +if nm bin/cubesqld 2>/dev/null | grep -q "ArrowNativeServer"; then + echo -e "${GREEN}✓ ArrowNativeServer symbol found in binary${NC}" +else + echo -e "${YELLOW}⚠ Cannot verify ArrowNativeServer symbol (may be optimized)${NC}" +fi + +# Test environment variable parsing +echo "" +echo "Testing configuration parsing..." +export CUBEJS_ADBC_PORT=8120 +export CUBESQL_PG_PORT=4444 +export CUBESQL_LOG_LEVEL=error + +# Start cubesql in background and check output +timeout 3 bin/cubesqld 2>&1 | head -20 & +CUBESQL_PID=$! +sleep 2 + +# Check if it's listening on the Arrow port +if lsof -Pi :8120 -sTCP:LISTEN -t >/dev/null 2>&1 ; then + echo -e "${GREEN}✓ ADBC(Arrow Native) server listening on port 8120${NC}" + ARROW_OK=1 +else + echo -e "${RED}✗ ADBC(Arrow Native) server NOT listening on port 8120${NC}" + ARROW_OK=0 +fi + +# Check PostgreSQL port +if lsof -Pi :4444 -sTCP:LISTEN -t >/dev/null 2>&1 ; then + echo -e "${GREEN}✓ PostgreSQL server listening on port 4444${NC}" + PG_OK=1 +else + echo -e "${RED}✗ PostgreSQL server NOT listening on port 4444${NC}" + PG_OK=0 +fi + +# Cleanup +kill $CUBESQL_PID 2>/dev/null || true +sleep 1 + +echo "" +echo "Summary" +echo "=======" + +if [ $ARROW_OK -eq 1 ] && [ $PG_OK -eq 1 ]; then + echo -e "${GREEN}✓ Both protocols are working correctly!${NC}" + echo "" + echo "You can now:" + echo " - Connect via PostgreSQL: psql -h 127.0.0.1 -p 4444 -U root" + echo " - Connect via ADBC: Use ADBC driver on port 8120" + echo "" + echo "To start the full dev environment:" + echo " ./dev-start.sh" + exit 0 +else + echo -e "${RED}✗ Some protocols failed to start${NC}" + echo "" + echo "This may be because:" + echo " - Cube.js API is not running (needed for query execution)" + echo " - Ports are already in use" + echo "" + echo "Try running the full stack:" + echo " ./dev-start.sh" + exit 1 +fi From 44c411db6d6d5ab8d49dfada29f0b31cb0cf698a Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Sun, 11 Jan 2026 23:04:17 -0500 Subject: [PATCH 3/6] take I. Ecto starts but: _(RuntimeError) oid(s) 20, 25, 701, 1114 lack type information after bootstrap_ --- examples/recipes/ecto/package.json | 78 +--- examples/recipes/ecto/start-cube-api.sh | 2 +- examples/recipes/ecto/start-cubesqld.sh | 5 +- .../information_schema/postgres/pg_type.rs | 37 +- ...ile__tests__pgcatalog_pgtype_postgres.snap | 224 +++++----- rust/cubesql/pg-srv/src/pg_type.rs | 394 +++++++++++++++++- 6 files changed, 519 insertions(+), 221 deletions(-) diff --git a/examples/recipes/ecto/package.json b/examples/recipes/ecto/package.json index 15665cfbdda6d..43da4324e2080 100644 --- a/examples/recipes/ecto/package.json +++ b/examples/recipes/ecto/package.json @@ -1,78 +1,12 @@ { - "name": "cubejs", - "version": "0.1.0", - "description": "", + "name": "ecto-adbc-postgres", "private": true, - "workspaces": { - "packages": [ - "rust/*", - "packages/*" - ], - "nohoist": [ - "packages/cubejs-client-ngx/*", - "**/vue/*", - "**/inquirer" - ] - }, "scripts": { - "build": "yarn lerna run build:client-core && rollup -c", - "watch": "rollup -c -w", - "watch-local": "CUBEJS_API_URL=http://localhost:6020/cubejs-api/v1 rollup -c -w", - "lint:npm": "yarn npmPkgJsonLint packages/*/package.json rust/package.json", - "lint": "yarn lint:npm && yarn lerna run lint", - "lint:fix": "lerna run lint:fix", - "tsc": "tsc --build", - "tsc:watch": "tsc --build --watch", - "clean": "rimraf packages/*/{tsconfig.tsbuildinfo,lib,dist}" - }, - "author": "Cube Dev, Inc.", - "dependencies": { - "core-js": "^3.34.0", - "lerna": "^9.0.0" + "dev": "../../../node_modules/.bin/cubejs-server", + "build": "../../../node_modules/.bin/cubejs build" }, - "files": [ - "src", - "dist" - ], "devDependencies": { - "@babel/core": "^7.13.8", - "@babel/plugin-transform-runtime": "^7.13.9", - "@babel/preset-env": "^7.13.9", - "@babel/preset-react": "^7.12.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/runtime": "^7.13.9", - "@rollup/plugin-alias": "^3.1.2", - "@rollup/plugin-babel": "^5.3.0", - "@rollup/plugin-commonjs": "^17.1.0", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^11.2.0", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@types/fs-extra": "^9.0.1", - "@types/jest": "^27", - "flush-promises": "^1.0.2", - "husky": "^5.0.4", - "is-ci": "^2.0.0", - "less": "^3.13.1", - "npm-package-json-lint": "^5.1.0", - "postcss": "^8.2.8", - "prettier": "^2.0.5", - "rimraf": "^3.0.2", - "rollup": "2.53.1", - "rollup-plugin-peer-deps-external": "^2.2.4", - "rollup-plugin-tsconfig-paths": "^1.5.2", - "typescript": "~5.2.2" - }, - "repository": { - "type": "git", - "url": "https://github.com/cube-js/cube.git" - }, - "resolutions": { - "es5-ext": "0.10.53", - "lodash": "^4.17.0", - "@types/node": "^20", - "@types/ramda": "0.27.40", - "thrift": "0.20.0" - }, - "license": "MIT", - "packageManager": "yarn@1.22.19" + "@cubejs-backend/server": "*", + "@cubejs-backend/postgres-driver": "*" + } } diff --git a/examples/recipes/ecto/start-cube-api.sh b/examples/recipes/ecto/start-cube-api.sh index 5de5aaf61bdda..6e1e5fb699b5a 100755 --- a/examples/recipes/ecto/start-cube-api.sh +++ b/examples/recipes/ecto/start-cube-api.sh @@ -31,7 +31,7 @@ source .env # Override to disable built-in protocol servers # (cubesqld will provide these instead) -#unset CUBEJS_PG_SQL_PORT +unset CUBEJS_PG_SQL_PORT export CUBEJS_PG_SQL_PORT="9432" #export CUBEJS_ADBC_PORT="8120" #export CUBEJS_SQL_PORT="4445" diff --git a/examples/recipes/ecto/start-cubesqld.sh b/examples/recipes/ecto/start-cubesqld.sh index 02134b4490f0b..6394ddb8ca5a1 100755 --- a/examples/recipes/ecto/start-cubesqld.sh +++ b/examples/recipes/ecto/start-cubesqld.sh @@ -53,8 +53,9 @@ fi echo -e "${YELLOW}Cube.js API is running on port ${CUBE_API_PORT}${NC}" # Check if cubesqld ports are free -#PG_PORT=${CUBEJS_PG_SQL_PORT:-4444} -ADBC_PORT=${CUBEJS_ADBC_PORT:-8120} +PG_PORT=${CUBEJS_PG_SQL_PORT:-9432} +#export CUBEJS_PG_SQL_PORT="9432" +#ADBC_PORT=${CUBEJS_ADBC_PORT:-8120} echo "" echo -e "${GREEN}Checking port availability...${NC}" 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/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/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: "-", }, ]; From 40889a874b822a996e3b2aea0433f9e8461d9e1f Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Mon, 12 Jan 2026 02:34:00 -0500 Subject: [PATCH 4/6] Ecto can query cube, more testing needed --- .../df/optimizers/cross_join_to_left_join.rs | 289 ++++++++++++++++++ .../src/compile/engine/df/optimizers/mod.rs | 2 + .../cubesql/src/compile/query_engine.rs | 5 +- 3 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 rust/cubesql/cubesql/src/compile/engine/df/optimizers/cross_join_to_left_join.rs 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..a5b440cb3e0a8 --- /dev/null +++ b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/cross_join_to_left_join.rs @@ -0,0 +1,289 @@ +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.into_iter()) + .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/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()), From f579d9ce4e55e46b04e0e8b0d5408a8c0723b3f4 Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Tue, 13 Jan 2026 19:13:06 -0500 Subject: [PATCH 5/6] fix(cubesql): format optimizer code and update pg_type snapshots - Fix clippy warning for useless .into_iter() in cross_join_to_left_join - Apply cargo fmt formatting to cross_join_to_left_join.rs - Update DBeaver and PowerBI introspection snapshots for pg_type changes Co-Authored-By: Claude Opus 4.5 --- .../df/optimizers/cross_join_to_left_join.rs | 52 +++-- ...spection__dbeaver_introspection_types.snap | 182 +++++++++--------- ...ntrospection__powerbi_supported_types.snap | 17 +- 3 files changed, 120 insertions(+), 131 deletions(-) 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 index a5b440cb3e0a8..aaa7847e37dcf 100644 --- 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 @@ -56,16 +56,12 @@ fn cross_join_to_left_join( 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)?); + 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.into_iter()) - .collect(); + 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 @@ -157,11 +153,7 @@ fn cross_join_to_left_join( /// 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 { +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); @@ -176,9 +168,9 @@ fn should_convert_to_left_join( /// 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::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) => { @@ -194,11 +186,7 @@ fn is_pg_catalog_scan(plan: &LogicalPlan) -> bool { /// 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(); + 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") @@ -206,12 +194,10 @@ fn is_pg_catalog_schema(schema: &datafusion::logical_plan::DFSchemaRef) -> bool && field_names.contains(&"typnamespace"); // pg_range has columns like: rngtypid, rngsubtype, rngmultitypid - let is_pg_range = field_names.contains(&"rngtypid") - && field_names.contains(&"rngsubtype"); + 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"); + 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") @@ -235,7 +221,13 @@ fn extract_join_columns( 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); + collect_equi_conditions( + predicate, + left_schema, + right_schema, + &mut left_cols, + &mut right_cols, + ); if left_cols.is_empty() { None @@ -279,7 +271,13 @@ fn collect_equi_conditions( 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); + collect_equi_conditions( + right, + left_schema, + right_schema, + left_cols, + right_cols, + ); } _ => {} } 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 | ++---------+---------+-----+----------+-------------+------+---------+-----+ ++---------+---------+-----+----------+-------------+------+---------+-----+ From 7f307078230a84d7e9e6c84a559cfa4b5d6c1aca Mon Sep 17 00:00:00 2001 From: Egor O'Sten Date: Wed, 14 Jan 2026 12:08:03 -0500 Subject: [PATCH 6/6] reasonable cleanup --- examples/recipes/ecto/.env.example | 13 ++ examples/recipes/ecto/.gitignore | 6 + examples/recipes/ecto/_compose.yml | 42 ------ examples/recipes/ecto/build-and-run.sh | 66 --------- examples/recipes/ecto/cleanup.sh | 35 ----- examples/recipes/ecto/dev-start.sh | 139 ------------------- examples/recipes/ecto/fix-formatting.sh | 38 ----- examples/recipes/ecto/run-ci-tests-local.sh | 145 -------------------- examples/recipes/ecto/run-clippy.sh | 78 ----------- examples/recipes/ecto/run-docker.sh | 12 -- examples/recipes/ecto/run-quick-checks.sh | 87 ------------ examples/recipes/ecto/run-tests-only.sh | 91 ------------ examples/recipes/ecto/setup_test_data.sh | 49 ------- examples/recipes/ecto/start-cubesqld.sh | 145 -------------------- examples/recipes/ecto/verify-build.sh | 86 ------------ 15 files changed, 19 insertions(+), 1013 deletions(-) create mode 100644 examples/recipes/ecto/.env.example delete mode 100644 examples/recipes/ecto/_compose.yml delete mode 100755 examples/recipes/ecto/build-and-run.sh delete mode 100755 examples/recipes/ecto/cleanup.sh delete mode 100755 examples/recipes/ecto/dev-start.sh delete mode 100755 examples/recipes/ecto/fix-formatting.sh delete mode 100755 examples/recipes/ecto/run-ci-tests-local.sh delete mode 100755 examples/recipes/ecto/run-clippy.sh delete mode 100644 examples/recipes/ecto/run-docker.sh delete mode 100755 examples/recipes/ecto/run-quick-checks.sh delete mode 100755 examples/recipes/ecto/run-tests-only.sh delete mode 100755 examples/recipes/ecto/setup_test_data.sh delete mode 100755 examples/recipes/ecto/start-cubesqld.sh delete mode 100755 examples/recipes/ecto/verify-build.sh 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 index 5fa1b78134fee..20de43cd7327a 100644 --- a/examples/recipes/ecto/.gitignore +++ b/examples/recipes/ecto/.gitignore @@ -20,3 +20,9 @@ bin/ .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 deleted file mode 100644 index 196400b65ba62..0000000000000 --- a/examples/recipes/ecto/_compose.yml +++ /dev/null @@ -1,42 +0,0 @@ -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 - - cube_api: - container_name: cube_cube_api - restart: always - image: cubejs/cube:latest - ports: - - 4009:4000 - - 9432:9432 - environment: - CUBEJS_DB_QUERY_TIMEOUT: 60m - CUBEJS_CONCURRENCY: 128 - CUBEJS_PG_SQL_PORT: 9432 - CUBEJS_DB_MAX_POOL: 128 - CUBEJS_DB_TYPE: postgres - CUBEJS_DB_PORT: 5432 - CUBEJS_DB_NAME: pot_examples_dev - CUBEJS_DB_HOST: postgresql - CUBEJS_DB_USER: postgres - CUBEJS_DB_PASS: postgres - CUBEJS_API_SECRET: secret - CUBEJS_DEV_MODE: true - DEBUG_LOG: true - CUBESQL_LOG_LEVEL: debug - CUBEJS_LOG_LEVEL: debug - volumes: - - ./:/cube/conf - -volumes: - postgresql: diff --git a/examples/recipes/ecto/build-and-run.sh b/examples/recipes/ecto/build-and-run.sh deleted file mode 100755 index 7bd5df5bcc7b5..0000000000000 --- a/examples/recipes/ecto/build-and-run.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Building Cube with ADBC(Arrow Native) Support${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -# Get the root directory -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." -CUBESQL_DIR="$CUBE_ROOT/rust/cubesql" - -# Build cubesql binary -echo -e "${GREEN}Step 1: Building cubesqld binary...${NC}" -cd "$CUBESQL_DIR" -cargo build --release --bin cubesqld - -# Copy binary to dev project bin directory -echo -e "${GREEN}Step 2: Copying cubesqld binary...${NC}" -mkdir -p "$SCRIPT_DIR/bin" -cp "$CUBESQL_DIR/target/release/cubesqld" "$SCRIPT_DIR/bin/" -chmod +x "$SCRIPT_DIR/bin/cubesqld" - -echo "" -echo -e "${GREEN}Build complete!${NC}" -echo "" -echo -e "${YELLOW}Binary location: $SCRIPT_DIR/bin/cubesqld${NC}" -echo "" - -# Check if .env file exists -if [ ! -f "$SCRIPT_DIR/.env" ]; then - echo -e "${YELLOW}Warning: .env file not found. Please create one based on .env.example${NC}" - exit 1 -fi - -# Source the .env file to get configuration -source "$SCRIPT_DIR/.env" - -# Start the server -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Starting Cube SQL Server${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" -echo -e "${GREEN}Configuration:${NC}" -echo -e " PostgreSQL Port: ${CUBEJS_PG_SQL_PORT:-4444}" -echo -e " ADBC Port: ${CUBEJS_ADBC_PORT:-8120}" -echo -e " Database: ${CUBEJS_DB_TYPE}://${CUBEJS_DB_USER}@${CUBEJS_DB_HOST}:${CUBEJS_DB_PORT}/${CUBEJS_DB_NAME}" -echo -e " Log Level: ${CUBESQL_LOG_LEVEL:-info}" -echo "" -echo -e "${YELLOW}Press Ctrl+C to stop the server${NC}" -echo "" - -# Export environment variables for cubesqld -export CUBESQL_PG_PORT="${CUBEJS_PG_SQL_PORT:-4444}" -export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-info}" - -# Run the cubesqld binary -cd "$SCRIPT_DIR" -exec "./bin/cubesqld" diff --git a/examples/recipes/ecto/cleanup.sh b/examples/recipes/ecto/cleanup.sh deleted file mode 100755 index 7f4c122017837..0000000000000 --- a/examples/recipes/ecto/cleanup.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# Colors for output -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' - -echo -e "${GREEN}Cleaning up Cube development environment...${NC}" - -# Kill any running cube processes -PROCS=$(ps aux | grep -E "(cubesqld|cube-api|cubestore|cubejs)" | grep -v grep | awk '{print $2}') -if [ ! -z "$PROCS" ]; then - echo -e "${YELLOW}Stopping processes: $PROCS${NC}" - echo "$PROCS" | xargs kill 2>/dev/null || true - sleep 1 - # Force kill if still running - echo "$PROCS" | xargs kill -9 2>/dev/null || true -fi - -# Check for processes using our ports -for port in 3030 4008 4444 8120 7432; do - PID=$(lsof -ti :$port 2>/dev/null) - if [ ! -z "$PID" ]; then - echo -e "${YELLOW}Killing process using port $port (PID: $PID)${NC}" - kill $PID 2>/dev/null || kill -9 $PID 2>/dev/null || true - fi -done - -# Remove PID files -rm -f cube-api.pid 2>/dev/null - -echo -e "${GREEN}Cleanup complete!${NC}" -echo "" -echo "You can now start fresh with:" -echo " ./dev-start.sh" diff --git a/examples/recipes/ecto/dev-start.sh b/examples/recipes/ecto/dev-start.sh deleted file mode 100755 index 330dec355f6e7..0000000000000 --- a/examples/recipes/ecto/dev-start.sh +++ /dev/null @@ -1,139 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd "$SCRIPT_DIR" - -echo -e "${BLUE}======================================${NC}" -echo -e "${BLUE}Cube ADBC(Arrow Native) Development Setup${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 -source .env - -# 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 -} - -# Step 1: Start PostgreSQL -echo -e "${GREEN}Step 1: Starting PostgreSQL database...${NC}" -if check_port 7432; then - echo -e "${YELLOW}PostgreSQL already running on port 7432${NC}" -else - docker-compose up -d postgres - echo "Waiting for PostgreSQL to be ready..." - sleep 3 -fi - -# Step 2: Build cubesql with ADBC(Arrow Native) support -echo "" -echo -e "${GREEN}Step 2: Building cubesqld with ADBC(Arrow Native) support...${NC}" -CUBE_ROOT="$SCRIPT_DIR/../../.." -cd "$CUBE_ROOT/rust/cubesql" -cargo build --release --bin cubesqld -mkdir -p "$SCRIPT_DIR/bin" -cp "target/release/cubesqld" "$SCRIPT_DIR/bin/" -chmod +x "$SCRIPT_DIR/bin/cubesqld" -cd "$SCRIPT_DIR" - -# Step 3: Start Cube.js API server -echo "" -echo -e "${GREEN}Step 3: Starting Cube.js API server...${NC}" -if check_port ${PORT:-4008}; then - echo -e "${YELLOW}Cube.js API already running on port ${PORT:-4008}${NC}" - CUBE_API_URL="http://localhost:${PORT:-4008}" -else - echo "Starting Cube.js server in background..." - yarn dev > cube-api.log 2>&1 & - CUBE_API_PID=$! - echo $CUBE_API_PID > cube-api.pid - - # Wait for Cube.js to be ready - echo "Waiting for Cube.js API to be ready..." - for i in {1..30}; do - if check_port ${PORT:-4008}; then - echo -e "${GREEN}Cube.js API is ready!${NC}" - break - fi - sleep 1 - done - - CUBE_API_URL="http://localhost:${PORT:-4008}" -fi - -# Generate a test token (in production this would be from auth) -# For dev mode, Cube.js typically uses 'test' or generates one -CUBE_TOKEN="${CUBESQL_CUBE_TOKEN:-test}" - -# Step 4: Start cubesql with both PostgreSQL and ADBC(Arrow Native) protocols -echo "" -echo -e "${GREEN}Step 4: Starting cubesqld with ADBC(Arrow Native) support...${NC}" -echo "" -echo -e "${BLUE}Configuration:${NC}" -echo -e " Cube.js API: ${CUBE_API_URL}/cubejs-api/v1" -echo -e " PostgreSQL Port: ${CUBEJS_PG_SQL_PORT:-4444}" -echo -e " ADBC Port: ${CUBEJS_ADBC_PORT:-8120}" -echo -e " Log Level: ${CUBESQL_LOG_LEVEL:-info}" -echo "" -echo -e "${YELLOW}To test the connections:${NC}" -echo -e " PostgreSQL: psql -h 127.0.0.1 -p ${CUBEJS_PG_SQL_PORT:-4444} -U root" -echo -e " ADBC: Use ADBC driver on port ${CUBEJS_ADBC_PORT:-8120}" -echo "" -echo -e "${YELLOW}Logs:${NC}" -echo -e " Cube.js API: tail -f $SCRIPT_DIR/cube-api.log" -echo -e " cubesqld: See output below" -echo "" -echo -e "${YELLOW}Press Ctrl+C to stop${NC}" -echo "" - -# Export environment variables for cubesqld -export CUBESQL_CUBE_URL="${CUBE_API_URL}/cubejs-api/v1" -export CUBESQL_CUBE_TOKEN="${CUBE_TOKEN}" -export CUBESQL_PG_PORT="${CUBEJS_PG_SQL_PORT:-4444}" -export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-info}" - -# Cleanup function -cleanup() { - echo "" - echo -e "${YELLOW}Shutting down...${NC}" - - # Kill cubesql (handled by trap) - - # Optionally stop Cube.js API - if [ -f cube-api.pid ]; then - CUBE_PID=$(cat cube-api.pid) - if ps -p $CUBE_PID > /dev/null 2>&1; then - echo "Stopping Cube.js API (PID: $CUBE_PID)..." - kill $CUBE_PID 2>/dev/null || true - rm cube-api.pid - fi - fi - - echo -e "${GREEN}Cleanup complete${NC}" -} - -trap cleanup EXIT - -# Run cubesqld -exec ./bin/cubesqld diff --git a/examples/recipes/ecto/fix-formatting.sh b/examples/recipes/ecto/fix-formatting.sh deleted file mode 100755 index 3167241cc4920..0000000000000 --- a/examples/recipes/ecto/fix-formatting.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Fixing Rust Formatting${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -echo -e "${YELLOW}Formatting CubeSQL...${NC}" -cd "$CUBE_ROOT/rust/cubesql" && cargo fmt --all -echo -e "${GREEN}✓ CubeSQL formatted${NC}" - -echo -e "${YELLOW}Formatting Native...${NC}" -cd "$CUBE_ROOT/packages/cubejs-backend-native" && cargo fmt --all -echo -e "${GREEN}✓ Native formatted${NC}" - -echo -e "${YELLOW}Formatting cubenativeutils...${NC}" -cd "$CUBE_ROOT/rust/cubenativeutils" && cargo fmt --all -echo -e "${GREEN}✓ cubenativeutils formatted${NC}" - -echo -e "${YELLOW}Formatting cubesqlplanner...${NC}" -cd "$CUBE_ROOT/rust/cubesqlplanner" && cargo fmt --all -echo -e "${GREEN}✓ cubesqlplanner formatted${NC}" - -echo "" -echo -e "${GREEN}========================================${NC}" -echo -e "${GREEN}✓ All Rust code formatted!${NC}" -echo -e "${GREEN}========================================${NC}" -echo "" -echo "You can now commit your changes." diff --git a/examples/recipes/ecto/run-ci-tests-local.sh b/examples/recipes/ecto/run-ci-tests-local.sh deleted file mode 100755 index c7a7c1b1c5bd4..0000000000000 --- a/examples/recipes/ecto/run-ci-tests-local.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Running Local CI Tests (like GitHub)${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -# Track failures -FAILURES=0 - -# Function to run a test step -run_test() { - local name="$1" - local command="$2" - - echo -e "${BLUE}>>> $name${NC}" - if eval "$command"; then - echo -e "${GREEN}✓ $name passed${NC}" - echo "" - return 0 - else - echo -e "${RED}✗ $name failed${NC}" - echo "" - FAILURES=$((FAILURES + 1)) - return 1 - fi -} - -# ============================================ -# 1. LINT CHECKS (fmt + clippy) -# ============================================ - -echo -e "${YELLOW}=== LINT CHECKS ===${NC}" -echo "" - -run_test "Lint CubeSQL (fmt)" \ - "cd $CUBE_ROOT/rust/cubesql && cargo fmt --all -- --check" - -run_test "Lint Native (fmt)" \ - "cd $CUBE_ROOT/packages/cubejs-backend-native && cargo fmt --all -- --check" - -run_test "Lint cubenativeutils (fmt)" \ - "cd $CUBE_ROOT/rust/cubenativeutils && cargo fmt --all -- --check" - -run_test "Lint cubesqlplanner (fmt)" \ - "cd $CUBE_ROOT/rust/cubesqlplanner && cargo fmt --all -- --check" - -run_test "Clippy CubeSQL" \ - "cd $CUBE_ROOT/rust/cubesql && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" - -run_test "Clippy Native" \ - "cd $CUBE_ROOT/packages/cubejs-backend-native && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" - -run_test "Clippy cubenativeutils" \ - "cd $CUBE_ROOT/rust/cubenativeutils && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" - -run_test "Clippy cubesqlplanner" \ - "cd $CUBE_ROOT/rust/cubesqlplanner && cargo clippy --locked --workspace --all-targets --keep-going -- -D warnings" - -# ============================================ -# 2. UNIT TESTS (Rewrite Engine) -# ============================================ - -echo -e "${YELLOW}=== UNIT TESTS ===${NC}" -echo "" - -# Check if cargo-insta is installed -if ! command -v cargo-insta &> /dev/null; then - echo -e "${YELLOW}Installing cargo-insta...${NC}" - cargo install cargo-insta --version 1.42.0 -fi - -run_test "Unit tests (Rewrite Engine)" \ - "cd $CUBE_ROOT/rust/cubesql && \ - export CUBESQL_SQL_PUSH_DOWN=true && \ - export CUBESQL_REWRITE_CACHE=true && \ - export CUBESQL_REWRITE_TIMEOUT=60 && \ - cargo insta test --all-features --workspace --unreferenced warn" - -# ============================================ -# 3. NATIVE BUILD & TESTS -# ============================================ - -echo -e "${YELLOW}=== NATIVE BUILD & TESTS ===${NC}" -echo "" - -# Ensure dependencies are installed -run_test "Yarn install" \ - "cd $CUBE_ROOT && yarn install --frozen-lockfile" - -run_test "Lerna tsc" \ - "cd $CUBE_ROOT && yarn tsc" - -run_test "Build native (debug)" \ - "cd $CUBE_ROOT/packages/cubejs-backend-native && yarn run native:build-debug" - -run_test "Native unit tests" \ - "cd $CUBE_ROOT/packages/cubejs-backend-native && \ - export CUBESQL_STREAM_MODE=true && \ - export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ - yarn run test:unit" - -# ============================================ -# 4. E2E SMOKE TESTS -# ============================================ - -echo -e "${YELLOW}=== E2E SMOKE TESTS ===${NC}" -echo "" - -run_test "E2E Smoke testing over whole Cube" \ - "cd $CUBE_ROOT/packages/cubejs-testing && \ - export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ - yarn smoke:cubesql" - -# ============================================ -# SUMMARY -# ============================================ - -echo "" -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}TEST SUMMARY${NC}" -echo -e "${BLUE}========================================${NC}" - -if [ $FAILURES -eq 0 ]; then - echo -e "${GREEN}✓ All tests passed!${NC}" - echo "" - echo "You can commit and push with confidence!" - exit 0 -else - echo -e "${RED}✗ $FAILURES test(s) failed${NC}" - echo "" - echo "Please fix the failing tests before committing." - exit 1 -fi diff --git a/examples/recipes/ecto/run-clippy.sh b/examples/recipes/ecto/run-clippy.sh deleted file mode 100755 index c27a6c4f4c50e..0000000000000 --- a/examples/recipes/ecto/run-clippy.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Running Clippy (Rust Linter)${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -FAILURES=0 - -run_clippy() { - local name="$1" - local dir="$2" - local extra_flags="$3" - - echo -e "${BLUE}>>> Clippy: $name${NC}" - if cd "$dir" && cargo clippy --locked --workspace --all-targets --keep-going $extra_flags -- -D warnings; then - echo -e "${GREEN}✓ $name passed${NC}" - echo "" - return 0 - else - echo -e "${RED}✗ $name failed${NC}" - echo "" - FAILURES=$((FAILURES + 1)) - return 1 - fi -} - -# ============================================ -# RUN CLIPPY ON ALL COMPONENTS -# ============================================ - -run_clippy "CubeSQL" \ - "$CUBE_ROOT/rust/cubesql" \ - "" - -run_clippy "Native" \ - "$CUBE_ROOT/packages/cubejs-backend-native" \ - "" - -run_clippy "Native (with Python)" \ - "$CUBE_ROOT/packages/cubejs-backend-native" \ - "--features python" - -run_clippy "cubenativeutils" \ - "$CUBE_ROOT/rust/cubenativeutils" \ - "" - -run_clippy "cubesqlplanner" \ - "$CUBE_ROOT/rust/cubesqlplanner" \ - "" - -# ============================================ -# SUMMARY -# ============================================ - -echo "" -echo -e "${BLUE}========================================${NC}" - -if [ $FAILURES -eq 0 ]; then - echo -e "${GREEN}✓ All clippy checks passed!${NC}" - exit 0 -else - echo -e "${RED}✗ $FAILURES clippy check(s) failed${NC}" - echo "" - echo "Please fix the clippy warnings before committing." - exit 1 -fi diff --git a/examples/recipes/ecto/run-docker.sh b/examples/recipes/ecto/run-docker.sh deleted file mode 100644 index ef187c3274b6d..0000000000000 --- a/examples/recipes/ecto/run-docker.sh +++ /dev/null @@ -1,12 +0,0 @@ -#localhost/cubejs/cube:mine - -docker run -d -p 3000:3000 -p 4000:4000 \ - -e CUBEJS_DB_HOST=postgres://localhost \ - -e CUBEJS_DB_NAME= \ - -e CUBEJS_DB_USER= \ - -e CUBEJS_DB_PASS= \ - -e CUBEJS_DB_TYPE= \ - -e CUBEJS_API_SECRET= \ - -v $(pwd):/cube/conf \ - localhost/cubejs/cube:mine -# cubejs/cube:latest diff --git a/examples/recipes/ecto/run-quick-checks.sh b/examples/recipes/ecto/run-quick-checks.sh deleted file mode 100755 index 79f3a5f5dc891..0000000000000 --- a/examples/recipes/ecto/run-quick-checks.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Quick Pre-Commit Checks${NC}" -echo -e "${BLUE}(Runs in ~1-2 minutes)${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -FAILURES=0 - -run_test() { - local name="$1" - local command="$2" - - echo -e "${BLUE}>>> $name${NC}" - if eval "$command"; then - echo -e "${GREEN}✓ $name passed${NC}" - echo "" - return 0 - else - echo -e "${RED}✗ $name failed${NC}" - echo "" - FAILURES=$((FAILURES + 1)) - return 1 - fi -} - -# ============================================ -# QUICK CHECKS (most likely to catch issues) -# ============================================ - -echo -e "${YELLOW}=== FORMAT CHECKS ===${NC}" -echo "" - -run_test "Check Rust formatting" \ - "cd $CUBE_ROOT/rust/cubesql && cargo fmt --all -- --check && \ - cd $CUBE_ROOT/packages/cubejs-backend-native && cargo fmt --all -- --check && \ - cd $CUBE_ROOT/rust/cubenativeutils && cargo fmt --all -- --check && \ - cd $CUBE_ROOT/rust/cubesqlplanner && cargo fmt --all -- --check" - -echo -e "${YELLOW}=== CLIPPY (CubeSQL only) ===${NC}" -echo "" - -run_test "Clippy CubeSQL" \ - "cd $CUBE_ROOT/rust/cubesql && cargo clippy --workspace --all-targets -- -D warnings" - -echo -e "${YELLOW}=== UNIT TESTS (CubeSQL only) ===${NC}" -echo "" - -# Check if cargo-insta is installed -if ! command -v cargo-insta &> /dev/null; then - echo -e "${YELLOW}Installing cargo-insta...${NC}" - cargo install cargo-insta --version 1.42.0 -fi - -run_test "CubeSQL unit tests" \ - "cd $CUBE_ROOT/rust/cubesql && cargo insta test --all-features --unreferenced warn" - -# ============================================ -# SUMMARY -# ============================================ - -echo "" -echo -e "${BLUE}========================================${NC}" - -if [ $FAILURES -eq 0 ]; then - echo -e "${GREEN}✓ Quick checks passed!${NC}" - echo "" - echo -e "${YELLOW}Note: This is a quick check. Run ./run-ci-tests-local.sh for full CI tests.${NC}" - exit 0 -else - echo -e "${RED}✗ $FAILURES check(s) failed${NC}" - echo "" - echo "Please fix the issues before committing." - exit 1 -fi diff --git a/examples/recipes/ecto/run-tests-only.sh b/examples/recipes/ecto/run-tests-only.sh deleted file mode 100755 index 85ac5a94d690f..0000000000000 --- a/examples/recipes/ecto/run-tests-only.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -set -e - -# Colors for output -GREEN='\033[0;32m' -BLUE='\033[0;34m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -CUBE_ROOT="$SCRIPT_DIR/../../.." - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Running Tests Only${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -FAILURES=0 - -run_test() { - local name="$1" - local command="$2" - - echo -e "${BLUE}>>> $name${NC}" - if eval "$command"; then - echo -e "${GREEN}✓ $name passed${NC}" - echo "" - return 0 - else - echo -e "${RED}✗ $name failed${NC}" - echo "" - FAILURES=$((FAILURES + 1)) - return 1 - fi -} - -# Check if cargo-insta is installed -if ! command -v cargo-insta &> /dev/null; then - echo -e "${YELLOW}Installing cargo-insta...${NC}" - cargo install cargo-insta --version 1.42.0 - echo "" -fi - -# ============================================ -# RUST UNIT TESTS -# ============================================ - -echo -e "${YELLOW}=== RUST UNIT TESTS ===${NC}" -echo "" - -run_test "CubeSQL unit tests (Rewrite Engine)" \ - "cd $CUBE_ROOT/rust/cubesql && \ - export CUBESQL_SQL_PUSH_DOWN=true && \ - export CUBESQL_REWRITE_CACHE=true && \ - export CUBESQL_REWRITE_TIMEOUT=60 && \ - cargo insta test --all-features --workspace --unreferenced warn" - -# ============================================ -# NATIVE TESTS (if built) -# ============================================ - -if [ -f "$CUBE_ROOT/packages/cubejs-backend-native/index.node" ]; then - echo -e "${YELLOW}=== NATIVE TESTS ===${NC}" - echo "" - - run_test "Native unit tests" \ - "cd $CUBE_ROOT/packages/cubejs-backend-native && \ - export CUBESQL_STREAM_MODE=true && \ - export CUBEJS_NATIVE_INTERNAL_DEBUG=true && \ - yarn run test:unit" -else - echo -e "${YELLOW}Skipping native tests (not built)${NC}" - echo -e "${YELLOW}Run: cd packages/cubejs-backend-native && yarn run native:build-debug${NC}" - echo "" -fi - -# ============================================ -# SUMMARY -# ============================================ - -echo "" -echo -e "${BLUE}========================================${NC}" - -if [ $FAILURES -eq 0 ]; then - echo -e "${GREEN}✓ All tests passed!${NC}" - exit 0 -else - echo -e "${RED}✗ $FAILURES test(s) failed${NC}" - exit 1 -fi diff --git a/examples/recipes/ecto/setup_test_data.sh b/examples/recipes/ecto/setup_test_data.sh deleted file mode 100755 index 2c41426361a45..0000000000000 --- a/examples/recipes/ecto/setup_test_data.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -# Setup test data for ADBC(Arrow Native) cache performance testing - -set -e - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -DB_HOST=${DB_HOST:-localhost} -DB_PORT=${DB_PORT:-7432} -DB_NAME=${DB_NAME:-pot_examples_dev} -DB_USER=${DB_USER:-postgres} -DB_PASS=${DB_PASS:-postgres} - -echo "Setting up test data for ADBC(Arrow Native) performance tests..." -echo "" -echo "Database connection:" -echo " Host: $DB_HOST" -echo " Port: $DB_PORT" -echo " Database: $DB_NAME" -echo " User: $DB_USER" -echo "" - -# Check if database is running -if ! PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c "SELECT 1" > /dev/null 2>&1; then - echo "Error: Cannot connect to PostgreSQL database" - echo "Make sure PostgreSQL is running: docker-compose up -d postgres" - exit 1 -fi - -# Create database if it doesn't exist -PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c "CREATE DATABASE $DB_NAME" 2>/dev/null || true - -# Load sample data -echo "Loading sample data (3000 orders)..." -if [ -f "$SCRIPT_DIR/sample_data.sql.gz" ]; then - gunzip -c "$SCRIPT_DIR/sample_data.sql.gz" | PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME - echo "✓ Sample data loaded successfully" -else - echo "Warning: sample_data.sql.gz not found, skipping data load" -fi - -# Verify data -ROW_COUNT=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c "SELECT COUNT(*) FROM public.order" 2>/dev/null || echo "0") -echo "" -echo "✓ Database ready with $ROW_COUNT orders" -echo "" -echo "Next steps:" -echo " 1. Start Cube API: ./start-cube-api.sh" -echo " 2. Start CubeSQL: ./start-cubesqld.sh" -echo " 3. Run Python tests: python test_arrow_cache_performance.py" diff --git a/examples/recipes/ecto/start-cubesqld.sh b/examples/recipes/ecto/start-cubesqld.sh deleted file mode 100755 index 6394ddb8ca5a1..0000000000000 --- a/examples/recipes/ecto/start-cubesqld.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash -# Start only the Rust cubesqld server with ADBC Server and PostgreSQL protocols -# Requires Cube.js API server to be running (see start-cube-api.sh) - -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 SQL (cubesqld) Server${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 -source .env - -# 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 if Cube.js API is running -CUBE_API_PORT=${PORT:-4008} -echo -e "${GREEN}Checking Cube.js API server...${NC}" -if ! check_port ${CUBE_API_PORT}; then - echo -e "${RED}Error: Cube.js API is NOT running on port ${CUBE_API_PORT}${NC}" - echo "" - echo "Please start it first with:" - echo " cd $SCRIPT_DIR" - echo " ./start-cube-api.sh" - exit 1 -fi -echo -e "${YELLOW}Cube.js API is running on port ${CUBE_API_PORT}${NC}" - -# Check if cubesqld ports are free -PG_PORT=${CUBEJS_PG_SQL_PORT:-9432} -#export CUBEJS_PG_SQL_PORT="9432" -#ADBC_PORT=${CUBEJS_ADBC_PORT:-8120} - -echo "" -echo -e "${GREEN}Checking port availability...${NC}" -if check_port ${PG_PORT}; then - echo -e "${RED}Error: Port ${PG_PORT} is already in use${NC}" - echo "Kill the process with: kill \$(lsof -ti:${PG_PORT})" - exit 1 -fi - -if check_port ${ADBC_PORT}; then - echo -e "${RED}Error: Port ${ADBC_PORT} is already in use${NC}" - echo "Kill the process with: kill \$(lsof -ti:${ADBC_PORT})" - exit 1 -fi -echo -e "${YELLOW}Ports ${PG_PORT} and ${ADBC_PORT} are available${NC}" - -# Determine cubesqld binary location -CUBE_ROOT="$SCRIPT_DIR/../../.." -CUBESQLD_DEBUG="$CUBE_ROOT/rust/cubesql/target/debug/cubesqld" -CUBESQLD_RELEASE="$CUBE_ROOT/rust/cubesql/target/release/cubesqld" -CUBESQLD_LOCAL="$SCRIPT_DIR/bin/cubesqld" - -echo "---> "${CUBESQLD_RELEASE} - -CUBESQLD_BIN="" -if [ -f "$CUBESQLD_DEBUG" ]; then - CUBESQLD_BIN="$CUBESQLD_DEBUG" - BUILD_TYPE="debug" -elif [ -f "$CUBESQLD_RELEASE" ]; then - CUBESQLD_BIN="$CUBESQLD_RELEASE" - BUILD_TYPE="release" -elif [ -f "$CUBESQLD_LOCAL" ]; then - CUBESQLD_BIN="$CUBESQLD_LOCAL" - BUILD_TYPE="local" -else - echo -e "${RED}Error: cubesqld binary not found${NC}" - echo "" - echo "Build it with:" - echo " cd $CUBE_ROOT/rust/cubesql" - echo " cargo build --bin cubesqld # for debug build" - echo " cargo build --release --bin cubesqld # for release build" - exit 1 -fi - -echo "" -echo -e "${GREEN}Found cubesqld binary (${BUILD_TYPE}):${NC}" -echo " $CUBESQLD_BIN" - -# Set environment variables for cubesqld -CUBE_API_URL="http://localhost:${CUBE_API_PORT}/cubejs-api" -CUBE_TOKEN="${CUBESQL_CUBE_TOKEN:-test}" - -export CUBESQL_CUBE_URL="${CUBE_API_URL}" -export CUBESQL_CUBE_TOKEN="${CUBE_TOKEN}" -export CUBEJS_ADBC_PORT="${ADBC_PORT}" -export CUBESQL_LOG_LEVEL="${CUBESQL_LOG_LEVEL:-error}" -export CUBESTORE_LOG_LEVEL="error" - -# Enable Arrow Results Cache (default: true, can be overridden) -export CUBESQL_ARROW_RESULTS_CACHE_ENABLED="${CUBESQL_ARROW_RESULTS_CACHE_ENABLED:-true}" -export CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES="${CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES:-1000}" -export CUBESQL_ARROW_RESULTS_CACHE_TTL="${CUBESQL_ARROW_RESULTS_CACHE_TTL:-3600}" - -echo "" -echo -e "${BLUE}Configuration:${NC}" -echo -e " Cube API URL: ${CUBESQL_CUBE_URL}" -echo -e " Cube Token: ${CUBESQL_CUBE_TOKEN}" -echo -e " PostgreSQL Port: ${CUBESQL_PG_PORT}" -echo -e " ADBC Port: ${CUBEJS_ADBC_PORT}" -echo -e " Log Level: ${CUBESQL_LOG_LEVEL}" -echo -e " Arrow Results Cache: ${CUBESQL_ARROW_RESULTS_CACHE_ENABLED} (max: ${CUBESQL_ARROW_RESULTS_CACHE_MAX_ENTRIES}, ttl: ${CUBESQL_ARROW_RESULTS_CACHE_TTL}s)" -echo "" -echo "" -echo -e "${YELLOW}Press Ctrl+C to stop${NC}" -echo "" - -# Cleanup function -cleanup() { - echo "" - echo -e "${YELLOW}Shutting down cubesqld...${NC}" - echo -e "${GREEN}Cleanup complete${NC}" -} - -trap cleanup EXIT - -# Run cubesqld -exec "$CUBESQLD_BIN" diff --git a/examples/recipes/ecto/verify-build.sh b/examples/recipes/ecto/verify-build.sh deleted file mode 100755 index fa5840403d9d4..0000000000000 --- a/examples/recipes/ecto/verify-build.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -GREEN='\033[0;32m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -echo "Verifying Cube ADBC(Arrow Native) Build" -echo "==================================" -echo "" - -# Check if binary exists -if [ ! -f "bin/cubesqld" ]; then - echo -e "${RED}✗ cubesqld binary not found${NC}" - echo "Run: ./dev-start.sh to build" - exit 1 -fi - -echo -e "${GREEN}✓ cubesqld binary found ($(ls -lh bin/cubesqld | awk '{print $5}'))${NC}" - -# Check for ADBC(Arrow Native) symbols -if nm bin/cubesqld 2>/dev/null | grep -q "ArrowNativeServer"; then - echo -e "${GREEN}✓ ArrowNativeServer symbol found in binary${NC}" -else - echo -e "${YELLOW}⚠ Cannot verify ArrowNativeServer symbol (may be optimized)${NC}" -fi - -# Test environment variable parsing -echo "" -echo "Testing configuration parsing..." -export CUBEJS_ADBC_PORT=8120 -export CUBESQL_PG_PORT=4444 -export CUBESQL_LOG_LEVEL=error - -# Start cubesql in background and check output -timeout 3 bin/cubesqld 2>&1 | head -20 & -CUBESQL_PID=$! -sleep 2 - -# Check if it's listening on the Arrow port -if lsof -Pi :8120 -sTCP:LISTEN -t >/dev/null 2>&1 ; then - echo -e "${GREEN}✓ ADBC(Arrow Native) server listening on port 8120${NC}" - ARROW_OK=1 -else - echo -e "${RED}✗ ADBC(Arrow Native) server NOT listening on port 8120${NC}" - ARROW_OK=0 -fi - -# Check PostgreSQL port -if lsof -Pi :4444 -sTCP:LISTEN -t >/dev/null 2>&1 ; then - echo -e "${GREEN}✓ PostgreSQL server listening on port 4444${NC}" - PG_OK=1 -else - echo -e "${RED}✗ PostgreSQL server NOT listening on port 4444${NC}" - PG_OK=0 -fi - -# Cleanup -kill $CUBESQL_PID 2>/dev/null || true -sleep 1 - -echo "" -echo "Summary" -echo "=======" - -if [ $ARROW_OK -eq 1 ] && [ $PG_OK -eq 1 ]; then - echo -e "${GREEN}✓ Both protocols are working correctly!${NC}" - echo "" - echo "You can now:" - echo " - Connect via PostgreSQL: psql -h 127.0.0.1 -p 4444 -U root" - echo " - Connect via ADBC: Use ADBC driver on port 8120" - echo "" - echo "To start the full dev environment:" - echo " ./dev-start.sh" - exit 0 -else - echo -e "${RED}✗ Some protocols failed to start${NC}" - echo "" - echo "This may be because:" - echo " - Cube.js API is not running (needed for query execution)" - echo " - Ports are already in use" - echo "" - echo "Try running the full stack:" - echo " ./dev-start.sh" - exit 1 -fi