diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 142049a66..51824a19d 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -538,12 +538,15 @@ ** xref:reference:sql/index.adoc[Redpanda SQL Reference] *** xref:reference:sql/sql-statements/index.adoc[Statements] **** xref:reference:sql/sql-statements/keywords.adoc[] +**** xref:reference:sql/sql-statements/alter-iceberg-catalog.adoc[] **** xref:reference:sql/sql-statements/alter-redpanda-catalog.adoc[] **** xref:reference:sql/sql-statements/alter-storage.adoc[] **** xref:reference:sql/sql-statements/alter-table.adoc[] +**** xref:reference:sql/sql-statements/create-iceberg-catalog.adoc[] **** xref:reference:sql/sql-statements/create-redpanda-catalog.adoc[] **** xref:reference:sql/sql-statements/create-storage.adoc[] **** xref:reference:sql/sql-statements/create-table.adoc[] +**** xref:reference:sql/sql-statements/drop-iceberg-catalog.adoc[] **** xref:reference:sql/sql-statements/drop-redpanda-catalog.adoc[] **** xref:reference:sql/sql-statements/drop-storage.adoc[] **** xref:reference:sql/sql-statements/drop-table.adoc[] diff --git a/modules/reference/pages/sql/sql-statements/alter-iceberg-catalog.adoc b/modules/reference/pages/sql/sql-statements/alter-iceberg-catalog.adoc new file mode 100644 index 000000000..abdc6d45c --- /dev/null +++ b/modules/reference/pages/sql/sql-statements/alter-iceberg-catalog.adoc @@ -0,0 +1,40 @@ += ALTER ICEBERG CATALOG +:description: The ALTER ICEBERG CATALOG statement modifies connection properties of an existing Iceberg catalog. +:page-topic-type: reference + +The `ALTER ICEBERG CATALOG` statement modifies connection properties of an existing Iceberg catalog. You must repeat the `STORAGE` clause when altering, even if the storage connection is not changing. + +== Syntax + +[source,sql] +---- +ALTER ICEBERG CATALOG [IF EXISTS] catalog_name STORAGE storage_name +WITH (option = 'value' [, ...]); +---- + +* `catalog_name`: Name of the Iceberg catalog to modify. +* `IF EXISTS`: Optional. Prevents an error if the Iceberg catalog does not exist. +* `storage_name`: Name of the storage connection backing the catalog. +* `option = 'value'`: One or more connection options to update. See xref:reference:sql/sql-statements/create-iceberg-catalog.adoc[CREATE ICEBERG CATALOG] for the full list of options. + +== Examples + +Update the REST catalog URI for an existing Iceberg catalog: + +[source,sql] +---- +ALTER ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage +WITH (uri = 'https://new-catalog.example.com'); +---- + +Rotate the basic-authentication credentials on an existing Iceberg catalog: + +[source,sql] +---- +ALTER ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage +WITH ( + auth_type = 'basic', + username = '', + password = '' +); +---- diff --git a/modules/reference/pages/sql/sql-statements/create-iceberg-catalog.adoc b/modules/reference/pages/sql/sql-statements/create-iceberg-catalog.adoc new file mode 100644 index 000000000..f320624c9 --- /dev/null +++ b/modules/reference/pages/sql/sql-statements/create-iceberg-catalog.adoc @@ -0,0 +1,210 @@ += CREATE ICEBERG CATALOG +:description: The CREATE ICEBERG CATALOG statement creates a named connection to an Iceberg REST catalog, enabling Redpanda SQL to query Iceberg-translated topic data. +:page-topic-type: reference + +The `CREATE ICEBERG CATALOG` statement creates a named connection to an Iceberg REST catalog. Link the Iceberg catalog to a Redpanda catalog with `USING CATALOG` so that queries against the linked Redpanda catalog return both live and Iceberg-translated records. Standalone querying against an Iceberg catalog is not supported. See xref:sql:query-data/query-iceberg-topics.adoc[Query Iceberg topics] for the end-to-end workflow. + +The statement requires an existing xref:reference:sql/sql-statements/create-storage.adoc[storage connection] that holds the object-storage credentials for the Iceberg warehouse. + +== Syntax + +[source,sql] +---- +CREATE ICEBERG CATALOG [IF NOT EXISTS] catalog_name STORAGE storage_name + WITH (option = 'value' [, ...]); +---- + +* `catalog_name`: Name for the new Iceberg catalog. +* `IF NOT EXISTS`: Optional. Prevents an error if an Iceberg catalog with the same name already exists. +* `storage_name`: Name of an existing storage connection. Create it first with xref:reference:sql/sql-statements/create-storage.adoc[CREATE STORAGE]. + +NOTE: Catalogs are created in the current schema (`public` by default). To create a catalog in a different schema, qualify the name as `schema.catalog_name`. The auto-created `default_iceberg_catalog` is in `public`. + +== Options + +[cols="<30%,<15%,<10%,<45%",options="header"] +|=== +|Option |Type |Required |Description + +|`uri` +|STRING +|Yes +|REST catalog endpoint URI. + +|`warehouse` +|STRING +|No +|Iceberg warehouse identifier or location. + +|`auth_type` +|STRING +|No +|Authentication type for the REST catalog. One of `oauth2`, `basic`, or `aws_sigv4`. If omitted, the catalog connects without authentication. Providing an auth-specific option (such as `username` or `aws_region`) without `auth_type` is rejected. + +|`oauth2_client_id` +|STRING +|Required when `auth_type = 'oauth2'` +|OAuth2 client ID. + +|`oauth2_client_secret` +|STRING +|Required when `auth_type = 'oauth2'` +|OAuth2 client secret. + +|`oauth2_scope` +|STRING +|No +|OAuth2 scope to request. + +|`oauth2_token_endpoint_url` +|STRING +|No +|OAuth2 token endpoint URL. Use to override the catalog's default token endpoint. + +|`oauth2_token_refresh_margin_seconds` +|INTEGER +|No +|Number of seconds before token expiry to refresh. Must be between 0 and 2147483647. + +|`username` +|STRING +|Required when `auth_type = 'basic'` +|Basic authentication username. + +|`password` +|STRING +|Required when `auth_type = 'basic'` +|Basic authentication password. + +|`aws_region` +|STRING +|Required when `auth_type = 'aws_sigv4'` +|AWS region for SigV4 request signing (for example, `us-west-2`). + +|`aws_access_key_id` +|STRING +|No +|AWS access key ID for SigV4 signing. Must be set together with `aws_secret_access_key`. If both are omitted, the catalog uses the AWS default credential chain (environment variables, shared config, STS web identity, IMDSv2/ECS). + +|`aws_secret_access_key` +|STRING +|No +|AWS secret access key for SigV4 signing. See `aws_access_key_id` for credential-chain behavior. + +|`ssl_verify` +|STRING +|No +|`'true'` (default) or `'false'`. Whether to verify the REST catalog's TLS certificate. + +|`ssl_ca_info` +|STRING +|No +|Path to a CA certificate file used to verify the REST catalog's TLS certificate. + +|`ssl_ca_path` +|STRING +|No +|Path to a directory containing CA certificates. + +|`ssl_crl_file` +|STRING +|No +|Path to a certificate revocation list (CRL) file. +|=== + +== Examples + +=== Create a basic Iceberg catalog + +Connect to a REST catalog without authentication. The catalog uses TLS verification by default. + +[source,sql] +---- +CREATE ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage + WITH ( + uri = 'https://catalog.example.com', + warehouse = 's3://warehouse/' + ); +---- + +=== Create an Iceberg catalog with OAuth2 authentication + +[source,sql] +---- +CREATE ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage + WITH ( + uri = 'https://catalog.example.com', + warehouse = 's3://lakehouse-data/', + auth_type = 'oauth2', + oauth2_client_id = '', + oauth2_client_secret = '', + oauth2_scope = 'PRINCIPAL_ROLE:ALL', + oauth2_token_endpoint_url = 'https://auth.example.com/token', + oauth2_token_refresh_margin_seconds = 300 + ); +---- + +=== Create an Iceberg catalog with basic authentication + +[source,sql] +---- +CREATE ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage + WITH ( + uri = 'https://catalog.example.com', + warehouse = 's3://warehouse/', + auth_type = 'basic', + username = '', + password = '' + ); +---- + +=== Create an Iceberg catalog with AWS SigV4 authentication + +Use for REST catalogs fronted by AWS services (such as AWS Glue). + +[source,sql] +---- +CREATE ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage + WITH ( + uri = 'https://catalog.example.com', + warehouse = 's3://warehouse/', + auth_type = 'aws_sigv4', + aws_region = 'us-west-2', + aws_access_key_id = '', + aws_secret_access_key = '' + ); +---- + +To use the AWS default credential chain (for example, an EC2 instance-profile role), omit `aws_access_key_id` and `aws_secret_access_key`. They must be set together or omitted together. + +=== Create an Iceberg catalog with custom TLS settings + +[source,sql] +---- +CREATE ICEBERG CATALOG lakehouse_catalog STORAGE iceberg_storage + WITH ( + uri = 'https://catalog.example.com', + warehouse = 's3://warehouse/', + ssl_verify = 'true', + ssl_ca_info = '/etc/ssl/certs/catalog-ca.pem' + ); +---- + +== Related statements + +[cols="<40%,<60%",options="header"] +|=== +|Statement |Description + +|xref:reference:sql/sql-statements/alter-iceberg-catalog.adoc[ALTER ICEBERG CATALOG] +|Modify connection properties of an existing Iceberg catalog. + +|xref:reference:sql/sql-statements/drop-iceberg-catalog.adoc[DROP ICEBERG CATALOG] +|Remove an Iceberg catalog. + +|xref:reference:sql/sql-statements/create-storage.adoc[CREATE STORAGE] +|Create the storage connection that backs the Iceberg catalog. + +|xref:reference:sql/sql-statements/create-redpanda-catalog.adoc[CREATE REDPANDA CATALOG] +|Create a Redpanda catalog. Use `USING CATALOG` to link a Redpanda catalog to an Iceberg catalog so that queries return both live and Iceberg-translated records. +|=== diff --git a/modules/reference/pages/sql/sql-statements/create-redpanda-catalog.adoc b/modules/reference/pages/sql/sql-statements/create-redpanda-catalog.adoc index fef4446c9..36d1a6f8c 100644 --- a/modules/reference/pages/sql/sql-statements/create-redpanda-catalog.adoc +++ b/modules/reference/pages/sql/sql-statements/create-redpanda-catalog.adoc @@ -9,11 +9,15 @@ The `CREATE REDPANDA CATALOG` statement creates a named connection to a Redpanda [source,sql] ---- CREATE REDPANDA CATALOG [IF NOT EXISTS] catalog_name -WITH (option = 'value' [, ...]); + [USING CATALOG [schema.]iceberg_catalog_name] + WITH (option = 'value' [, ...]); ---- * `catalog_name`: Name for the new catalog connection. * `IF NOT EXISTS`: Optional. Prevents an error if a catalog with the same name already exists. +* `USING CATALOG iceberg_catalog_name`: Optional. Links the Redpanda catalog to an existing Iceberg catalog so that queries against tables in this catalog can return data from both the Redpanda topic and its corresponding Iceberg table in a single result. The Iceberg catalog must already exist. You can qualify the Iceberg catalog name with a schema prefix. + +NOTE: Catalogs are created in the current schema (`public` by default). To create a catalog in a different schema, qualify the name as `schema.catalog_name`. The auto-created `default_redpanda_catalog` is in `public`. == Options @@ -34,32 +38,37 @@ WITH (option = 'value' [, ...]); |`sasl_mechanism` |STRING |No -|SASL authentication mechanism (for example, `SCRAM-SHA-256`). +|SASL authentication mechanism. Only `SCRAM-SHA-256` and `SCRAM-SHA-512` are accepted. -|`sasl_username` +|`sasl_user` |STRING |No -|SASL username. +|SASL username. Also used as the basic-authentication username for Schema Registry (and, when present, the HTTP Proxy endpoint set by `pandaproxy_url`). |`sasl_password` |STRING |No -|SASL password. +|SASL password. Also used as the basic-authentication password for Schema Registry (and, when present, the HTTP Proxy endpoint set by `pandaproxy_url`). -|`tls_enabled` +|`truststore` |STRING |No -|Enable TLS for broker connections (`true` or `false`). +|PEM-encoded CA certificate used to verify the TLS certificates presented by the Redpanda brokers, the Schema Registry, and (when set) the HTTP Proxy. Use TLS by specifying an `https://` URL for `schema_registry_url` and `pandaproxy_url`. -|`schema_registry_username` +|`key_store_key` |STRING |No -|Schema Registry authentication username. +|PEM-encoded client private key for mutual TLS (mTLS) to the Redpanda brokers. Must be set together with `key_store_cert`. -|`schema_registry_password` +|`key_store_cert` |STRING |No -|Schema Registry authentication password. +|PEM-encoded client certificate for mutual TLS (mTLS) to the Redpanda brokers. Must be set together with `key_store_key`. + +|`pandaproxy_url` +|STRING +|Conditional +|Base URL of the Redpanda HTTP Proxy REST API. Required when the catalog includes a `USING CATALOG` clause; Redpanda SQL uses this endpoint to fetch Iceberg translation state for queries that span the topic and its Iceberg table. |=== == Examples @@ -75,7 +84,9 @@ WITH ( ); ---- -=== Create a catalog with authentication +=== Create a catalog with SASL authentication and TLS + +The `sasl_user` and `sasl_password` values are used as the basic-authentication credentials for Schema Registry as well as the SASL credentials for the brokers. Use an `https://` URL for `schema_registry_url` and provide `truststore` (PEM-encoded CA) to verify the TLS certificate. [source,sql] ---- @@ -84,10 +95,39 @@ WITH ( initial_brokers = 'broker1:9092', schema_registry_url = 'https://schema-registry:8081', sasl_mechanism = 'SCRAM-SHA-256', - sasl_username = 'admin', + sasl_user = 'admin', sasl_password = 'secret', - tls_enabled = 'true', - schema_registry_username = 'sr_user', - schema_registry_password = 'sr_pass' + truststore = '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----' +); +---- + +=== Create a catalog with mutual TLS + +Provide a client certificate and key for mTLS to the brokers in addition to the truststore. + +[source,sql] +---- +CREATE REDPANDA CATALOG production_redpanda_mtls +WITH ( + initial_brokers = 'broker1:9092', + schema_registry_url = 'https://schema-registry:8081', + truststore = '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----', + key_store_cert = '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----', + key_store_key = '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----' ); ---- + +=== Create a catalog linked to an Iceberg catalog + +Use the `USING CATALOG` clause to link a Redpanda catalog to an existing Iceberg catalog. Queries against tables in the linked Redpanda catalog can then return both live records from the Redpanda topic and Iceberg-translated records from its corresponding Iceberg table in a single result, with no overlap between them. + +[source,sql] +---- +CREATE REDPANDA CATALOG redpanda_with_iceberg + USING CATALOG lakehouse_catalog + WITH ( + initial_brokers = 'broker1:9092', + schema_registry_url = 'http://schema-registry:8081', + pandaproxy_url = 'http://redpanda:8082' + ); +---- diff --git a/modules/reference/pages/sql/sql-statements/drop-iceberg-catalog.adoc b/modules/reference/pages/sql/sql-statements/drop-iceberg-catalog.adoc new file mode 100644 index 000000000..cede11d8f --- /dev/null +++ b/modules/reference/pages/sql/sql-statements/drop-iceberg-catalog.adoc @@ -0,0 +1,33 @@ += DROP ICEBERG CATALOG +:description: The DROP ICEBERG CATALOG statement removes an Iceberg catalog connection. +:page-topic-type: reference + +The `DROP ICEBERG CATALOG` statement removes an Iceberg catalog connection. + +You can't drop an Iceberg catalog while a Redpanda catalog is linked to it through `USING CATALOG`. To drop the Iceberg catalog, first detach or drop the linked Redpanda catalog. + +== Syntax + +[source,sql] +---- +DROP ICEBERG CATALOG [IF EXISTS] catalog_name; +---- + +* `catalog_name`: Name of the Iceberg catalog to remove. +* `IF EXISTS`: Optional. Prevents an error if the Iceberg catalog does not exist. + +== Examples + +Drop an Iceberg catalog: + +[source,sql] +---- +DROP ICEBERG CATALOG lakehouse_catalog; +---- + +Drop the catalog only if it exists: + +[source,sql] +---- +DROP ICEBERG CATALOG IF EXISTS lakehouse_catalog; +---- diff --git a/modules/sql/pages/query-data/query-iceberg-topics.adoc b/modules/sql/pages/query-data/query-iceberg-topics.adoc new file mode 100644 index 000000000..d9ab2b20e --- /dev/null +++ b/modules/sql/pages/query-data/query-iceberg-topics.adoc @@ -0,0 +1,127 @@ += Query Iceberg topics +:description: Query the Iceberg-translated history of a Redpanda topic, and run a single SQL query that spans live records and historical Iceberg-committed records. +:page-topic-type: how-to +:personas: app_developer, data_engineer +:learning-objective-1: Set up the storage, Iceberg catalog, and Redpanda catalog needed to query an Iceberg-enabled topic +:learning-objective-2: Query both the live records and the Iceberg-translated history of a topic in a single result +:learning-objective-3: Handle schema differences between a Redpanda topic and its Iceberg table + +With Iceberg-enabled topics, you can retain streaming data in your lakehouse beyond your Redpanda topic retention window and continue to query it with SQL. A single query returns both the live records still in the topic and the Iceberg-translated history that has aged out under topic retention, in one result. + +To set this up, you create three objects: a storage connection that holds object-storage credentials, an Iceberg catalog that exposes the cluster's REST-catalog endpoint, and a Redpanda catalog linked to the Iceberg catalog with `CREATE REDPANDA CATALOG ... USING CATALOG `. + +To query a topic that is not Iceberg-enabled, see xref:sql:query-data/query-streaming-topics.adoc[]. + +After completing these steps, you will be able to: + +* [ ] {learning-objective-1} +* [ ] {learning-objective-2} +* [ ] {learning-objective-3} + +== Prerequisites + +* A Redpanda BYOC cluster on AWS with Redpanda SQL enabled. See xref:sql:get-started/deploy-sql-cluster.adoc[Enable Redpanda SQL]. +* The cluster's xref:reference:properties/cluster-properties.adoc#iceberg_catalog_type[`iceberg_catalog_type`] property is set to `rest`. The `object_storage` catalog type does not support Iceberg queries from Redpanda SQL. +* The cluster's Iceberg REST catalog is configured. See xref:manage:iceberg/rest-catalog/index.adoc[Integrate with REST Catalogs] for the supported REST catalog options (AWS Glue, Snowflake, Databricks Unity, Polaris, and others) and their configuration steps. +* An Iceberg-enabled Redpanda topic with a schema (Protobuf, Avro, or JSON) registered in Schema Registry. To enable Iceberg translation on a topic, see xref:manage:iceberg/about-iceberg-topics.adoc[]. +* Connect to Redpanda SQL with `psql` or another PostgreSQL client. See xref:sql:connect-to-sql/index.adoc[Connect to Redpanda SQL]. + +== Set up the Iceberg query catalogs + +You create three objects, in this order: a storage connection, an Iceberg catalog, and a Redpanda catalog that links to the Iceberg catalog. The storage and Iceberg-catalog options must match the cluster's xref:manage:iceberg/rest-catalog/index.adoc[REST catalog configuration] (endpoint, credentials, region). + +. Create a storage connection that holds the object-storage credentials your cluster's REST catalog uses: ++ +[source,sql] +---- +CREATE STORAGE IF NOT EXISTS iceberg_storage TYPE = S3 WITH ( + endpoint = '', + access_key_id = '', + secret_access_key = '', + region = '', + path_style = 'true' +); +---- + +. Create an Iceberg catalog that points at the cluster's REST catalog endpoint. Replace `` with the authentication type your REST catalog requires (for example, `aws_sigv4`, `oauth2`, or `basic`) and provide the matching credential options: ++ +[source,sql] +---- +CREATE ICEBERG CATALOG IF NOT EXISTS lakehouse_catalog STORAGE iceberg_storage WITH ( + uri = '', + warehouse = '', + auth_type = '' +); +---- ++ +For the full option list and per-auth examples, see xref:reference:sql/sql-statements/create-iceberg-catalog.adoc[CREATE ICEBERG CATALOG]. + +. Create a Redpanda catalog linked to the Iceberg catalog with `USING CATALOG`. The `pandaproxy_url` option is required when `USING CATALOG` is set: ++ +[source,sql] +---- +CREATE REDPANDA CATALOG IF NOT EXISTS redpanda_with_iceberg +USING CATALOG lakehouse_catalog WITH ( + initial_brokers = ':', + schema_registry_url = '', + pandaproxy_url = '' +); +---- + +== Map a topic as a SQL table + +Define a SQL table against the Iceberg-enabled topic in the linked Redpanda catalog. Replace `orders` and `orders-value` with your topic name and Schema Registry value subject: + +[source,sql] +---- +CREATE TABLE redpanda_with_iceberg=>orders WITH ( + topic = 'orders', + schema_subject = 'orders-value' +); +---- + +Redpanda SQL reads the registered schema from Schema Registry to map fields to SQL columns. + +When you query a table mapped from a Redpanda topic, Redpanda SQL also exposes two reserved metadata columns alongside your schema's columns: + +* `redpanda` (a struct with topic-level metadata such as partition, offset, timestamp, key, and headers) +* `redpanda_raw` (raw key and value bytes) + +These column names are reserved. A topic schema with a top-level `redpanda` or `redpanda_raw` field conflicts with the metadata columns. + +== Query live and historical records together + +Query the table in the linked Redpanda catalog (the one with `USING CATALOG` set) using standard `SELECT` syntax. The query returns records from both the live Redpanda topic and the Iceberg-translated history in one result, with no overlap between them. + +NOTE: After any shape change to the Iceberg table or its corresponding Redpanda topic schema, run `REFRESH =>` to update the schema view Redpanda SQL uses for query planning. Without a refresh, the next query against the table fails at planning time with `Schema not found for Iceberg table '
'`. `REFRESH` updates only the schema view, not data; you don't run it between writes. + +[source,sql] +---- +SELECT * FROM redpanda_with_iceberg=>orders LIMIT 10; +---- + +Redpanda SQL plans the union internally, so you don't write a `UNION ALL`, and rows aren't duplicated at the boundary between live and historical data. + +NOTE: Iceberg-translated data persists independently of Redpanda topic retention. Queries continue to return records past the Redpanda topic's retention window, provided they were translated to Iceberg first. + +// TODO: Verify with engineering whether there are workload patterns that reliably trigger longer planning, and document them if so (qa-questions.md #22). + +== Handle schema differences + +A topic schema can evolve over time. You might add or remove fields in your Schema Registry value subject as your application changes. Redpanda translates new records into the Iceberg table forward-only: it adds columns to the Iceberg table when the topic schema widens, but it does not drop columns from the Iceberg table when the topic schema narrows. As a result, the Iceberg table can carry columns the current topic schema doesn't have. + +Redpanda SQL handles this divergence by treating the topic's Schema Registry subject as canonical and filling in missing fields on the Iceberg side. The rules that apply to a query against a linked Redpanda catalog: + +* The result's column order, count, and types come from the topic schema. +* If the Iceberg table is missing a column that the topic schema has, Redpanda SQL returns `NULL` for that column on Iceberg-side rows. This is common after adding a new column to the topic schema, since earlier records already in Iceberg don't have it. +* If the Iceberg table has columns the topic schema does not, the query fails at planning time with the error `Kafka schema must be a name-superset of Iceberg schema`. This happens when a column is removed from the topic's Schema Registry subject. To resolve, re-add the column to the topic's Schema Registry subject so the topic schema covers every column present in the Iceberg table. + +== Next steps + +* xref:sql:query-data/query-streaming-topics.adoc[Query streaming topics]: query a topic that is not Iceberg-enabled. +* xref:manage:iceberg/rest-catalog/index.adoc[Integrate with REST Catalogs]: managed REST catalog options and their configuration. +* xref:manage:iceberg/use-iceberg-catalogs.adoc[Use Iceberg Catalogs]: more on how Redpanda exposes Iceberg-translated streaming data. +* xref:reference:sql/sql-statements/create-storage.adoc[CREATE STORAGE]: full reference for the storage statement. +* xref:reference:sql/sql-statements/create-iceberg-catalog.adoc[CREATE ICEBERG CATALOG]: full reference for the Iceberg catalog statement. +* xref:reference:sql/sql-statements/create-redpanda-catalog.adoc[CREATE REDPANDA CATALOG]: full reference for the Redpanda catalog statement, including the `USING CATALOG` clause. +* xref:reference:sql/index.adoc[Redpanda SQL Reference]: supported SQL statements, clauses, data types, and functions.