<model ...
<property name="importer.tableTypes" value="TABLE,VIEW"/>
<property name="importer.schemaPattern" value="my-schema"/>
...
</model>
JDBC Translators
The JDBC translators bridge between SQL semantic and data type differences between Teiid and a target RDBMS. Teiid has a range of specific translators that target the most popular open source and proprietary databases.
Usage
Usage of a JDBC source is straight-forward. Using Teiid SQL, the source may be queried as if the tables and procedures were local to the Teiid system.
If you are using a relational data source, or a data source that has a JDBC driver, and you do not find a specific translator available for that data source type, then start with the JDBC ANSI Translator. The JDBC ANSI Translator should enable you to perform the SQL basics. If there specific data source capabilities that are not available, then consider using the Translator Development to create what you need. Or log a Teiid Jira with your requirements.
Execution Properties - shared by all JDBC Translators
Name | Description | Default |
---|---|---|
DatabaseTimeZone |
The time zone of the database. Used when fetchings date, time, or timestamp values. |
The system default time zone |
DatabaseVersion |
The specific database version. Used to further tune pushdown support. |
The base supported version or derived from the DatabaseMetadata.getDatabaseProductVersion string. Automatic detection requires a Connection. If there are circumstances where you are getting an exception from capabilities being unavailable (most likely due to an issue obtaining a Connection), then set DatabaseVersion property. Use the JDBCExecutionFactory.usesDatabaseVersion() method to control whether your translator requires a connection to determine capabilities. |
TrimStrings |
true to trim trailing whitespace from fixed length character strings. Note that Teiid only has a string, or varchar, type that treats trailing whitespace as meaningful. |
false |
UseBindVariables |
true to indicate that PreparedStatements should be used and that literal values in the source query should be replace with bind variables. If false only LOB values will trigger the use of PreparedStatements. |
true |
UseCommentsInSourceQuery |
This will embed a leading comment with session/request id in the source SQL for informational purposes. Can be customized with the CommentFormat property. |
false |
CommentFormat |
MessageFormat string to be used if UseCommentsInSourceQuery is enabled. Available properties: 0 - session id string, 1 - parent request id string, 2 - request part id string, 3 - execution count id string, 4 - user name string, 5 - vdb name string, 6 - vdb version integer, 7 - is transactional boolean |
/teiid sessionid:{0}, requestid:{1}.{2}/ |
MaxPreparedInsertBatchSize |
The max size of a prepared insert batch. |
2048 |
StructRetrieval |
Struct retrieval mode can be one of OBJECT - getObject value returned, COPY - returned as a |
OBJECT |
EnableDependentJoins |
For sources that support temporary tables (DB2, Derby, H2, HSQL 2.0+, MySQL 5.0+, Oracle, PostgreSQL, SQLServer, Sybase) allow dependent join pushdown |
false |
Importer Properties - shared by all JDBC Translators
When specifying the importer property, it must be prefixed with "importer.". Example: importer.tableTypes
Name | Description | Default |
---|---|---|
catalog |
See DatabaseMetaData.getTables [1] |
null |
schemaPattern |
See DatabaseMetaData.getTables [1] |
null |
tableNamePattern |
See DatabaseMetaData.getTables [1] |
null |
procedureNamePattern |
See DatabaseMetaData.getProcedures [1] |
null |
tableTypes |
Comma separated list - without spaces - of imported table types. See DatabaseMetaData.getTables [1] |
null |
excludeTables |
A case-insensitive regular expression that when matched against a fully qualified table name [2] will exclude it from import. Applied after table names are retrieved. Use a negative look-ahead (?!<inclusion pattern>).* to act as an inclusion filter. |
null |
excludeProcedures |
A case-insensitive regular expression that when matched against a fully qualified procedure name [2] will exclude it from import. Applied after procedure names are retrieved. Use a negative look-ahead (?!<inclusion pattern>).* to act as an inclusion filter. |
null |
useFullSchemaName |
When false, directs the importer to drop the source catalog/schema from the Teiid object name, so that the Teiid fully qualified name will be in the form of <model name>.<table name> - Note: when false this may lead to objects with duplicate names when importing from multiple schemas, which results in an exception. This option does not affect the name in source property. |
true |
importKeys |
true to import primary and foreign keys - NOTE foreign keys to tables that are not imported will be ignored |
true |
autoCreateUniqueConstraints |
true to create a unique constraint if one is not found for a foreign keys |
true |
importIndexes |
true to import index/unique key/cardinality information |
false |
importApproximateIndexes |
true to import approximate index information. See DatabaseMetaData.getIndexInfo [1] |
true |
importProcedures |
true to import procedures and procedure columns - Note that it is not always possible to import procedure result set columns due to database limitations. It is also not currently possible to import overloaded procedures. |
false |
widenUnsignedTypes |
true to convert unsigned types to the next widest type. For example SQL Server reports tinyint as an unsigned type. With this option enabled, tinyint would be imported as a short instead of a byte. |
true |
quoteNameInSource |
false will override the default and direct Teiid to create source queries using unquoted identifiers. |
true |
useProcedureSpecificName |
true will allow the import of overloaded procedures (which will normally result in a duplicate procedure error) by using the unique procedur specific name as the Teiid name. This option will only work with JDBC 4.0 compatible drivers that report specific names. |
false |
useCatalogName |
true will use any non-null/non-empty catalog name as part of the name in source, e.g. "catalog"."schema"."table"."column", and in the Teiid runtime name if useFullSchemaName is also true. false will not use the catalog name in either the name in source or the Teiid runtime name. Should be set to false for sources that do not fully support a catalog concept, but return a non-null catalog name in their metadata - such as HSQL. |
true |
useQualifiedName |
true will use name qualification for both the Teiid name and name in source as dictated by the useCatalogName and useFullSchemaName properties. Set to false to disable all qualification for both the Teiid name and the name in source, which effectively ignores the useCatalogName and useFullSchemaName properties. Note: when false this may lead to objects with duplicate names when importing from multiple schemas, which results in an exception. |
true |
useAnyIndexCardinality |
true will use the maximum cardinality returned from DatabaseMetaData.getIndexInfo. importKeys or importIndexes needs to be enabled for this setting to have an effect. This allows for better stats gathering from sources that don’t support returning a statistical index. |
false |
importStatistics |
true will use database dependent logic to determine the cardinality if none is determined. Not yet supported by all database types - currently only supported by Oracle and MySQL. |
false |
importRowIdAsBinary |
true will import RowId columns as varbinary values. |
false |
[1] JavaDoc for DatabaseMetaData
[2] The fully qualified name for exclusion is based upon the settings of the translator and the particulars of the database. All of the applicable name parts used by the translator settings (see useQualifiedName and useCatalogName) including catalog, schema, table will be combined as catalogName.schemaName.tableName with no quoting. For example Oracle does not report a catalog, so the name used with default settings for comparison would be just schemaName.tableName.
Warning
|
The default import settings will crawl all available metadata. This import process is time consuming and full metadata import is not needed in most situations. Most commonly you’ll want to limit the import by at least schemaPattern and tableTypes. |
Example importer settings to only import tables and views from my-schema. See also VDB Guide
Native Queries
Physical tables, functions, and procedures may optionally have native queries associated with them. No validation of the native query is performed, it is simply used in a straight-forward manner to generate the source SQL. For a physical table setting the teiid_rel:native-query extension metadata will execute the native query as an inline view in the source query. This feature should only be used against sources that support inline views. The native query is used as is and is not treated as a parameterized string. For example on a physical table y with nameInSource="x" and teiid_rel:native-query="select c from g", the Teiid source query"SELECT c FROM y" would generate the SQL query "SELECT c FROM (select c from g) as x". Note that the column names in the native query must match the nameInSource of the physical table columns for the resulting SQL to be valid.
For physical procedures you may also set the teiid_rel:native-query extension metadata to a desired query string with the added ability to positionally reference IN parameters - see Parameterizable Native Queries. The teiid_rel:non-prepared extension metadata property may be set to false to turn off parameter binding. Note this option should be used with caution as inbound may allow for SQL injection attacks if not properly validated. The native query does not need to call a stored procedure. Any SQL that returns a result set positionally matching the result set expected by the physical stored procedure metadata will work. For example on a stored procedure x with teiid_rel:native-query="select c from g where c1 = $1 and c2 = `$$1"', the Teiid source query "CALL x(?)" would generate the SQL query "select c from g where c1 = ? and c2 = `$1"'. Note that ? in this example will be replaced with the actual value bound to parameter 1.
Direct Query Procedure
This feature is turned off by default because of the security risk this exposes to execute any command against the source. To enable this feature, override the execution property called _SupportsDirectQueryProcedure to true.
By default the name of the procedure that executes the queries directly is native. Override the execution property _DirectQueryProcedureName to change it to another name.
The JDBC translator provides a procedure to execute any ad-hoc SQL query directly against the source without Teiid parsing or resolving. Since the metadata of this procedure’s results are not known to Teiid, they are returned as an object array. ARRAYTABLE can be used construct tabular output for consumption by client applications.
SELECT x.* FROM (call jdbc_source.native('select * from g1')) w,
ARRAYTABLE(w.tuple COLUMNS "e1" integer , "e2" string) AS x
SELECT x.* FROM (call jdbc_source.native('insert into g1 (e1,e2) values (?, ?)', 112, 'foo')) w,
ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
SELECT x.* FROM (call jdbc_source.native('update g1 set e2=? where e1 = ?','blah', 112)) w,
ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
SELECT x.* FROM (call jdbc_source.native('delete from g1 where e1 = ?', 112)) w,
ARRAYTABLE(w.tuple COLUMNS "update_count" integer) AS x
JCA Resource Adapter
The resource adapter for this translator provided through data source in WildFly, See to Admin Guide section WildFly Data Sources for configuration.