native_query
native_query is a JDBC catalog table function. It executes a database-native SELECT statement through a JDBC catalog and exposes the result as a StarRocks relation.
Use this function when the source database must run SQL that is hard to express against a single JDBC external table, such as a pre-filtered subquery, a join in the source database, or vendor-specific SQL syntax. After native_query returns a relation, you can use StarRocks to apply additional filters, joins, aggregations, projections, or load the result with INSERT INTO.
This function is supported from v4.1 onwards.
Syntaxβ
SELECT ...
FROM TABLE(<jdbc_catalog>.native_query('<select_sql>')) [AS] <alias>
[WHERE ...];
Parametersβ
jdbc_catalogβ
The name of a JDBC catalog. Only JDBC catalogs support this function.
select_sqlβ
A string literal that contains the pass-through SQL statement executed by the source database.
After StarRocks removes leading comments and trailing semicolons from select_sql, the statement must start with SELECT. Use the SQL dialect, object names, quoting rules, and functions of the source database.
If select_sql contains a single quotation mark ('), escape it as two single quotation marks ('') in the StarRocks SQL string.
aliasβ
An optional table alias for the result relation.
Column aliases after the table alias, such as AS q(c1, c2), are not supported. Define column aliases inside select_sql, for example SELECT id AS id_alias FROM ....
Return valueβ
native_query returns a relation whose columns are inferred from the JDBC result set metadata of select_sql. StarRocks maps JDBC column types to StarRocks column types by using the schema resolver of the JDBC catalog.
Usage notesβ
- The StarRocks user needs the
USAGEprivilege on the JDBC catalog. Permissions on source database objects are checked by the remote database with the user configured in the JDBC catalog. select_sqlmust be a string literal and must be the only argument. Named arguments are not supported.select_sqlmust start withSELECTafter leading comments are removed. Statements that start withWITH,INSERT,UPDATE,DELETE, or other non-SELECTkeywords are not supported.- The legacy
<catalog>.system.query(...)form is not supported. - If the source query returns no columns, StarRocks returns an error during analysis.
Examplesβ
The following examples assume that the source MySQL database contains a table named app.orders and that a JDBC catalog named jdbc0 has been created in StarRocks.
Example 1: Run a source-side subquery and apply an outer StarRocks filter.
SELECT id, name, doubled_score
FROM TABLE(jdbc0.native_query(
'SELECT id, name, score * 2 AS doubled_score
FROM app.orders
WHERE score >= 20'
)) q
WHERE doubled_score < 70
ORDER BY id;
Example 2: Aggregate the result returned by the pass-through query.
SELECT category, SUM(score) AS total_score
FROM TABLE(jdbc0.native_query(
'SELECT category, score
FROM app.orders
WHERE status = ''PAID'''
)) q
GROUP BY category
ORDER BY category;
Example 3: Load the result of a native query into a StarRocks table.
INSERT INTO paid_order_summary
SELECT category, SUM(score) AS total_score
FROM TABLE(jdbc0.native_query(
'SELECT category, score
FROM app.orders
WHERE status = ''PAID'''
)) q
GROUP BY category;
Unsupported formsβ
-- Named arguments are not supported.
SELECT * FROM TABLE(jdbc0.native_query(query => 'SELECT id FROM app.orders'));
-- The legacy system.query alias is not supported.
SELECT * FROM TABLE(jdbc0.system.query('SELECT id FROM app.orders'));
-- WITH queries are not supported because the SQL must start with SELECT.
SELECT * FROM TABLE(jdbc0.native_query('WITH q AS (SELECT id FROM app.orders) SELECT * FROM q'));
-- Column aliases after the table alias are not supported.
SELECT * FROM TABLE(jdbc0.native_query('SELECT id FROM app.orders')) q(id_alias);