From a3f35d18e6ed784892c7d2d9130de76ad4c42b6d Mon Sep 17 00:00:00 2001 From: Jochen Christ Date: Tue, 18 Aug 2026 13:14:07 +0200 Subject: [PATCH 1/2] feat(rfc-0057): add `teradata` server type (#318) Applies RFC-0057 to ODCS v3.2.0: new `teradata` server type for Teradata Vantage. Both schema files updated in lockstep (enum value, conditional dispatch, and TeradataServer def with required host and optional port, defaulting to 1025, plus database). No `schema` field, since in Teradata the database is the namespace. Port uses the shared Port $def so it accepts variable references. Docs section, positive example, and a negative test (missing host is rejected). --- CHANGELOG.md | 4 ++ .../examples/server/teradata-server.odcs.yaml | 25 +++++++++++ docs/infrastructure-servers.md | 14 +++++- schema/odcs-json-schema-latest.json | 43 ++++++++++++++++++- schema/odcs-json-schema-v3.2.0.json | 43 ++++++++++++++++++- .../teradata-missing-host.odcs.yaml | 19 ++++++++ 6 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 docs/examples/server/teradata-server.odcs.yaml create mode 100644 src/script/negative-tests/teradata-missing-host.odcs.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 6196e60..4be5288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,10 @@ RFCs targeting v3.2.0 are tracked under [`tsc/rfcs/`](https://github.com/bitol-i * New `exasol` server `type` describing data served from Exasol, an in-memory MPP analytics database, with required `host` plus optional `port` (defaults to `8563`) and `schema`. * No `database` field: an Exasol cluster runs a single database and the schema is the namespace. `host` may be a cluster connection range, e.g. `n11..14.acme.com`. * Non-breaking: adds a new optional server type. +* **Adds** Teradata server type ([RFC 0057](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0057-teradata-server-type.md)): + * New `teradata` server `type` describing data served from Teradata Vantage, with required `host` plus optional `port` (defaults to `1025`) and `database`. + * No `schema` field: in Teradata, the database is the namespace. + * Non-breaking: adds a new optional server type. * **Changes** to Servers: * Add optional Athena Server `workgroup` field and fix `stagingDir` to be optional in schema. diff --git a/docs/examples/server/teradata-server.odcs.yaml b/docs/examples/server/teradata-server.odcs.yaml new file mode 100644 index 0000000..631523b --- /dev/null +++ b/docs/examples/server/teradata-server.odcs.yaml @@ -0,0 +1,25 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# Demonstrates RFC-0057: the `teradata` server type for Teradata Vantage, an +# enterprise data warehouse. In Teradata the database is the namespace, so there +# is no `schema` field. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 3b7d1c58-2f94-4a06-8e1b-9c5a0d4f7e23 +status: active +servers: + - server: prod + type: teradata + host: teradata.acme.com + port: 1025 + database: SALES +schema: + - name: sales + physicalType: table + properties: + - name: sale_id + logicalType: string + required: true diff --git a/docs/infrastructure-servers.md b/docs/infrastructure-servers.md index a10dd23..aa87246 100644 --- a/docs/infrastructure-servers.md +++ b/docs/infrastructure-servers.md @@ -48,7 +48,7 @@ servers: | id | string | ID | No | A unique identifier used to reduce the risk of collisions, such as a UUID. | | roles | array | Roles | No | List of roles that have access to the server. Check [roles](./roles.md) section for more details. | | server | string | Server | Yes | Identifier of the server. | -| type | string | Type | Yes | Type of the server. Can be one of: api, athena, azure, bigquery, clickhouse, cloudsql, custom, databricks, db2, denodo, dremio, duckdb, exasol, glue, hive, impala, informix, kafka, kinesis, local, mysql, oracle, postgres, postgresql, presto, pubsub, redshift, s3, sftp, snowflake, sqlserver, synapse, trino, vertica, zen. | +| type | string | Type | Yes | Type of the server. Can be one of: api, athena, azure, bigquery, clickhouse, cloudsql, custom, databricks, db2, denodo, dremio, duckdb, exasol, glue, hive, impala, informix, kafka, kinesis, local, mysql, oracle, postgres, postgresql, presto, pubsub, redshift, s3, sftp, snowflake, sqlserver, synapse, teradata, trino, vertica, zen. | | customProperties | array | Custom Properties | No | Custom properties that are not part of the standard. | ## Specific Server Properties @@ -395,6 +395,18 @@ Secure File Transfer Protocol (SFTP) is a network protocol that enables secure a | host | string | Host | Yes | The host of the Synapse server. | | port | integer | Port | Yes | The port of the Synapse server. | +### Teradata + +[Teradata Vantage](https://www.teradata.com/) is a widely used enterprise data warehouse for large-scale analytics. Added in ODCS v3.2.0 ([RFC 0057](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0057-teradata-server-type.md)). + +In Teradata, the database is the namespace, so there is no `schema` field. + +| Key | Type | UX Label | Required | Description | +| -------- | ------- | -------- | -------- | ----------------------------------------------- | +| database | string | Database | No | Name of the database. | +| host | string | Host | Yes | Host of the Teradata server. | +| port | integer | Port | No | Port of the Teradata server. Defaults to 1025. | + ### Trino Server [Trino](https://trino.io/) is an open-source distributed SQL query engine designed to query large datasets across one or more heterogeneous data sources. diff --git a/schema/odcs-json-schema-latest.json b/schema/odcs-json-schema-latest.json index 3c83ece..fc4cf49 100644 --- a/schema/odcs-json-schema-latest.json +++ b/schema/odcs-json-schema-latest.json @@ -239,7 +239,7 @@ "api", "athena", "azure", "bigquery", "clickhouse", "databricks", "denodo", "dremio", "duckdb", "exasol", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "kafka", "kinesis", "local", "mysql", "oracle", "postgresql", "postgres", "presto", "pubsub", - "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "trino", "vertica", "zen", "custom" + "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vertica", "zen", "custom" ] }, "description": { @@ -718,6 +718,19 @@ "$ref": "#/$defs/ServerSource/SynapseServer" } }, + { + "if": { + "properties": { + "type": { + "const": "teradata" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/TeradataServer" + } + }, { "if": { "properties": { @@ -1799,6 +1812,34 @@ "database" ] }, + "TeradataServer": { + "type": "object", + "title": "TeradataServer", + "properties": { + "host": { + "type": "string", + "description": "Host of the Teradata server.", + "examples": [ + "teradata.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Port of the Teradata server.", + "default": 1025, + "examples": [ + 1025 + ] + }, + "database": { + "type": "string", + "description": "Name of the database." + } + }, + "required": [ + "host" + ] + }, "TrinoServer": { "type": "object", "title": "TrinoServer", diff --git a/schema/odcs-json-schema-v3.2.0.json b/schema/odcs-json-schema-v3.2.0.json index bac09b3..448b893 100644 --- a/schema/odcs-json-schema-v3.2.0.json +++ b/schema/odcs-json-schema-v3.2.0.json @@ -238,7 +238,7 @@ "api", "athena", "azure", "bigquery", "clickhouse", "databricks", "denodo", "dremio", "duckdb", "exasol", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "kafka", "kinesis", "local", "mysql", "oracle", "postgresql", "postgres", "presto", "pubsub", - "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "trino", "vertica", "zen", "custom" + "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vertica", "zen", "custom" ] }, "description": { @@ -717,6 +717,19 @@ "$ref": "#/$defs/ServerSource/SynapseServer" } }, + { + "if": { + "properties": { + "type": { + "const": "teradata" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/TeradataServer" + } + }, { "if": { "properties": { @@ -1798,6 +1811,34 @@ "database" ] }, + "TeradataServer": { + "type": "object", + "title": "TeradataServer", + "properties": { + "host": { + "type": "string", + "description": "Host of the Teradata server.", + "examples": [ + "teradata.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Port of the Teradata server.", + "default": 1025, + "examples": [ + 1025 + ] + }, + "database": { + "type": "string", + "description": "Name of the database." + } + }, + "required": [ + "host" + ] + }, "TrinoServer": { "type": "object", "title": "TrinoServer", diff --git a/src/script/negative-tests/teradata-missing-host.odcs.yaml b/src/script/negative-tests/teradata-missing-host.odcs.yaml new file mode 100644 index 0000000..364d9d2 --- /dev/null +++ b/src/script/negative-tests/teradata-missing-host.odcs.yaml @@ -0,0 +1,19 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0057 negative test: a `teradata` server requires `host`. Here `host` is +# omitted, so the schema MUST reject this contract. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 4e8c2a19-6b03-4d75-9f28-1a3b6c8d0e54 +status: active +servers: + - server: prod + type: teradata + port: 1025 + database: SALES +schema: + - name: sales + physicalType: table From dd9f31750c98a7de5172da0504c276ad820ab36b Mon Sep 17 00:00:00 2001 From: "Jean-Georges \"jgp\" Perrin" Date: Fri, 28 Aug 2026 11:51:48 -0400 Subject: [PATCH 2/2] feat(rfc-0059): add Actian server types (#319) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applies approved RFC-0059 to ODCS v3.2.0: four new server types — `ingres` (Actian Ingres), `vectorwise` (Actian Analytics Engine), `versant` (Actian NoSQL Database) and `poet` (Actian NoSQL FastObjects) — plus `fastobjects` as a synonym of `poet` and `btrieve` as a synonym of `zen`, both dispatching to the existing definition, as `postgresql`/`postgres` already share PostgresServer. Both schema files updated in lockstep: enum values, conditional dispatches, and IngresServer / VectorwiseServer / VersantServer / PoetServer defs. Ports use the shared Port $def so they accept variable references. No `schema` field on any of the four: for the two SQL engines the namespace is the table owner resolved from the connecting user; the two object databases have no SQL schema namespace. Docs sections, a positive example exercising all six values, and five negative tests (including one per synonym, proving synonyms validate as strictly as their primary value). Claude-Session: https://claude.ai/code/session_01An6KmURPXG4Y8uDwd15Roq Co-authored-by: Claude Opus 5 (1M context) --- CHANGELOG.md | 9 + docs/examples/server/actian-servers.odcs.yaml | 84 +++++++ docs/infrastructure-servers.md | 58 ++++- schema/odcs-json-schema-latest.json | 215 +++++++++++++++++- schema/odcs-json-schema-v3.2.0.json | 215 +++++++++++++++++- .../btrieve-missing-host.odcs.yaml | 20 ++ .../fastobjects-missing-database.odcs.yaml | 21 ++ .../ingres-missing-host.odcs.yaml | 19 ++ .../vectorwise-missing-database.odcs.yaml | 19 ++ .../versant-missing-database.odcs.yaml | 20 ++ 10 files changed, 671 insertions(+), 9 deletions(-) create mode 100644 docs/examples/server/actian-servers.odcs.yaml create mode 100644 src/script/negative-tests/btrieve-missing-host.odcs.yaml create mode 100644 src/script/negative-tests/fastobjects-missing-database.odcs.yaml create mode 100644 src/script/negative-tests/ingres-missing-host.odcs.yaml create mode 100644 src/script/negative-tests/vectorwise-missing-database.odcs.yaml create mode 100644 src/script/negative-tests/versant-missing-database.odcs.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 4be5288..9a800c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,15 @@ RFCs targeting v3.2.0 are tracked under [`tsc/rfcs/`](https://github.com/bitol-i * New `teradata` server `type` describing data served from Teradata Vantage, with required `host` plus optional `port` (defaults to `1025`) and `database`. * No `schema` field: in Teradata, the database is the namespace. * Non-breaking: adds a new optional server type. +* **Adds** Actian server types ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)): + * New `ingres` server `type` (Actian Ingres, OLTP RDBMS) with required `database` and `host` plus optional `port` (defaults to `21064`). + * New `vectorwise` server `type` (Actian Analytics Engine, columnar analytical DBMS) with required `database` and `host` plus optional `port` (defaults to `21064`). + * New `versant` server `type` (Actian NoSQL Database, object DBMS) with required `database` plus optional `host` (defaults to `localhost`) and `port` (defaults to `5019`). + * New `poet` server `type` (Actian NoSQL FastObjects, object DBMS) with required `database` plus optional `host` (defaults to `LOCAL`, the in-process embedded engine) and `port` (defaults to `6001`). + * New synonyms: `fastobjects` for `poet` and `btrieve` for `zen` — same fields, same definitions, neither original value deprecated, as `postgresql` and `postgres` already share `PostgresServer`. + * Establishes the naming convention that a server `type` value uses the name the product carried when it was created, in lowercase, since enum values are permanent and marketing names are not. + * No `schema` field on any of the four: for `ingres` and `vectorwise` the namespace is the table owner resolved from the connecting user; the two object databases have no SQL schema namespace. + * Non-breaking: adds four optional server types and two synonyms. No existing value changes meaning. * **Changes** to Servers: * Add optional Athena Server `workgroup` field and fix `stagingDir` to be optional in schema. diff --git a/docs/examples/server/actian-servers.odcs.yaml b/docs/examples/server/actian-servers.odcs.yaml new file mode 100644 index 0000000..8002eda --- /dev/null +++ b/docs/examples/server/actian-servers.odcs.yaml @@ -0,0 +1,84 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# Demonstrates RFC-0059: the Actian server types. `ingres` (Actian Ingres) and +# `vectorwise` (Actian Analytics Engine) are SQL engines whose namespace is the +# table owner, so neither carries a `schema` field. `versant` (Actian NoSQL +# Database) and `poet` (Actian NoSQL FastObjects) are object databases whose +# classes are scoped by the database. `fastobjects` is a synonym of `poet` and +# `btrieve` is a synonym of `zen`; both spellings are valid and neither original +# value is deprecated. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 8f2c4b16-3e57-4d90-a1c8-5b7e0d2f9a64 +status: active +servers: + # Actian Ingres — order-entry OLTP system of record. + - server: ingres-prod + type: ingres + description: Order-entry OLTP system of record + environment: prod + host: ingres01.acme.com + port: 21064 + database: orders + roles: + - role: acme_orders_ro + access: read + - role: acme_orders_rw + access: write + + # Actian Analytics Engine — columnar serving layer, non-default installation. + - server: vector-preprod + type: vectorwise + description: Columnar serving layer for the sales data product + environment: preprod + host: vector02.acme.com + port: 21164 + database: sales_mart + + # Actian NoSQL Database — policy administration object store. + - server: versant-prod + type: versant + description: Policy administration OLTP object store + environment: prod + host: nosql01.acme.com + port: 5019 + database: policies + roles: + - role: acme_policies_ro + access: read + + # Actian NoSQL FastObjects, embedded: no host, so the in-process engine. + - server: fastobjects-device + type: poet + description: On-device telemetry store + environment: dev + database: telemetry + + # The same engine addressed by its `fastobjects` synonym, client/server. + - server: fastobjects-prod + type: fastobjects + description: Parts catalog for the CAD workstations + environment: prod + host: fastobjects.acme.com + port: 6001 + database: parts_catalog + + # Actian Zen addressed by its `btrieve` synonym. + - server: zen-prod + type: btrieve + description: Embedded inventory store + environment: prod + host: zen.acme.com + database: inventory +schema: + - name: orders + physicalType: table + properties: + - name: order_id + logicalType: string + required: true + - name: order_total + logicalType: number diff --git a/docs/infrastructure-servers.md b/docs/infrastructure-servers.md index aa87246..9301159 100644 --- a/docs/infrastructure-servers.md +++ b/docs/infrastructure-servers.md @@ -48,7 +48,7 @@ servers: | id | string | ID | No | A unique identifier used to reduce the risk of collisions, such as a UUID. | | roles | array | Roles | No | List of roles that have access to the server. Check [roles](./roles.md) section for more details. | | server | string | Server | Yes | Identifier of the server. | -| type | string | Type | Yes | Type of the server. Can be one of: api, athena, azure, bigquery, clickhouse, cloudsql, custom, databricks, db2, denodo, dremio, duckdb, exasol, glue, hive, impala, informix, kafka, kinesis, local, mysql, oracle, postgres, postgresql, presto, pubsub, redshift, s3, sftp, snowflake, sqlserver, synapse, teradata, trino, vertica, zen. | +| type | string | Type | Yes | Type of the server. Can be one of: api, athena, azure, bigquery, btrieve, clickhouse, cloudsql, custom, databricks, db2, denodo, dremio, duckdb, exasol, fastobjects, glue, hive, impala, informix, ingres, kafka, kinesis, local, mysql, oracle, poet, postgres, postgresql, presto, pubsub, redshift, s3, sftp, snowflake, sqlserver, synapse, teradata, trino, vectorwise, versant, vertica, zen. | | customProperties | array | Custom Properties | No | Custom properties that are not part of the standard. | ## Specific Server Properties @@ -235,6 +235,18 @@ An Exasol cluster runs a single database and the schema is the namespace, so the | host | string | Host | Yes | The host to the HCL Informix and IBM Informix server. | | port | integer | Port | No | The port to the HCL Informix and IBM Informix server. Defaults to 9088. | +### Actian Ingres + +[Actian Ingres](https://www.actian.com/databases/ingres/) is an enterprise relational database for transactional (OLTP) and hybrid workloads. Added in ODCS v3.2.0 ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)). + +The namespace inside an Ingres database is the table owner, resolved from the connecting user, so there is no `schema` field. `port` is derived from the Ingres installation identifier and defaults to the `II7` installation; set it explicitly when a host runs more than one installation. + +| Key | Type | UX Label | Required | Description | +| -------- | ------- | -------- | -------- | -------------------------------------------------------------------------------------------------------- | +| database | string | Database | Yes | Database name to connect to on the Ingres instance. | +| host | string | Host | Yes | Hostname or IP address of the Ingres server. | +| port | integer | Port | No | Connection port for the Ingres Data Access Server (DAS) / SQL connections. Defaults to 21064. | + ### Kafka Server [Apache Kafka](https://kafka.apache.org/) is an open-source distributed event streaming platform used for high-performance data pipelines, streaming analytics, and event-driven applications. @@ -286,6 +298,20 @@ A local server describes data stored as one or more files on the local file syst | port | integer | Port | Yes | The port to the Oracle server. | | serviceName | string | Service Name | Yes | The name of the service. | +### Actian NoSQL FastObjects + +[Actian NoSQL FastObjects](https://www.actian.com/databases/nosql/) is an object database management system (ODBMS) for embedded and client/server applications. Created as POET, renamed FastObjects in 2001. Added in ODCS v3.2.0 ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)). + +The `type` value is the creation name, `poet`. `fastobjects` is an accepted synonym: same fields, same validation, neither value deprecated. + +An object database has no SQL schema namespace — classes are scoped by the database — so there is no `schema` field. `LOCAL` is a literal FastObjects sentinel rather than a hostname: it selects the in-process embedded engine, so one `host` field covers both the embedded and the client/server deployment. + +| Key | Type | UX Label | Required | Description | +| -------- | ------- | -------- | -------- | ------------------------------------------------------------------------------------------------- | +| database | string | Database | Yes | Database name to connect to on the FastObjects instance. | +| host | string | Host | No | Hostname or IP address of the FastObjects server. Defaults to `LOCAL`, the embedded engine. | +| port | integer | Port | No | Connection port for FastObjects connections. Defaults to 6001. | + ### PostgreSQL [PostgreSQL](https://www.postgresql.org/) is a powerful, open source object-relational database system with over 35 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. @@ -418,6 +444,34 @@ In Teradata, the database is the namespace, so there is no `schema` field. | port | integer | Port | Yes | The Trino port. | | schema | string | Schema | Yes | The name of the schema in the database. | +### Actian Analytics Engine + +The [Actian Analytics Engine](https://www.actian.com/databases/analytics-engine/) is a columnar analytical DBMS for high-speed SQL and big data processing. Created as VectorWise, later named Actian Vector. Added in ODCS v3.2.0 ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)). + +The `type` value is the creation name, `vectorwise`. Tooling should display the Actian Analytics Engine label and write the enum value. + +The namespace inside a database is the table owner, resolved from the connecting user, so there is no `schema` field. `port` is derived from the Ingres installation identifier; set it explicitly when a host runs more than one installation. + +| Key | Type | UX Label | Required | Description | +| -------- | ------- | -------- | -------- | -------------------------------------------------------------------------------------- | +| database | string | Database | Yes | Database name to connect to on the Analytics Engine server. | +| host | string | Host | Yes | Hostname or IP address of the Analytics Engine server. | +| port | integer | Port | No | Connection port for the Data Access Server (DAS) / SQL connections. Defaults to 21064. | + +### Actian NoSQL Database + +[Actian NoSQL Database](https://www.actian.com/databases/nosql/) is an object database management system (ODBMS) for mission-critical OLTP. Created as the Versant Object Database. Added in ODCS v3.2.0 ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)). + +The `type` value is the creation name, `versant`. Tooling should display the Actian NoSQL Database label and write the enum value. + +An object database has no SQL schema namespace — classes are scoped by the database — so there is no `schema` field. + +| Key | Type | UX Label | Required | Description | +| -------- | ------- | -------- | -------- | ---------------------------------------------------------------------------- | +| database | string | Database | Yes | Database name to connect to on the NoSQL Database instance. | +| host | string | Host | No | Hostname or IP address of the NoSQL Database server. Defaults to `localhost`. | +| port | integer | Port | No | Connection port for Actian NoSQL Database connections. Defaults to 5019. | + ### Vertica Server [Vertica](https://docs.vertica.com/) is a column-oriented, massively parallel processing (MPP) analytical database for large-scale data warehousing. @@ -433,6 +487,8 @@ In Teradata, the database is the namespace, so there is no `schema` field. Actian Zen (formerly Btrieve, later named Pervasive PSQL until version 13) is an ACID-compliant, zero-DBA, embedded, nano-footprint, multi-model, Multi-Platform database management system (DBMS). +Since ODCS v3.2.0 ([RFC 0059](https://github.com/bitol-io/tsc/blob/main/rfcs/approved/odcs-v3.2.0/0059-actian-server-types.md)), `btrieve` is an accepted synonym of `zen`: same fields, same validation, neither value deprecated. + | Key | Type | UX Label | Required | Description | | -------- | ------- | -------- | -------- | -------------------------------------------------- | | database | string | Database | Yes | Database name to connect to on the Zen server. | diff --git a/schema/odcs-json-schema-latest.json b/schema/odcs-json-schema-latest.json index fc4cf49..ebda81a 100644 --- a/schema/odcs-json-schema-latest.json +++ b/schema/odcs-json-schema-latest.json @@ -236,10 +236,10 @@ "type": "string", "description": "Type of the server.", "enum": [ - "api", "athena", "azure", "bigquery", "clickhouse", "databricks", "denodo", "dremio", - "duckdb", "exasol", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "kafka", "kinesis", "local", - "mysql", "oracle", "postgresql", "postgres", "presto", "pubsub", - "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vertica", "zen", "custom" + "api", "athena", "azure", "bigquery", "btrieve", "clickhouse", "databricks", "denodo", "dremio", + "duckdb", "exasol", "fastobjects", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "ingres", "kafka", "kinesis", "local", + "mysql", "oracle", "poet", "postgresql", "postgres", "presto", "pubsub", + "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vectorwise", "versant", "vertica", "zen", "custom" ] }, "description": { @@ -315,6 +315,19 @@ "$ref": "#/$defs/ServerSource/BigQueryServer" } }, + { + "if": { + "properties": { + "type": { + "const": "btrieve" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/ZenServer" + } + }, { "if": { "properties": { @@ -393,6 +406,19 @@ "$ref": "#/$defs/ServerSource/ExasolServer" } }, + { + "if": { + "properties": { + "type": { + "const": "fastobjects" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/PoetServer" + } + }, { "if": { "properties": { @@ -471,6 +497,19 @@ "$ref": "#/$defs/ServerSource/InformixServer" } }, + { + "if": { + "properties": { + "type": { + "const": "ingres" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/IngresServer" + } + }, { "if": { "properties": { @@ -562,6 +601,19 @@ "$ref": "#/$defs/ServerSource/OracleServer" } }, + { + "if": { + "properties": { + "type": { + "const": "poet" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/PoetServer" + } + }, { "if": { "properties": { @@ -744,6 +796,32 @@ "$ref": "#/$defs/ServerSource/TrinoServer" } }, + { + "if": { + "properties": { + "type": { + "const": "vectorwise" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/VectorwiseServer" + } + }, + { + "if": { + "properties": { + "type": { + "const": "versant" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/VersantServer" + } + }, { "if": { "properties": { @@ -1191,6 +1269,38 @@ "database" ] }, + "IngresServer": { + "type": "object", + "title": "IngresServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the Ingres instance.", + "examples": [ + "sales" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the Ingres server.", + "examples": [ + "ingres.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for the Ingres Data Access Server (DAS) / SQL connections.", + "default": 21064, + "examples": [ + 21064 + ] + } + }, + "required": [ + "database", + "host" + ] + }, "ZenServer": { "type": "object", "title": "ZenServer", @@ -1460,6 +1570,39 @@ "serviceName" ] }, + "PoetServer": { + "type": "object", + "title": "PoetServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the FastObjects instance.", + "examples": [ + "parts_catalog" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the FastObjects server. The literal LOCAL selects the in-process embedded engine.", + "default": "LOCAL", + "examples": [ + "LOCAL", + "fastobjects02.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for FastObjects connections.", + "default": 6001, + "examples": [ + 6001 + ] + } + }, + "required": [ + "database" + ] + }, "PostgresServer": { "type": "object", "title": "PostgresServer", @@ -1877,6 +2020,70 @@ "schema" ] }, + "VectorwiseServer": { + "type": "object", + "title": "VectorwiseServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the Analytics Engine server.", + "examples": [ + "warehouse" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the Analytics Engine server.", + "examples": [ + "analytics.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for the Data Access Server (DAS) / SQL connections.", + "default": 21064, + "examples": [ + 21064 + ] + } + }, + "required": [ + "database", + "host" + ] + }, + "VersantServer": { + "type": "object", + "title": "VersantServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the NoSQL Database instance.", + "examples": [ + "policies" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the NoSQL Database server.", + "default": "localhost", + "examples": [ + "nosql.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for Actian NoSQL Database connections.", + "default": 5019, + "examples": [ + 5019 + ] + } + }, + "required": [ + "database" + ] + }, "VerticaServer": { "type": "object", "title": "VerticaServer", diff --git a/schema/odcs-json-schema-v3.2.0.json b/schema/odcs-json-schema-v3.2.0.json index 448b893..1151ddc 100644 --- a/schema/odcs-json-schema-v3.2.0.json +++ b/schema/odcs-json-schema-v3.2.0.json @@ -235,10 +235,10 @@ "type": "string", "description": "Type of the server.", "enum": [ - "api", "athena", "azure", "bigquery", "clickhouse", "databricks", "denodo", "dremio", - "duckdb", "exasol", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "kafka", "kinesis", "local", - "mysql", "oracle", "postgresql", "postgres", "presto", "pubsub", - "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vertica", "zen", "custom" + "api", "athena", "azure", "bigquery", "btrieve", "clickhouse", "databricks", "denodo", "dremio", + "duckdb", "exasol", "fastobjects", "glue", "hana", "cloudsql", "db2", "hive", "iceberg", "impala", "informix", "ingres", "kafka", "kinesis", "local", + "mysql", "oracle", "poet", "postgresql", "postgres", "presto", "pubsub", + "redshift", "s3", "sftp", "snowflake", "sqlserver", "synapse", "teradata", "trino", "vectorwise", "versant", "vertica", "zen", "custom" ] }, "description": { @@ -314,6 +314,19 @@ "$ref": "#/$defs/ServerSource/BigQueryServer" } }, + { + "if": { + "properties": { + "type": { + "const": "btrieve" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/ZenServer" + } + }, { "if": { "properties": { @@ -392,6 +405,19 @@ "$ref": "#/$defs/ServerSource/ExasolServer" } }, + { + "if": { + "properties": { + "type": { + "const": "fastobjects" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/PoetServer" + } + }, { "if": { "properties": { @@ -470,6 +496,19 @@ "$ref": "#/$defs/ServerSource/InformixServer" } }, + { + "if": { + "properties": { + "type": { + "const": "ingres" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/IngresServer" + } + }, { "if": { "properties": { @@ -561,6 +600,19 @@ "$ref": "#/$defs/ServerSource/OracleServer" } }, + { + "if": { + "properties": { + "type": { + "const": "poet" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/PoetServer" + } + }, { "if": { "properties": { @@ -743,6 +795,32 @@ "$ref": "#/$defs/ServerSource/TrinoServer" } }, + { + "if": { + "properties": { + "type": { + "const": "vectorwise" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/VectorwiseServer" + } + }, + { + "if": { + "properties": { + "type": { + "const": "versant" + } + }, + "required": ["type"] + }, + "then": { + "$ref": "#/$defs/ServerSource/VersantServer" + } + }, { "if": { "properties": { @@ -1190,6 +1268,38 @@ "database" ] }, + "IngresServer": { + "type": "object", + "title": "IngresServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the Ingres instance.", + "examples": [ + "sales" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the Ingres server.", + "examples": [ + "ingres.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for the Ingres Data Access Server (DAS) / SQL connections.", + "default": 21064, + "examples": [ + 21064 + ] + } + }, + "required": [ + "database", + "host" + ] + }, "ZenServer": { "type": "object", "title": "ZenServer", @@ -1459,6 +1569,39 @@ "serviceName" ] }, + "PoetServer": { + "type": "object", + "title": "PoetServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the FastObjects instance.", + "examples": [ + "parts_catalog" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the FastObjects server. The literal LOCAL selects the in-process embedded engine.", + "default": "LOCAL", + "examples": [ + "LOCAL", + "fastobjects02.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for FastObjects connections.", + "default": 6001, + "examples": [ + 6001 + ] + } + }, + "required": [ + "database" + ] + }, "PostgresServer": { "type": "object", "title": "PostgresServer", @@ -1876,6 +2019,70 @@ "schema" ] }, + "VectorwiseServer": { + "type": "object", + "title": "VectorwiseServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the Analytics Engine server.", + "examples": [ + "warehouse" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the Analytics Engine server.", + "examples": [ + "analytics.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for the Data Access Server (DAS) / SQL connections.", + "default": 21064, + "examples": [ + 21064 + ] + } + }, + "required": [ + "database", + "host" + ] + }, + "VersantServer": { + "type": "object", + "title": "VersantServer", + "properties": { + "database": { + "type": "string", + "description": "Database name to connect to on the NoSQL Database instance.", + "examples": [ + "policies" + ] + }, + "host": { + "type": "string", + "description": "Hostname or IP address of the NoSQL Database server.", + "default": "localhost", + "examples": [ + "nosql.acme.com" + ] + }, + "port": { + "$ref": "#/$defs/Port", + "description": "Connection port for Actian NoSQL Database connections.", + "default": 5019, + "examples": [ + 5019 + ] + } + }, + "required": [ + "database" + ] + }, "VerticaServer": { "type": "object", "title": "VerticaServer", diff --git a/src/script/negative-tests/btrieve-missing-host.odcs.yaml b/src/script/negative-tests/btrieve-missing-host.odcs.yaml new file mode 100644 index 0000000..d2357d0 --- /dev/null +++ b/src/script/negative-tests/btrieve-missing-host.odcs.yaml @@ -0,0 +1,20 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0059 negative test: `btrieve` is a synonym of `zen` and dispatches to the +# same ZenServer definition, which requires both `host` and `database`. Here +# `host` is omitted, so the schema MUST reject this contract — the synonym is +# validated as strictly as the primary value. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 5e719314-6f8a-40c5-d24e-b06fa18c2d59 +status: active +servers: + - server: prod + type: btrieve + database: inventory +schema: + - name: inventory + physicalType: table diff --git a/src/script/negative-tests/fastobjects-missing-database.odcs.yaml b/src/script/negative-tests/fastobjects-missing-database.odcs.yaml new file mode 100644 index 0000000..5d66839 --- /dev/null +++ b/src/script/negative-tests/fastobjects-missing-database.odcs.yaml @@ -0,0 +1,21 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0059 negative test: `fastobjects` is a synonym of `poet` and dispatches to +# the same PoetServer definition, which requires `database`. Here `database` is +# omitted, so the schema MUST reject this contract — the synonym is validated as +# strictly as the primary value. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 4d608203-5e79-4fb4-c13d-af5e907b1c48 +status: active +servers: + - server: prod + type: fastobjects + host: fastobjects.acme.com + port: 6001 +schema: + - name: parts_catalog + physicalType: table diff --git a/src/script/negative-tests/ingres-missing-host.odcs.yaml b/src/script/negative-tests/ingres-missing-host.odcs.yaml new file mode 100644 index 0000000..5222ef9 --- /dev/null +++ b/src/script/negative-tests/ingres-missing-host.odcs.yaml @@ -0,0 +1,19 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0059 negative test: an `ingres` server requires both `database` and +# `host`. Here `host` is omitted, so the schema MUST reject this contract. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 1a3d5f70-2b46-4c81-9e0a-7c2b6d4f8e15 +status: active +servers: + - server: prod + type: ingres + port: 21064 + database: orders +schema: + - name: orders + physicalType: table diff --git a/src/script/negative-tests/vectorwise-missing-database.odcs.yaml b/src/script/negative-tests/vectorwise-missing-database.odcs.yaml new file mode 100644 index 0000000..18e6504 --- /dev/null +++ b/src/script/negative-tests/vectorwise-missing-database.odcs.yaml @@ -0,0 +1,19 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0059 negative test: a `vectorwise` server requires both `database` and +# `host`. Here `database` is omitted, so the schema MUST reject this contract. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 2b4e6081-3c57-4d92-af1b-8d3c7e5f9a26 +status: active +servers: + - server: prod + type: vectorwise + host: analytics.acme.com + port: 21064 +schema: + - name: sales + physicalType: table diff --git a/src/script/negative-tests/versant-missing-database.odcs.yaml b/src/script/negative-tests/versant-missing-database.odcs.yaml new file mode 100644 index 0000000..18fc5b6 --- /dev/null +++ b/src/script/negative-tests/versant-missing-database.odcs.yaml @@ -0,0 +1,20 @@ +# Copyright 2026 The Bitol Contributors +# SPDX-License-Identifier: Apache-2.0 + +# RFC-0059 negative test: a `versant` server requires `database` (`host` and +# `port` are optional). Here `database` is omitted, so the schema MUST reject +# this contract. + +version: 1.0.0 +apiVersion: v3.2.0 +kind: DataContract +id: 3c5f7192-4d68-4ea3-b02c-9e4d8f6a0b37 +status: active +servers: + - server: prod + type: versant + host: nosql01.acme.com + port: 5019 +schema: + - name: policies + physicalType: table