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:
| State | Meaning |
|---|---|
| ✅ Validated | Verified directly against a live server or service. |
| 🟢 Supported | Expected to work and covered by the same protocol surface, but not run continuously. Report issues and they will be treated as bugs. |
| 🟡 Not yet validated | Should be compatible on protocol grounds, but unverified. No promise yet. |
| ❌ Not supported | Refused 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
| Version | State | Notes |
|---|---|---|
| Teradata 20.00 | ✅ Validated | Validated 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 validated | Required 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 validated | Legacy-port logon only (no TLS logon), through TTU. |
| Teradata VantageCloud | 🟡 Not yet validated | Not 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.
| Component | State | Notes |
|---|---|---|
| TTU 20.00 (CLIv2, TeraGSS) | ✅ Validated | Only CLIv2 and TeraGSS are used. |
| Other TTU releases with CLIv2 17.10 or later | 🟡 Not yet validated | CLIv2 17.10 or later is required. |
| CLIv2 older than 17.10 | ❌ Not supported |
Logon mechanisms
| Mechanism | Over 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
| Platform | State | Notes |
|---|---|---|
| Linux x64 | ✅ Validated | glibc 2.28 or newer (RHEL 8, Ubuntu 20.04 and later). OpenSSL and the C++ runtime are linked in. |
| Windows x64 | ✅ Validated | A 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) | 🟢 Supported | Package ArpeTeradata.AdbcDriver: the native library for linux-x64 and win-x64, no managed assembly. |
| macOS, Linux arm64 | ❌ Not supported | No released binary. |
No Teradata file is ever shipped with the driver.
ADBC conformance
ArpeTeradata implements the ADBC 1.1.0 API.
| Area | State |
|---|---|
ExecuteQuery, ExecuteUpdate | Implemented. Large results stream across many server messages with bounded memory; DML reports the activity count as rows affected. |
ExecuteSchema | Implemented, without running the query. |
Prepare, Bind, BindStream | Implemented for SELECT and DML; see Parameterised queries. |
GetParameterSchema | After Prepare: one null-typed field per ? (Teradata does not describe parameter types). After Bind / BindStream: the bound types. |
| Bulk ingest | create, append, replace, create_append, temporary (volatile) tables. No catalog level. See Bulk ingest. |
| Transactions | Teradata (BTET) and ANSI modes; autocommit on by default. See Transactions. |
Cancel (statement and connection) | Implemented on Linux and Windows. |
GetInfo | Implemented. Vendor name Teradata. |
GetObjects | Implemented. 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. |
GetTableSchema | Implemented, with the same mapping and ARPETERADATA:type metadata as a query. |
GetTableTypes | Implemented. |
GetStatistics | Row 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. |
GetStatisticNames | Returns an empty result. |
| Current schema | Readable and settable through adbc.connection.current_db_schema. |
| Teradata warnings | Not reported (ADBC has no channel for them). |
| Connection string, URI | ADO.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 defaultSETtable would drop duplicate rows silently) andNO 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,
appendjoins your transaction like any bound DML.create,replaceandcreate_appendneed a transaction with no writes yet (otherwiseINVALID_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. replaceisDROP TABLEthenCREATE TABLE: two statements, not atomic. If theCREATEfails, the old table is gone.createon an existing table fails withALREADY_EXISTS;appendto a missing table withNOT_FOUND.appendwith a column the table does not have fails withALREADY_EXISTS(Teradata error 3810).- Temporary ingest creates a volatile table (
ON COMMIT PRESERVE ROWS) in your own database, so it cannot be combined withadbc.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 inGetObjects. - 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 errors | ADBC status | SQLSTATE |
|---|---|---|
| 3706, 3707 (syntax) | INVALID_ARGUMENT | 42000 |
| 3802, 3807 (database or object not found) | NOT_FOUND | 42S02 |
| 5628 (column not found) | NOT_FOUND | 42S22 |
| 3803, 3804 (object already exists) | ALREADY_EXISTS | 42S01 |
| 3523, 3524 (no privilege) | UNAUTHORIZED | 42501 |
| 2801, 2802, 2803 (duplicate key or row) | INTEGRITY | 23505 |
| 3604, 3811 (NULL in a NOT NULL column) | INTEGRITY | 23502 |
| 2616 (numeric overflow) | INVALID_DATA | 22003 |
| 2618 (division by zero) | INVALID_DATA | 22012 |
| 2620, 3520 (bad character, value not valid for the column) | INVALID_DATA | 22018 |
| 2665, 2666 (invalid date) | INVALID_DATA | 22007 |
| 3996 (string right truncation) | INVALID_DATA | 22001 |
| 2631 (transaction aborted by deadlock: retry it) | IO | 40001 |
| 2644, 2646 (no more room or spool space) | IO | 53100 |
| 3110 (request cancelled) | CANCELLED | HY008 |
| 8017 (invalid user, password or account) | UNAUTHENTICATED | 28000 |
| any other number | INVALID_ARGUMENT | HY000 |
See also
- Connection: connecting to each of the above
- Authentication: mechanisms and when TTU is needed
- Troubleshooting: when a supported target does not connect