Skip to main content

ArpeTeradata — Compatibility

Which Teradata and TTU versions, logon mechanisms and client platforms ArpeTeradata is known to work with, and which parts of the ADBC API it implements. The support states used across the Arpeio driver family:

StateMeaning
✅ ValidatedVerified directly against a live server or service.
🟢 SupportedExpected to work and covered by the same protocol surface, but not run continuously. Report issues and they will be treated as bugs.
🟡 Not yet validatedShould be compatible on protocol grounds, but unverified. No promise yet.
❌ Not supportedRefused by the driver.

ArpeTeradata speaks the Teradata request/response parcel protocol natively: over TLS (WebSocket on the gateway's HTTPS port) with its own logon, or on the legacy port after a logon through TTU CLIv2. The type mapping is in Data types.


Teradata Database​

VersionStateNotes
Teradata 20.00✅ ValidatedValidated on Teradata 20.00 (Vantage Express): the upstream ADBC validation suite (253 passed, 0 failures for the declared features), live tests of every supported type at its edge values, logon over TLS and on the legacy port, ingest and cancel.
Teradata 16.20.53.30 and later, with a gateway certificate🟡 Not yet validatedRequired for the logon over TLS. If such a server does not accept the TLS logon, the default sslmode=prefer falls back to the legacy port, where TTU is required.
Older releases🟡 Not yet validatedLegacy-port logon only (no TLS logon), through TTU.
Teradata VantageCloud🟡 Not yet validatedNot tested.

Teradata Tools and Utilities (client)​

Needed only for the legacy-port logon (servers without TLS, sslmode=disable, or a fallback from prefer / allow). See Authentication → Prerequisites.

ComponentStateNotes
TTU 20.00 (CLIv2, TeraGSS)✅ ValidatedOnly CLIv2 and TeraGSS are used.
Other TTU releases with CLIv2 17.10 or later🟡 Not yet validatedCLIv2 17.10 or later is required.
CLIv2 older than 17.10❌ Not supported

Logon mechanisms​

MechanismOver TLS (no TTU)Legacy port (TTU)
TD2 (username + password)✅ Validated✅ Validated
JWT✅ Validated (RS256 tokens)🟢 Supported
Kerberos KRB5 / TDNEGO, Linux (MIT Kerberos)✅ Validated🟢 Supported
Kerberos KRB5 / TDNEGO, Windows (SSPI)🟡 Not yet validated (built, not yet run against a domain controller)🟢 Supported
LDAP❌ Not supported (Teradata's LDAP mechanism needs its own key exchange)✅ Validated
Client certificates (mutual TLS)❌ Not supported—

TLS 1.2 and 1.3 are supported on the gateway's HTTPS port.


Client platforms​

PlatformStateNotes
Linux x64✅ Validatedglibc 2.28 or newer (RHEL 8, Ubuntu 20.04 and later). OpenSSL and the C++ runtime are linked in.
Windows x64✅ ValidatedA self-contained .dll (OpenSSL and the C runtime linked in). TLS logon without TTU, and legacy-port logon through your TTU (wincli32.dll).
.NET (NuGet)🟢 SupportedPackage ArpeTeradata.AdbcDriver: the native library for linux-x64 and win-x64, no managed assembly.
macOS, Linux arm64❌ Not supportedNo released binary.

No Teradata file is ever shipped with the driver.


ADBC conformance​

ArpeTeradata implements the ADBC 1.1.0 API.

AreaState
ExecuteQuery, ExecuteUpdateImplemented. Large results stream across many server messages with bounded memory; DML reports the activity count as rows affected.
ExecuteSchemaImplemented, without running the query.
Prepare, Bind, BindStreamImplemented for SELECT and DML; see Parameterised queries.
GetParameterSchemaAfter Prepare: one null-typed field per ? (Teradata does not describe parameter types). After Bind / BindStream: the bound types.
Bulk ingestcreate, append, replace, create_append, temporary (volatile) tables. No catalog level. See Bulk ingest.
TransactionsTeradata (BTET) and ANSI modes; autocommit on by default. See Transactions.
Cancel (statement and connection)Implemented on Linux and Windows.
GetInfoImplemented. Vendor name Teradata.
GetObjectsImplemented. Teradata has no catalogs: the catalog level is a single null-named catalog, and databases are the schemas. Only tables and views are listed. Constraints: PRIMARY KEY, UNIQUE, FOREIGN KEY and CHECK. View columns get their type, size and nullability only when the call names one table (no wildcard); in broader calls they are null, so scanning a database with many views stays fast. Name filters are LIKE patterns that fold ASCII letters only.
GetTableSchemaImplemented, with the same mapping and ARPETERADATA:type metadata as a query.
GetTableTypesImplemented.
GetStatisticsRow count, distinct count and null count from collected statistics (COLLECT STATISTICS), marked approximate. A table with no collected row count gets an exact COUNT(*) under an access lock. Teradata system databases are skipped unless named in db_schema; pass db_schema / table_name filters on a large system.
GetStatisticNamesReturns an empty result.
Current schemaReadable and settable through adbc.connection.current_db_schema.
Teradata warningsNot reported (ADBC has no channel for them).
Connection string, URIADO.NET string and teradata:// URI, since v0.3.5; see Three ways to connect.
ExecutePartitions, ReadPartition❌ Not supported.
Substrait plans❌ Not supported.

Bulk ingest​

Ingest uses the standard ADBC options (adbc.ingest.target_table, adbc.ingest.target_db_schema, adbc.ingest.mode, adbc.ingest.temporary) on a statement with data bound by Bind or BindStream, and sends the rows as packed, parameterised INSERT requests. Since v0.3.2. The column types it creates are in Data types → Ingest.

  • Tables the driver creates are MULTISET (a default SET table would drop duplicate rows silently) and NO PRIMARY INDEX (no skew, fastest for inserts).
  • Under autocommit, the DDL runs on its own and all rows load in one transaction: all or none. If the load fails, the created table stays, empty.
  • With autocommit off, append joins your transaction like any bound DML. create, replace and create_append need a transaction with no writes yet (otherwise INVALID_STATE) and commit the DDL on their own, because Teradata ends a transaction at a DDL statement. The rows are then in the next transaction, which you commit or roll back.
  • replace is DROP TABLE then CREATE TABLE: two statements, not atomic. If the CREATE fails, the old table is gone.
  • create on an existing table fails with ALREADY_EXISTS; append to a missing table with NOT_FOUND. append with a column the table does not have fails with ALREADY_EXISTS (Teradata error 3810).
  • Temporary ingest creates a volatile table (ON COMMIT PRESERVE ROWS) in your own database, so it cannot be combined with adbc.ingest.target_db_schema. It never writes to or drops a permanent table. While a permanent table of the same name exists in the default database, Teradata cannot tell them apart (error 3806): use another name. Volatile tables do not appear in GetObjects.
  • Names over 128 characters or containing ? are refused.
  • A string longer than its column is truncated silently in Teradata session mode and refused in ANSI mode: size the columns with adbc.arpeteradata.ingest.varchar_length.

Errors​

A Teradata failure carries the Teradata error number as the vendor code, and an ADBC status and SQLSTATE chosen from that number:

Teradata errorsADBC statusSQLSTATE
3706, 3707 (syntax)INVALID_ARGUMENT42000
3802, 3807 (database or object not found)NOT_FOUND42S02
5628 (column not found)NOT_FOUND42S22
3803, 3804 (object already exists)ALREADY_EXISTS42S01
3523, 3524 (no privilege)UNAUTHORIZED42501
2801, 2802, 2803 (duplicate key or row)INTEGRITY23505
3604, 3811 (NULL in a NOT NULL column)INTEGRITY23502
2616 (numeric overflow)INVALID_DATA22003
2618 (division by zero)INVALID_DATA22012
2620, 3520 (bad character, value not valid for the column)INVALID_DATA22018
2665, 2666 (invalid date)INVALID_DATA22007
3996 (string right truncation)INVALID_DATA22001
2631 (transaction aborted by deadlock: retry it)IO40001
2644, 2646 (no more room or spool space)IO53100
3110 (request cancelled)CANCELLEDHY008
8017 (invalid user, password or account)UNAUTHENTICATED28000
any other numberINVALID_ARGUMENTHY000

See also​