From a1e1bea744320df53208071e3907522f856deb92 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Mon, 16 Jun 2025 23:50:41 +0530 Subject: [PATCH 1/5] remove all preview notices --- src/content/docs/snowflake/capabilities/clones.md | 2 +- src/content/docs/snowflake/capabilities/config.md | 2 +- src/content/docs/snowflake/capabilities/ephemeral-instances.md | 2 +- src/content/docs/snowflake/capabilities/init-hooks.md | 2 +- src/content/docs/snowflake/capabilities/state-management.md | 2 +- src/content/docs/snowflake/capabilities/storage-integrations.md | 2 +- src/content/docs/snowflake/capabilities/tags.md | 2 +- src/content/docs/snowflake/changelog.md | 2 +- src/content/docs/snowflake/getting-started/faq.md | 2 +- src/content/docs/snowflake/getting-started/index.md | 2 +- src/content/docs/snowflake/getting-started/quickstart.md | 2 +- src/content/docs/snowflake/integrations/airflow.md | 2 +- .../docs/snowflake/integrations/continuous-integration.md | 2 +- src/content/docs/snowflake/integrations/dbeaver.md | 2 +- src/content/docs/snowflake/integrations/dbt.md | 2 +- src/content/docs/snowflake/integrations/flyway.md | 2 +- src/content/docs/snowflake/integrations/pulumi.md | 2 +- src/content/docs/snowflake/integrations/snow-cli.md | 2 +- src/content/docs/snowflake/integrations/snow-sql.md | 2 +- src/content/docs/snowflake/integrations/terraform.md | 2 +- .../docs/snowflake/services/cross-database-resource-sharing.md | 2 +- src/content/docs/snowflake/services/dynamic-tables.md | 2 +- src/content/docs/snowflake/services/hybrid-tables.md | 2 +- src/content/docs/snowflake/services/iceberg-tables.md | 2 +- src/content/docs/snowflake/services/snowpipe.md | 2 +- src/content/docs/snowflake/services/stages.md | 2 +- src/content/docs/snowflake/services/streamlit.md | 2 +- src/content/docs/snowflake/services/streams.md | 2 +- src/content/docs/snowflake/services/tasks.md | 2 +- src/content/docs/snowflake/services/user-defined-functions.md | 2 +- src/content/docs/snowflake/tooling/snowflake-drivers.md | 2 +- src/content/docs/snowflake/tooling/snowpark.md | 2 +- src/content/docs/snowflake/tooling/web-user-interface.md | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/content/docs/snowflake/capabilities/clones.md b/src/content/docs/snowflake/capabilities/clones.md index 6546423f..33c58cb8 100644 --- a/src/content/docs/snowflake/capabilities/clones.md +++ b/src/content/docs/snowflake/capabilities/clones.md @@ -3,7 +3,7 @@ title: Clones description: Get started with Clones in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/capabilities/config.md b/src/content/docs/snowflake/capabilities/config.md index 98806084..4851501c 100644 --- a/src/content/docs/snowflake/capabilities/config.md +++ b/src/content/docs/snowflake/capabilities/config.md @@ -7,7 +7,7 @@ label: --- -{{< preview-notice >}} + LocalStack exposes various configuration options to control its behaviour. diff --git a/src/content/docs/snowflake/capabilities/ephemeral-instances.md b/src/content/docs/snowflake/capabilities/ephemeral-instances.md index 849c8d3a..708a0b58 100644 --- a/src/content/docs/snowflake/capabilities/ephemeral-instances.md +++ b/src/content/docs/snowflake/capabilities/ephemeral-instances.md @@ -3,7 +3,7 @@ title: Ephemeral Instances description: Get started with Ephemeral Instances in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/capabilities/init-hooks.md b/src/content/docs/snowflake/capabilities/init-hooks.md index 6340a42a..2d54717c 100644 --- a/src/content/docs/snowflake/capabilities/init-hooks.md +++ b/src/content/docs/snowflake/capabilities/init-hooks.md @@ -3,7 +3,7 @@ title: Initialization Hooks description: Writing SQL scripts to initialize your Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/capabilities/state-management.md b/src/content/docs/snowflake/capabilities/state-management.md index 065b541c..79cac115 100644 --- a/src/content/docs/snowflake/capabilities/state-management.md +++ b/src/content/docs/snowflake/capabilities/state-management.md @@ -3,7 +3,7 @@ title: State Management description: Get started with State Management in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/capabilities/storage-integrations.md b/src/content/docs/snowflake/capabilities/storage-integrations.md index 943f933a..c3db2666 100644 --- a/src/content/docs/snowflake/capabilities/storage-integrations.md +++ b/src/content/docs/snowflake/capabilities/storage-integrations.md @@ -3,7 +3,7 @@ title: Storage Integrations description: Get started with Storage Integrations in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/capabilities/tags.md b/src/content/docs/snowflake/capabilities/tags.md index 9123016a..b2a5eb7f 100644 --- a/src/content/docs/snowflake/capabilities/tags.md +++ b/src/content/docs/snowflake/capabilities/tags.md @@ -3,7 +3,7 @@ title: Tags description: Get started with Tags in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/changelog.md b/src/content/docs/snowflake/changelog.md index 8a529d90..85a495c1 100644 --- a/src/content/docs/snowflake/changelog.md +++ b/src/content/docs/snowflake/changelog.md @@ -6,7 +6,7 @@ nav: label: --- -{{< preview-notice >}} + ### 0.3.0 - Add support for multi-account setups diff --git a/src/content/docs/snowflake/getting-started/faq.md b/src/content/docs/snowflake/getting-started/faq.md index c788eb95..78cecd3c 100644 --- a/src/content/docs/snowflake/getting-started/faq.md +++ b/src/content/docs/snowflake/getting-started/faq.md @@ -5,7 +5,7 @@ template: doc --- -{{< preview-notice >}} + ## FAQs diff --git a/src/content/docs/snowflake/getting-started/index.md b/src/content/docs/snowflake/getting-started/index.md index 2c3f77c4..147d1a82 100644 --- a/src/content/docs/snowflake/getting-started/index.md +++ b/src/content/docs/snowflake/getting-started/index.md @@ -4,7 +4,7 @@ description: Basic installation guide to get started with LocalStack for Snowfla template: doc --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/getting-started/quickstart.md b/src/content/docs/snowflake/getting-started/quickstart.md index 5aa3683b..294fad8e 100644 --- a/src/content/docs/snowflake/getting-started/quickstart.md +++ b/src/content/docs/snowflake/getting-started/quickstart.md @@ -4,7 +4,7 @@ description: Get started with LocalStack for Snowflake in a few simple steps template: doc --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/airflow.md b/src/content/docs/snowflake/integrations/airflow.md index 8c9fa6d1..0c2d00f8 100644 --- a/src/content/docs/snowflake/integrations/airflow.md +++ b/src/content/docs/snowflake/integrations/airflow.md @@ -3,7 +3,7 @@ title: Airflow description: Use Airflow to run local ETL jobs against the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/continuous-integration.md b/src/content/docs/snowflake/integrations/continuous-integration.md index a49a8ab9..a4df6365 100644 --- a/src/content/docs/snowflake/integrations/continuous-integration.md +++ b/src/content/docs/snowflake/integrations/continuous-integration.md @@ -3,7 +3,7 @@ title: Continuous Integration description: Get started with Snowflake emulator in continuous integration (CI) environments. --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/dbeaver.md b/src/content/docs/snowflake/integrations/dbeaver.md index 381bd7cd..89336ad5 100644 --- a/src/content/docs/snowflake/integrations/dbeaver.md +++ b/src/content/docs/snowflake/integrations/dbeaver.md @@ -3,7 +3,7 @@ title: DBeaver description: Use DBeaver to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/dbt.md b/src/content/docs/snowflake/integrations/dbt.md index e5682212..f19898ea 100644 --- a/src/content/docs/snowflake/integrations/dbt.md +++ b/src/content/docs/snowflake/integrations/dbt.md @@ -3,7 +3,7 @@ title: dbt description: Use dbt to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/flyway.md b/src/content/docs/snowflake/integrations/flyway.md index 6afd513e..67fb0000 100644 --- a/src/content/docs/snowflake/integrations/flyway.md +++ b/src/content/docs/snowflake/integrations/flyway.md @@ -3,7 +3,7 @@ title: Flyway description: Use Flyway to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/pulumi.md b/src/content/docs/snowflake/integrations/pulumi.md index 6a493da7..8ef2228d 100644 --- a/src/content/docs/snowflake/integrations/pulumi.md +++ b/src/content/docs/snowflake/integrations/pulumi.md @@ -3,7 +3,7 @@ title: Pulumi description: Use Pulumi to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/snow-cli.md b/src/content/docs/snowflake/integrations/snow-cli.md index b6a4a956..6bd1196d 100644 --- a/src/content/docs/snowflake/integrations/snow-cli.md +++ b/src/content/docs/snowflake/integrations/snow-cli.md @@ -3,7 +3,7 @@ title: Snow CLI description: Use Snow CLI to interact with the Snowflake emulator. --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/snow-sql.md b/src/content/docs/snowflake/integrations/snow-sql.md index c3f099c0..21834c50 100644 --- a/src/content/docs/snowflake/integrations/snow-sql.md +++ b/src/content/docs/snowflake/integrations/snow-sql.md @@ -3,7 +3,7 @@ title: SnowSQL description: Use SnowSQL to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/integrations/terraform.md b/src/content/docs/snowflake/integrations/terraform.md index f3372cb9..fcb44b7a 100644 --- a/src/content/docs/snowflake/integrations/terraform.md +++ b/src/content/docs/snowflake/integrations/terraform.md @@ -3,7 +3,7 @@ title: Terraform description: Use Terraform to interact with the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/cross-database-resource-sharing.md b/src/content/docs/snowflake/services/cross-database-resource-sharing.md index a912e425..e69149ca 100644 --- a/src/content/docs/snowflake/services/cross-database-resource-sharing.md +++ b/src/content/docs/snowflake/services/cross-database-resource-sharing.md @@ -3,7 +3,7 @@ title: Cross-Database Resource Sharing description: Get started with cross-database resource sharing in the Snowflake emulator --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/dynamic-tables.md b/src/content/docs/snowflake/services/dynamic-tables.md index d8b21cfb..8fb30883 100644 --- a/src/content/docs/snowflake/services/dynamic-tables.md +++ b/src/content/docs/snowflake/services/dynamic-tables.md @@ -3,7 +3,7 @@ title: Dynamic Tables description: Get started with Dynamic Tables in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/hybrid-tables.md b/src/content/docs/snowflake/services/hybrid-tables.md index c6c87173..e94dae1c 100644 --- a/src/content/docs/snowflake/services/hybrid-tables.md +++ b/src/content/docs/snowflake/services/hybrid-tables.md @@ -3,7 +3,7 @@ title: Hybrid Tables description: Get started with Hybrid Tables in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/iceberg-tables.md b/src/content/docs/snowflake/services/iceberg-tables.md index 8f664283..c5aaaaf7 100644 --- a/src/content/docs/snowflake/services/iceberg-tables.md +++ b/src/content/docs/snowflake/services/iceberg-tables.md @@ -3,7 +3,7 @@ title: Iceberg Tables description: This is a dummy description. --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/snowpipe.md b/src/content/docs/snowflake/services/snowpipe.md index f3667d7a..5f20cda1 100644 --- a/src/content/docs/snowflake/services/snowpipe.md +++ b/src/content/docs/snowflake/services/snowpipe.md @@ -3,7 +3,7 @@ title: Snowpipe description: Get started with Snowpipe in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/stages.md b/src/content/docs/snowflake/services/stages.md index f17e7f7d..40757afc 100644 --- a/src/content/docs/snowflake/services/stages.md +++ b/src/content/docs/snowflake/services/stages.md @@ -3,7 +3,7 @@ title: Stages description: Get started with Stages in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/streamlit.md b/src/content/docs/snowflake/services/streamlit.md index 876377b7..1a2c1ac8 100644 --- a/src/content/docs/snowflake/services/streamlit.md +++ b/src/content/docs/snowflake/services/streamlit.md @@ -3,7 +3,7 @@ title: Streamlit description: Get started with Streamlit in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/streams.md b/src/content/docs/snowflake/services/streams.md index 60299468..74606397 100644 --- a/src/content/docs/snowflake/services/streams.md +++ b/src/content/docs/snowflake/services/streams.md @@ -3,7 +3,7 @@ title: Streams description: Get started with Streams in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/tasks.md b/src/content/docs/snowflake/services/tasks.md index b87911a4..7241148e 100644 --- a/src/content/docs/snowflake/services/tasks.md +++ b/src/content/docs/snowflake/services/tasks.md @@ -3,7 +3,7 @@ title: Tasks description: Get started with Tasks in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/services/user-defined-functions.md b/src/content/docs/snowflake/services/user-defined-functions.md index aa57c909..30d8358a 100644 --- a/src/content/docs/snowflake/services/user-defined-functions.md +++ b/src/content/docs/snowflake/services/user-defined-functions.md @@ -3,7 +3,7 @@ title: User-Defined Functions description: Get started with User-Defined Functions in Node.js & Python with LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/tooling/snowflake-drivers.md b/src/content/docs/snowflake/tooling/snowflake-drivers.md index b50b5224..70c66683 100644 --- a/src/content/docs/snowflake/tooling/snowflake-drivers.md +++ b/src/content/docs/snowflake/tooling/snowflake-drivers.md @@ -3,7 +3,7 @@ title: Snowflake Drivers description: Get started with Snowflake Drivers in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/tooling/snowpark.md b/src/content/docs/snowflake/tooling/snowpark.md index 2ccd9bce..663ba50b 100644 --- a/src/content/docs/snowflake/tooling/snowpark.md +++ b/src/content/docs/snowflake/tooling/snowpark.md @@ -3,7 +3,7 @@ title: Snowpark description: Get started with Snowpark in LocalStack for Snowflake --- -{{< preview-notice >}} + ## Introduction diff --git a/src/content/docs/snowflake/tooling/web-user-interface.md b/src/content/docs/snowflake/tooling/web-user-interface.md index 18343b63..a5471e85 100644 --- a/src/content/docs/snowflake/tooling/web-user-interface.md +++ b/src/content/docs/snowflake/tooling/web-user-interface.md @@ -3,7 +3,7 @@ title: Web UI description: Get started with LocalStack for Snowflake Web User Interface --- -{{< preview-notice >}} + ## Introduction From 45b51e147281d637447989c8261a3a18d99be660 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Tue, 17 Jun 2025 00:07:49 +0530 Subject: [PATCH 2/5] finish cherrypicking --- public/images/snowflake/native-app.png | Bin 0 -> 141197 bytes .../capabilities/ephemeral-instances.md | 29 --- .../capabilities/state-management.md | 28 --- .../docs/snowflake/integrations/dbt.md | 31 +-- .../docs/snowflake/services/authentication.md | 71 ++++++ .../snowflake/services/materialized-views.md | 91 ++++++++ .../docs/snowflake/services/native-apps.md | 80 +++++++ .../snowflake/services/polaris-catalog.md | 212 ++++++++++++++++++ .../snowflake/services/row-access-policies.md | 84 +++++++ .../docs/snowflake/services/snowpipe.md | 2 - .../services/transaction-management.md | 106 +++++++++ .../services/user-defined-functions.md | 86 ++++++- 12 files changed, 726 insertions(+), 94 deletions(-) create mode 100644 public/images/snowflake/native-app.png delete mode 100644 src/content/docs/snowflake/capabilities/ephemeral-instances.md create mode 100644 src/content/docs/snowflake/services/authentication.md create mode 100644 src/content/docs/snowflake/services/materialized-views.md create mode 100644 src/content/docs/snowflake/services/native-apps.md create mode 100644 src/content/docs/snowflake/services/polaris-catalog.md create mode 100644 src/content/docs/snowflake/services/row-access-policies.md create mode 100644 src/content/docs/snowflake/services/transaction-management.md diff --git a/public/images/snowflake/native-app.png b/public/images/snowflake/native-app.png new file mode 100644 index 0000000000000000000000000000000000000000..faf5f28c545927b477aff5d92487a9087ff1a6f2 GIT binary patch literal 141197 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

D#d{t%O%T@;eN8 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 C>7Jqh literal 0 HcmV?d00001 diff --git a/src/content/docs/snowflake/capabilities/ephemeral-instances.md b/src/content/docs/snowflake/capabilities/ephemeral-instances.md deleted file mode 100644 index 708a0b58..00000000 --- a/src/content/docs/snowflake/capabilities/ephemeral-instances.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Ephemeral Instances -description: Get started with Ephemeral Instances in LocalStack for Snowflake ---- - - - -## Introduction - -Ephemeral Instances allows you to run a LocalStack for Snowflake instance in the cloud. You can interact with these instances by configuring your Snowflake host with the endpoint URL of the ephemeral instance. - -{{< alert title="Note" >}} -Ephemeral Instances is offered as a **preview** feature and under active development. -{{< /alert >}} - -## Getting started - -Navigate to the [LocalStack Ephemeral Instance Management](https://app.localstack.cloud/instances/ephemeral) page. In the form, enter the name of the new Ephemeral Instance, choose **LocalStack Snowflake (preview)**, select the lifetime of the instance by dragging the slider, and click on **Launch**. - -Creating an Ephemeral Instance - -After the ephemeral instance is created, you can run the following command to verify the status of the instance: - -{{< command >}} -$ export SNOWFLAKE_HOST= -$ curl -d '{}' $SNOWFLAKE_HOST/session -{{< /command >}} - -You can access the Ephemeral Instance via the SnowSQL or any alternative SQL client by configuring the Snowflake host with the endpoint URL of the Ephemeral Instance. \ No newline at end of file diff --git a/src/content/docs/snowflake/capabilities/state-management.md b/src/content/docs/snowflake/capabilities/state-management.md index 79cac115..b4d58ea4 100644 --- a/src/content/docs/snowflake/capabilities/state-management.md +++ b/src/content/docs/snowflake/capabilities/state-management.md @@ -11,7 +11,6 @@ State Management in LocalStack allows you to save and load the state of your Loc State Management in LocalStack encompasses the following features: -- **Cloud Pods**: Cloud Pods are persistent state snapshots of your LocalStack instance that can easily be shared, stored, versioned, and restored. - **Export & Import State**: Export and import the state of your LocalStack instance on your local machine as a local file. - **Persistence**: Persist the state of your LocalStack instance on your local machine using a configuration variable. @@ -75,30 +74,3 @@ $ localstack state import '' {{< /command >}} The `` argument is required and specifies the file path to import the state from. The file should be generated from a previous export. - -## Cloud Pods - -Cloud pods are persistent state snapshots of your LocalStack instance that can easily be stored, versioned, shared, and restored. Cloud Pods can be used for various purposes, such as: - -- Save and manage snapshots of active LocalStack instances. -- Share state snapshots with your team to debug collectively. -- Automate your testing pipelines by pre-seeding CI environments. -- Create reproducible development and testing environments locally. - -You can save and load the persistent state of Cloud Pods, using the Cloud Pods CLI. LocalStack provides a remote storage backend that can be used to store the state of your running application and share it with your team members. Cloud Pods CLI is included in the [LocalStack CLI installation](https://docs.localstack.cloud/getting-started/installation/#localstack-cli), so there's no need for additional installations to begin using it. - -### Create a new Cloud Pod - -To create the Cloud Pod, you can run the following command: - -{{< command >}} -$ localstack pod save '' -{{< /command >}} - -### Load an existing Cloud Pod - -To load the Cloud Pod, you can run the following command: - -{{< command >}} -$ localstack pod load '' -{{< /command >}} \ No newline at end of file diff --git a/src/content/docs/snowflake/integrations/dbt.md b/src/content/docs/snowflake/integrations/dbt.md index f19898ea..03044b8e 100644 --- a/src/content/docs/snowflake/integrations/dbt.md +++ b/src/content/docs/snowflake/integrations/dbt.md @@ -142,35 +142,6 @@ models: materialized: table ``` -### Connect to dbt Cloud - -To use dbt Cloud with the Snowflake emulator, you'll first need to configure an ephemeral instance. Ephemeral instances provide isolated environments for testing and development. For more information, see the [Ephemeral Instances documentation]({{< ref "user-guide/ephemeral-instances" >}}). - -1. First, create an ephemeral instance for Snowflake in the LocalStack Web application. - -2. Once your ephemeral instance is running, note the host URL (e.g., `sf-v09rkl9fcjs21.sandbox.localstack.cloud`). - -3. In the dbt Cloud interface: - - Navigate to **Deploy** > **Environments** - - Create a new environment or edit an existing one - - Under **Connection Settings**, select **Snowflake** - - Fill in the basic credentials: - * Username: `test` - * Password: `test` - * Schema: `public` - -4. In the **Extended attributes** section, specify the host from your ephemeral instance: - -```yaml -host: sf-v09rkl9fcjs21.sandbox.localstack.cloud -``` - - - -{{< alert type="info" >}} -The host value must match your ephemeral instance URL. This overrides the default Snowflake host and directs connections to your LocalStack environment. -{{< /alert >}} - ## Best Practices 1. **Version Control**: Keep your dbt models and configurations in version control @@ -180,4 +151,4 @@ The host value must match your ephemeral instance URL. This overrides the defaul {{< alert type="info" >}} It's a good practice to always test your dbt models locally with the Snowflake emulator before deploying to production, to save time and resources. -{{< /alert >}} \ No newline at end of file +{{< /alert >}} diff --git a/src/content/docs/snowflake/services/authentication.md b/src/content/docs/snowflake/services/authentication.md new file mode 100644 index 00000000..35622ee0 --- /dev/null +++ b/src/content/docs/snowflake/services/authentication.md @@ -0,0 +1,71 @@ +--- +title: Authentication +description: Get started with authentication in Snowflake. +--- + +## Introduction + +Snowflake supports [multiple authentication methods](https://docs.snowflake.com/en/user-guide/authentication-policies). The Snowflake emulator supports the following authentication methods: + +* Username and password +* RSA key pair authentication + +This guide demonstrates how to use the Snowflake emulator to authenticate using both methods. + +## Username and password + +To authenticate using a username and password, you can set the `user` and `password` parameters in the connection string. The values for these parameters can be set to `test` in the Snowflake emulator. Since the Snowflake emulator is a local instance, the username and password can be the same, and the authentication mechanism is mocked. + +Here's an example of how to connect to the Snowflake emulator using a username and password in a Python script: + +```python +import snowflake.connector as sf + +sf_conn_obj = sf.connect( + user="test", + password="test", + account="test", + database="test", + host="snowflake.localhost.localstack.cloud", +) +``` + +The default username and password are set to `test` and can be changed using `SF_DEFAULT_USER` and `SF_DEFAULT_PASSWORD` when starting the Snowflake emulator. + +{{< alert title="Note" >}} +It is not recommended to use your production credentials in the Snowflake emulator. +{{< /alert >}} + +## RSA key pair authentication + +The Snowflake emulator supports RSA key-based authentication, allowing users to log in without a password by using a private key and a configured public key. + +To enable this, create a private key and a public key pair. + +```bash +openssl genrsa -out private_key.pem 2048 +openssl rsa -in private_key.pem -pubout -out public_key.pem +``` + +Then set a public key for the user: + +```sql +ALTER USER your_user_name SET RSA_PUBLIC_KEY=''; +``` + +Then authenticate with the private key using the Snowflake client: + +```python +import snowflake.connector + +conn = snowflake.connector.connect( + user='your_user_name', + account='your_account_identifier', + private_key_file='/path/to/private_key.pem', + # Add other parameters as needed +) +``` + +{{< alert title="Note" >}} +The Snowflake emulator does not validate key contents—RSA authentication is mocked for local testing only. +{{< /alert >}} diff --git a/src/content/docs/snowflake/services/materialized-views.md b/src/content/docs/snowflake/services/materialized-views.md new file mode 100644 index 00000000..c81071f5 --- /dev/null +++ b/src/content/docs/snowflake/services/materialized-views.md @@ -0,0 +1,91 @@ +--- +title: "Materialized Views" +description: Get started with Materialized Views in LocalStack for Snowflake +--- + +## Introduction + +Materialized views are a feature of Snowflake that allows you to create a persistent view of a table. This view is pre-computed and stored in the database, allowing for faster queries and improved performance. + +The Snowflake emulator supports Materialized Views, allowing you to accurately test materialized view logic and behavior in local development environments. The following operations are supported: + +- [`CREATE MATERIALIZED VIEW`](https://docs.snowflake.com/en/sql-reference/sql/create-materialized-view) +- [`ALTER MATERIALIZED VIEW`](https://docs.snowflake.com/en/sql-reference/sql/alter-materialized-view) +- [`DESCRIBE MATERIALIZED VIEW`](https://docs.snowflake.com/en/sql-reference/sql/desc-materialized-view) +- [`DROP MATERIALIZED VIEW`](https://docs.snowflake.com/en/sql-reference/sql/drop-materialized-view) +- [`SHOW MATERIALIZED VIEWS`](https://docs.snowflake.com/en/sql-reference/sql/show-materialized-views) +- [`TRUNCATE MATERIALIZED VIEW`](https://docs.snowflake.com/en/sql-reference/sql/truncate-materialized-view) + +## Getting started + +This guide is designed for users new to Materialized Views and assumes basic knowledge of SQL and Snowflake. Start your Snowflake emulator and connect to it using an SQL client to execute the queries below. + +The following sections guide you through creating materialized views, inserting data into source tables, querying from views, and performing operations like rename, describe, and drop. + +### Create a materialized view + +To create a materialized view, use the `CREATE MATERIALIZED VIEW` statement. The following example creates a view `order_view` that selects specific columns from the `orders` table. + +```sql +CREATE TABLE IF NOT EXISTS orders ( + id INT, + product TEXT, + shipped BOOLEAN +); + +CREATE MATERIALIZED VIEW IF NOT EXISTS order_view AS +SELECT id, product FROM orders; +``` + +### Insert data into source table + +Inserting new data into the base table automatically refreshes the materialized view in the background. + +```sql +INSERT INTO orders(id, product, shipped) +VALUES (1, 'Book', FALSE), (2, 'Pen', TRUE); +``` + +### Query from materialized view + +You can query a materialized view just like a regular table. The view reflects the data from the source table as of its most recent refresh. + +```sql +SELECT * FROM order_view; +``` + +The output should be: + +```sql +ID|PRODUCT| +--+-------+ + 1|Book | + 2|Pen | +``` + +### Describe the view + +Use `DESCRIBE MATERIALIZED VIEW` to inspect the schema of the view, including column names and types. + +```sql +DESCRIBE MATERIALIZED VIEW order_view; +``` + +The output should be: + +```sql +name |type|kind |null?|default|primary key|unique key|check|expression|comment|policy name|privacy domain| +-------+----+------+-----+-------+-----------+----------+-----+----------+-------+-----------+--------------+ +ID |INT4|COLUMN|Y | |N |N | | | | | | +PRODUCT|TEXT|COLUMN|Y | |N |N | | | | | | +``` + +### Rename and drop view + +You can rename and drop materialized views using standard SQL statements. + +```sql +ALTER MATERIALIZED VIEW order_view RENAME TO order_view_new; + +DROP MATERIALIZED VIEW IF EXISTS order_view_new; +``` diff --git a/src/content/docs/snowflake/services/native-apps.md b/src/content/docs/snowflake/services/native-apps.md new file mode 100644 index 00000000..eaa6674e --- /dev/null +++ b/src/content/docs/snowflake/services/native-apps.md @@ -0,0 +1,80 @@ +--- +title: "Native Apps" +description: Get started with Native Apps in LocalStack for Snowflake +--- + +## Introduction + +Snowflake Native Apps are applications built and executed directly within the Snowflake Data Cloud platform. These apps can be used to extend the capabilities of Snowflake by integrating with external services, automating workflows, and building custom data applications. These apps are developed using Snowflake-native tools (e.g., Snowflake SQL, Snowflake API, and JavaScript) and can be distributed on the Snowflake Marketplace. + +The Snowflake emulator supports creating & deploying Native Apps locally with the same statements as the Snowflake service. The following operations are supported: + +- [`CREATE APPLICATIONS`](https://docs.snowflake.com/en/sql-reference/sql/create-application.html) +- [`SHOW APPLICATION PACKAGES`](https://docs.snowflake.com/en/sql-reference/sql/show-application-packages.html) +- [`ALTER APPLICATION PACKAGE`](https://docs.snowflake.com/en/sql-reference/sql/alter-application-package.html) +- [`DESCRIBE APPLICATION`]( https://docs.snowflake.com/en/sql-reference/sql/desc-application) +- [`DROP APPLICATION PACKAGE`](https://docs.snowflake.com/en/sql-reference/sql/drop-application-package.html) + +## Getting started + +This guide is designed for users new to Native Apps and assumes basic knowledge of Snow CLI and Snowflake. Start your Snowflake emulator and connect to it using the Snow CLI in order to execute the commands further below. + +In this guide, you will locally deploy a Native App using an existing Application Package. + +### Clone the repository + +Clone the [Native Apps repository](https://github.com/snowflakedb/native-apps-examples) and navigate to the `tasks-streams` directory: + +```bash +git clone https://github.com/snowflakedb/native-apps-examples.git +cd native-apps-examples/tasks-streams +``` + +### Deploy Native App + +Deploy the Native App using the Snow CLI: + +```bash +snow app run --connection localstack +``` + +The following output should be displayed: + +```bash +Creating new application package tasks_streams_app_pkg_username in account. +Checking if stage tasks_streams_app_pkg_username.app_src.stage exists, or creating a new one if none exists. +Performing a diff between the Snowflake stage: stage and your local deploy_root: /Users/username/code/localstack/native-apps-examples/tasks-streams/output/deploy. +Local changes to be deployed: + added: app/manifest.yml -> manifest.yml + added: app/setup_script.sql -> setup_script.sql + added: src/module-ui/src/environment.yml -> streamlit/environment.yml + added: src/module-ui/src/ui.py -> streamlit/ui.py +Updating the Snowflake stage from your local /Users/username/code/localstack/native-apps-examples/tasks-streams/output/deploy directory. +Validating Snowflake Native App setup script. +Creating new application object tasks_streams_app_username in account. +Application 'TASKS_STREAMS_APP_username' created successfully. + +Your application object (tasks_streams_app_username) is now available: +https://app.snowflake.com/test/test/#/apps/application/TASKS_STREAMS_APP_username +``` + +### Access Native App + +You can access the Native App by visiting your preferred browser and navigating to the following URL: + +```bash +https://snowflake.localhost.localstack.cloud:4566/apps/test/test/TASKS_STREAMS_APP_username/ +``` + +{{< alert title="Note" >}} +The URL above is an example. Change the outputted URL by: + +1. Replacing `https://app.snowflake.com` with `https://snowflake.localhost.localstack.cloud:4566`. +2. Changing the path structure from `/#/apps/application/` to `/apps/test/test/`. + +You can make additional changes depending on your local setup. +{{< /alert >}} + +The following app should be displayed: + +![Native App](/images/snowflake/native-app.png) diff --git a/src/content/docs/snowflake/services/polaris-catalog.md b/src/content/docs/snowflake/services/polaris-catalog.md new file mode 100644 index 00000000..764c8834 --- /dev/null +++ b/src/content/docs/snowflake/services/polaris-catalog.md @@ -0,0 +1,212 @@ +--- +title: "Polaris Catalog" +description: Get started with Polaris Catalog in LocalStack for Snowflake +--- + +## Introduction + +[Polaris Catalog](https://github.com/apache/polaris) is a unified data catalog that provides a single view of all your data assets across Snowflake and external sources. It enables you to discover, understand, and govern your data assets, making it easier to find and use the right data for your analytics and machine learning projects. + +The Snowflake emulator supports creating Iceberg tables with Polaris catalog. Currently, [`CREATE CATALOG INTEGRATION`](https://docs.snowflake.com/en/sql-reference/sql/create-catalog-integration-open-catalog) is supported by LocalStack. LocalStack also provides a `localstack/polaris` Docker image that can be used to create a local Polaris REST catalog. + +## Getting started + +This guide is designed for users new to Iceberg tables with Polaris catalog and assumes basic knowledge of SQL and Snowflake. Start your Snowflake emulator and connect to it using an SQL client in order to execute the queries further below. + +This guide shows how to use the Polaris REST catalog to create Iceberg tables in the Snowflake emulator, by: + +- Launching the Polaris Catalog service +- Setting up an external volume +- Creating a catalog integration +- Creating an Iceberg table +- Querying the Iceberg table + +### Start Polaris catalog container + +The following command starts the Polaris catalog container using the `localstack/polaris` Docker image: + +```bash +docker run -d --name polaris-test \ + -p 8181:8181 -p 8182:8182 \ + -e AWS_REGION=us-east-1 \ + -e AWS_ACCESS_KEY_ID=test \ + -e AWS_SECRET_ACCESS_KEY=test \ + -e AWS_ENDPOINT_URL=http://localhost:4566 \ + -e POLARIS_BOOTSTRAP_CREDENTIALS=default-realm,root,s3cr3t \ + -e polaris.realm-context.realms=default-realm \ + -e quarkus.otel.sdk.disabled=true \ + localstack/polaris:latest +``` + +Wait for Polaris to become healthy: + +```bash +curl -X GET http://localhost:8182/health +``` + +### Authenticate and create Polaris catalog + +Set variables and retrieve an access token: + +```bash +REALM="default-realm" +CLIENT_ID="root" +CLIENT_SECRET="s3cr3t" +BUCKET_NAME="test-bucket-$(openssl rand -hex 4)" +CATALOG_NAME="polaris" + +TOKEN=$(curl -s -X POST http://localhost:8181/api/catalog/v1/oauth/tokens \ + -H "Polaris-Realm: $REALM" \ + -d "grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&scope=PRINCIPAL_ROLE:ALL" | jq -r '.access_token') +``` + +The `TOKEN` variable will contain the access token. + +Create a catalog: + +```bash +curl -s -X POST http://localhost:8181/api/management/v1/catalogs \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "catalog": { + "name": "'"$CATALOG_NAME"'", + "type": "INTERNAL", + "properties": { + "default-base-location": "s3://'"$BUCKET_NAME"'/test" + }, + "storageConfigInfo": { + "storageType": "S3_COMPATIBLE", + "allowedLocations": ["s3://'"$BUCKET_NAME"'/"], + "s3.roleArn": "arn:aws:iam::000000000000:role/'"$BUCKET_NAME"'", + "region": "us-east-1", + "s3.pathStyleAccess": true, + "s3.endpoint": "http://localhost:4566" + } + } + }' +``` + +Grant necessary permissions to the catalog: + +```bash +curl -s -X PUT http://localhost:8181/api/management/v1/catalogs/polaris/catalog-roles/catalog_admin/grants \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"type": "catalog", "privilege": "TABLE_WRITE_DATA"}' +``` + +### Create a bucket + +Create a bucket using the `awslocal` command: + +```bash +awslocal s3 mb s3://$BUCKET_NAME +``` + +### Create an external volume + +In your SQL client, create an external volume using the `CREATE EXTERNAL VOLUME` statement: + +```sql +CREATE EXTERNAL VOLUME polaris_volume +STORAGE_LOCATIONS = ( + ( + NAME = aws_s3_test + STORAGE_PROVIDER = S3 + STORAGE_BASE_URL = 's3://test-bucket/' + STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::000000000000:role/test-bucket' + ENCRYPTION = (TYPE = AWS_SSE_S3) + ) +) +ALLOW_WRITES = TRUE; +``` + +### Create catalog integration + +Create a catalog integration using the `CREATE CATALOG INTEGRATION` statement: + +```sql +CREATE CATALOG INTEGRATION polaris_catalog +CATALOG_SOURCE = ICEBERG_REST +TABLE_FORMAT = ICEBERG +CATALOG_NAMESPACE = 'test_namespace' +REST_CONFIG = ( + CATALOG_URI = 'http://localhost:8181', + CATALOG_NAME = 'polaris' +) +REST_AUTHENTICATION = ( + TYPE = OAUTH, + OAUTH_CLIENT_ID = 'root', + OAUTH_CLIENT_SECRET = 's3cr3t', + OAUTH_ALLOWED_SCOPES = (PRINCIPAL_ROLE:ALL) +) +ENABLED = TRUE +REFRESH_INTERVAL_SECONDS = 60 +COMMENT = 'Polaris catalog integration'; +``` + +### Create and query an Iceberg table + +Now create the table using the Polaris catalog and volume: + +```sql +CREATE ICEBERG TABLE polaris_iceberg_table (c1 TEXT) +CATALOG = 'polaris_catalog', +EXTERNAL_VOLUME = 'polaris_volume', +BASE_LOCATION = 'test/test_namespace'; +``` + +Insert and query data: + +```sql +INSERT INTO polaris_iceberg_table(c1) VALUES ('test'), ('polaris'), ('iceberg'); + +SELECT * FROM polaris_iceberg_table; +``` + +The output should be: + +```sql ++----------+ +| c1 | +|----------| +| iceberg | +| foobar | +| test | ++----------+ +``` + +All data will be persisted under: + +```bash +awslocal s3 ls s3://$BUCKET_NAME/test/test_namespace/ +``` + +You will see: + +- `data/` with `.parquet` files +- `metadata/` with Iceberg metadata files + +## Configuration options + +The following configuration options are available for the Polaris Catalog Docker image provided by LocalStack: + +| Environment Variable | Description | Default Value | Required | +|---------------------|-------------|---------------|----------| +| `AWS_REGION` | The AWS region to use | `us-east-1` | Yes | +| `AWS_ACCESS_KEY_ID` | AWS access key ID for accessing AWS services | - | Yes when using AWS services | +| `AWS_SECRET_ACCESS_KEY` | AWS secret access key for accessing AWS services | - | Yes when using AWS services | +| `AWS_ENDPOINT_URL` | Custom endpoint URL for AWS services (e.g., for LocalStack) | - | No | +| `POLARIS_BOOTSTRAP_CREDENTIALS` | Initial realm, username, and password in format: `realm,username,password` | - | Yes | +| `polaris.realm-context.realms` | List of realms to create/use | - | Yes | +| `quarkus.otel.sdk.disabled` | Disable OpenTelemetry SDK | `false` | No | + +The following logging options are available for the Polaris Catalog Docker image: + +| Logging Option | Description | +|----------------|-------------| +| `quarkus.log.level` | Sets the overall logging level (e.g., DEBUG) | +| `quarkus.log.console.level` | Sets the console logging level (e.g., DEBUG) | +| `quarkus.log.category."org.apache.polaris".level` | Sets the logging level specifically for the Polaris components | +| `quarkus.log.category."org.apache.polaris".min-level` | Sets the minimum logging level for the Polaris components (e.g., TRACE) | diff --git a/src/content/docs/snowflake/services/row-access-policies.md b/src/content/docs/snowflake/services/row-access-policies.md new file mode 100644 index 00000000..95a6f11b --- /dev/null +++ b/src/content/docs/snowflake/services/row-access-policies.md @@ -0,0 +1,84 @@ +--- +title: "Row Access Policies" +description: Get started with Row Access Policies in LocalStack for Snowflake +--- + +## Introduction + +Row access policies (RAPs) are a feature of Snowflake that allows you to control access to specific rows in a table. This is useful for implementing security policies, such as restricting access to certain users or groups. + +The Snowflake emulator supports Row Access Policies, allowing developers to implement and test fine-grained, row-level access controls locally. These policies define conditions that determine which rows are visible to the querying user. + +## Getting started + +This guide is designed for users new to Row Access Policies and assumes basic knowledge of SQL and Snowflake. Start your Snowflake emulator and connect to it using an SQL client to execute the queries below. + +The following sections demonstrate how to create a row access policy, attach it to a table, and observe how it filters rows during queries based on policy logic. + +### Create row access policy + +Use the `CREATE ROW ACCESS POLICY` statement to define a filter condition. This policy will restrict row visibility based on column values. + +```sql +CREATE OR REPLACE ROW ACCESS POLICY id_filter_policy +AS (id INT) RETURNS BOOLEAN -> + id IN (1, 2); +``` + +### Apply policy to a table + +Create a table and bind the row access policy to one of its columns using the `WITH ROW ACCESS POLICY` clause. + +```sql +CREATE TABLE accounts ( + id INT +) +WITH ROW ACCESS POLICY id_filter_policy ON (id); +``` + +Insert sample data into the table: + +```sql +INSERT INTO accounts(id) VALUES (1), (2), (3); +``` + +### Query table with policy applied + +Querying the table will now return only rows that match the access policy condition. + +```sql +SELECT * FROM accounts; +``` + +The output should be: + +```sql +ID| +--+ + 1| + 2| +``` + +### Remove access policy + +You can remove a row access policy from a table using the `ALTER TABLE ... DROP ROW ACCESS POLICY` statement. + +```sql +ALTER TABLE accounts DROP ROW ACCESS POLICY id_filter_policy; +``` + +Re-run the query to view all rows: + +```sql +SELECT * FROM accounts; +``` + +The output should be: + +```sql +ID| +--+ + 1| + 2| + 3| +``` diff --git a/src/content/docs/snowflake/services/snowpipe.md b/src/content/docs/snowflake/services/snowpipe.md index 5f20cda1..9aa90f2b 100644 --- a/src/content/docs/snowflake/services/snowpipe.md +++ b/src/content/docs/snowflake/services/snowpipe.md @@ -3,8 +3,6 @@ title: Snowpipe description: Get started with Snowpipe in LocalStack for Snowflake --- - - ## Introduction Snowpipe allows you to load data into Snowflake tables from files stored in an external stage. Snowpipe continuously loads data from files in a stage into a table as soon as the files are available. Snowpipe uses a queue to manage the data loading process, which allows you to load data into Snowflake tables in near real-time. diff --git a/src/content/docs/snowflake/services/transaction-management.md b/src/content/docs/snowflake/services/transaction-management.md new file mode 100644 index 00000000..4f3e7255 --- /dev/null +++ b/src/content/docs/snowflake/services/transaction-management.md @@ -0,0 +1,106 @@ +--- +title: "Transaction Management" +description: Get started with Transaction Management in LocalStack for Snowflake +--- + +## Introduction + +Transaction Management is a feature that allows you to manage transactions in Snowflake. You can use Transaction Management to create a transaction management system that is specific to your application. + +The Snowflake emulator supports Transaction Management, allowing you to emulate realistic database operations that require precise control over when changes are committed or rolled back. The following operations are supported: + +- [BEGIN](https://docs.snowflake.com/en/sql-reference/sql/begin) +- [COMMIT](https://docs.snowflake.com/en/sql-reference/sql/commit) +- [ROLLBACK](https://docs.snowflake.com/en/sql-reference/sql/rollback) +- [CURRENT_TRANSACTION()](https://docs.snowflake.com/en/sql-reference/functions/current_transaction) +- [SHOW TRANSACTIONS](https://docs.snowflake.com/en/sql-reference/sql/show-transactions) + +## Getting started + +This guide is designed for users new to Transaction Management and assumes basic knowledge of SQL and Snowflake. Start your Snowflake emulator and connect to it using an SQL client to execute the queries below. + +The following sections demonstrate how to start and manage named transactions, check transaction state, control visibility across sessions, and monitor all active transactions using a simple orders table. + +### Create a table + +The following SQL snippet creates a table named orders to store order IDs. We will use this table to test transactional behavior. + +```sql +CREATE TABLE IF NOT EXISTS orders ( + id INT +); +``` + +### Begin transaction and insert data + +Use the `BEGIN` or `START TRANSACTION` statement to begin a transaction and optionally assign it a name. Data inserted during the transaction will not be visible to other sessions until committed. + +```sql +BEGIN NAME mytxn; + +INSERT INTO orders VALUES (1), (2); +``` + +### Commit transaction + +Use the `COMMIT` statement to save the changes made during the transaction. + +```sql +COMMIT; +``` + +The expected output is: + +```sql ++------------------------+ +| status | +|------------------------| +| Transaction committed | ++------------------------+ +``` + +### View the current transaction + +Use the `CURRENT_TRANSACTION()` function to get the ID of the currently active transaction. + +```sql +SELECT CURRENT_TRANSACTION() AS txn; +``` + +After starting a transaction, this function returns a non-null ID. + +```sql +START TRANSACTION NAME mytxn2; + +SELECT CURRENT_TRANSACTION() AS txn; +``` + +The expected output is: + +```sql ++--------------------------------------+ +| TXN | +|--------------------------------------| +| 6f9bfa42-88d7-4c8c-bc7c-3db1d69d1552 | ++--------------------------------------+ +``` + +### Show all active transactions + +Use the `SHOW TRANSACTIONS` statement to view all active transactions. + +```sql +SHOW TRANSACTIONS; +``` + +### Rollback transaction + +To undo uncommitted changes, use the `ROLLBACK` statement. Subsequent rollbacks have no effect. + +```sql +BEGIN; + +INSERT INTO orders VALUES (3), (4); + +ROLLBACK; +``` diff --git a/src/content/docs/snowflake/services/user-defined-functions.md b/src/content/docs/snowflake/services/user-defined-functions.md index 30d8358a..b4e5145e 100644 --- a/src/content/docs/snowflake/services/user-defined-functions.md +++ b/src/content/docs/snowflake/services/user-defined-functions.md @@ -1,15 +1,13 @@ --- title: User-Defined Functions -description: Get started with User-Defined Functions in Node.js & Python with LocalStack for Snowflake +description: Get started with User-Defined Functions in Node.js, Java & Python with LocalStack for Snowflake --- - - ## Introduction User-Defined Functions (UDFs) are functions that you can create to extend the functionality of your SQL queries. Snowflake supports UDFs in different programming languages, including JavaScript, Python, Java, Scala, and SQL. -The Snowflake emulator supports User-Defined Functions (UDFs) in JavaScript and Python. You can create UDFs to extend the functionality of your SQL queries. This guide demonstrates how to create and execute UDFs in JavaScript and Python. +The Snowflake emulator supports User-Defined Functions (UDFs) in JavaScript, Java and Python. You can create UDFs to extend the functionality of your SQL queries. This guide demonstrates how to create and execute UDFs in JavaScript, Java and Python. ## JavaScript @@ -36,6 +34,84 @@ SELECT add5(10); The result of the query is `15`. +## Java + +In the Snowflake emulator, you can create Java UDFs to extend the functionality of your SQL queries. The following modes are supported: + +- **Inline Java Code** via the `AS` clause +- **Staged JAR Files** via the `IMPORTS` clause. + +Start your Snowflake emulator and connect to it using a SQL client to execute the queries below. + +### Create a Java UDF (inline code) + +You can define a Java UDF using the `CREATE FUNCTION` statement and provide the Java source inline with the `AS` clause. + +```sql +CREATE OR REPLACE FUNCTION echo_inline(x VARCHAR) +RETURNS VARCHAR +LANGUAGE JAVA +CALLED ON NULL INPUT +HANDLER = 'TestFunc.echoVarchar' +AS ' +class TestFunc { + public static String echoVarchar(String x) { + return x; + } +} +'; +``` + +### Execute the Java UDF (inline code) + +Once created, you can call the Java UDF using a standard `SELECT` statement. + +```sql +SELECT echo_inline('hello world'); +``` + +The result of the query is: + +```sql ++---------------------+ +| ECHO_INLINE | +|---------------------| +| hello world | ++---------------------+ +``` + +### Create a Java UDF from a JAR file + +You can also compile your Java code into a `.jar` file, upload it to a Snowflake stage, and reference it using the `IMPORTS` clause. + +```sql +-- Assume the JAR file has been uploaded to @mystage/testfunc.jar +CREATE OR REPLACE FUNCTION echo_from_jar(x VARCHAR) +RETURNS VARCHAR +LANGUAGE JAVA +CALLED ON NULL INPUT +HANDLER = 'TestFunc.echoVarchar' +IMPORTS = ('@mystage/testfunc.jar'); +``` + +### Execute the Java UDF from a JAR file + +Once created, you can call the Java UDF using a standard `SELECT` statement. + +```sql +SELECT echo_from_jar('from jar'); +``` + +The result of the query is: + +```sql ++---------------------+ +| ECHO_FROM_JAR | +|---------------------| +| from jar | ++---------------------+ +``` + ## Python In the Snowflake emulator, you can create User-Defined Functions (UDFs) in Python to extend the functionality of your SQL queries. Start your Snowflake emulator and connect to it using a SQL client to execute the queries below. @@ -62,4 +138,4 @@ You can execute a Python UDF using the `SELECT` statement. The following example SELECT sample_func('foobar'); ``` -The result of the query is `echo: foobar`. \ No newline at end of file +The result of the query is `echo: foobar`. From d7804a1157151b6e2631c86749543c08f41b5ff9 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Tue, 17 Jun 2025 00:18:04 +0530 Subject: [PATCH 3/5] swap a lot of stuff --- astro.config.mjs | 4 ++-- .../capabilities/{config.md => configuration.md} | 0 src/content/docs/snowflake/capabilities/index.md | 9 --------- .../snowflake/{capabilities => features}/accounts.md | 0 .../snowflake/{services => features}/authentication.md | 0 .../docs/snowflake/{capabilities => features}/clones.md | 0 .../cross-database-resource-sharing.md | 0 .../snowflake/{services => features}/dynamic-tables.md | 0 .../snowflake/{services => features}/hybrid-tables.md | 0 .../snowflake/{services => features}/iceberg-tables.md | 0 .../{services => features}/materialized-views.md | 0 .../docs/snowflake/{services => features}/native-apps.md | 0 .../snowflake/{services => features}/polaris-catalog.md | 0 .../{services => features}/row-access-policies.md | 0 .../docs/snowflake/{services => features}/snowpipe.md | 0 .../docs/snowflake/{services => features}/stages.md | 0 .../{capabilities => features}/storage-integrations.md | 0 .../docs/snowflake/{services => features}/streamlit.md | 0 .../docs/snowflake/{services => features}/streams.md | 0 .../docs/snowflake/{capabilities => features}/tags.md | 0 .../docs/snowflake/{services => features}/tasks.md | 0 .../{services => features}/transaction-management.md | 0 .../{services => features}/user-defined-functions.md | 0 src/content/docs/snowflake/integrations/index.md | 8 -------- .../{tooling => integrations}/snowflake-drivers.md | 0 .../docs/snowflake/{tooling => integrations}/snowpark.md | 0 src/content/docs/snowflake/tooling/index.md | 7 ------- 27 files changed, 2 insertions(+), 26 deletions(-) rename src/content/docs/snowflake/capabilities/{config.md => configuration.md} (100%) delete mode 100644 src/content/docs/snowflake/capabilities/index.md rename src/content/docs/snowflake/{capabilities => features}/accounts.md (100%) rename src/content/docs/snowflake/{services => features}/authentication.md (100%) rename src/content/docs/snowflake/{capabilities => features}/clones.md (100%) rename src/content/docs/snowflake/{services => features}/cross-database-resource-sharing.md (100%) rename src/content/docs/snowflake/{services => features}/dynamic-tables.md (100%) rename src/content/docs/snowflake/{services => features}/hybrid-tables.md (100%) rename src/content/docs/snowflake/{services => features}/iceberg-tables.md (100%) rename src/content/docs/snowflake/{services => features}/materialized-views.md (100%) rename src/content/docs/snowflake/{services => features}/native-apps.md (100%) rename src/content/docs/snowflake/{services => features}/polaris-catalog.md (100%) rename src/content/docs/snowflake/{services => features}/row-access-policies.md (100%) rename src/content/docs/snowflake/{services => features}/snowpipe.md (100%) rename src/content/docs/snowflake/{services => features}/stages.md (100%) rename src/content/docs/snowflake/{capabilities => features}/storage-integrations.md (100%) rename src/content/docs/snowflake/{services => features}/streamlit.md (100%) rename src/content/docs/snowflake/{services => features}/streams.md (100%) rename src/content/docs/snowflake/{capabilities => features}/tags.md (100%) rename src/content/docs/snowflake/{services => features}/tasks.md (100%) rename src/content/docs/snowflake/{services => features}/transaction-management.md (100%) rename src/content/docs/snowflake/{services => features}/user-defined-functions.md (100%) delete mode 100644 src/content/docs/snowflake/integrations/index.md rename src/content/docs/snowflake/{tooling => integrations}/snowflake-drivers.md (100%) rename src/content/docs/snowflake/{tooling => integrations}/snowpark.md (100%) delete mode 100644 src/content/docs/snowflake/tooling/index.md diff --git a/astro.config.mjs b/astro.config.mjs index 35041cde..ccaff644 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -296,9 +296,9 @@ export default defineConfig({ collapsed: true, }, { - label: 'Services', + label: 'Features', collapsed: true, - autogenerate: { directory: '/snowflake/services' }, + autogenerate: { directory: '/snowflake/features' }, }, { label: 'Capabilities', diff --git a/src/content/docs/snowflake/capabilities/config.md b/src/content/docs/snowflake/capabilities/configuration.md similarity index 100% rename from src/content/docs/snowflake/capabilities/config.md rename to src/content/docs/snowflake/capabilities/configuration.md diff --git a/src/content/docs/snowflake/capabilities/index.md b/src/content/docs/snowflake/capabilities/index.md deleted file mode 100644 index 3ad41178..00000000 --- a/src/content/docs/snowflake/capabilities/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Capabilities -description: Capabilities -template: doc -nav: -label: ---- - -# Capabilities \ No newline at end of file diff --git a/src/content/docs/snowflake/capabilities/accounts.md b/src/content/docs/snowflake/features/accounts.md similarity index 100% rename from src/content/docs/snowflake/capabilities/accounts.md rename to src/content/docs/snowflake/features/accounts.md diff --git a/src/content/docs/snowflake/services/authentication.md b/src/content/docs/snowflake/features/authentication.md similarity index 100% rename from src/content/docs/snowflake/services/authentication.md rename to src/content/docs/snowflake/features/authentication.md diff --git a/src/content/docs/snowflake/capabilities/clones.md b/src/content/docs/snowflake/features/clones.md similarity index 100% rename from src/content/docs/snowflake/capabilities/clones.md rename to src/content/docs/snowflake/features/clones.md diff --git a/src/content/docs/snowflake/services/cross-database-resource-sharing.md b/src/content/docs/snowflake/features/cross-database-resource-sharing.md similarity index 100% rename from src/content/docs/snowflake/services/cross-database-resource-sharing.md rename to src/content/docs/snowflake/features/cross-database-resource-sharing.md diff --git a/src/content/docs/snowflake/services/dynamic-tables.md b/src/content/docs/snowflake/features/dynamic-tables.md similarity index 100% rename from src/content/docs/snowflake/services/dynamic-tables.md rename to src/content/docs/snowflake/features/dynamic-tables.md diff --git a/src/content/docs/snowflake/services/hybrid-tables.md b/src/content/docs/snowflake/features/hybrid-tables.md similarity index 100% rename from src/content/docs/snowflake/services/hybrid-tables.md rename to src/content/docs/snowflake/features/hybrid-tables.md diff --git a/src/content/docs/snowflake/services/iceberg-tables.md b/src/content/docs/snowflake/features/iceberg-tables.md similarity index 100% rename from src/content/docs/snowflake/services/iceberg-tables.md rename to src/content/docs/snowflake/features/iceberg-tables.md diff --git a/src/content/docs/snowflake/services/materialized-views.md b/src/content/docs/snowflake/features/materialized-views.md similarity index 100% rename from src/content/docs/snowflake/services/materialized-views.md rename to src/content/docs/snowflake/features/materialized-views.md diff --git a/src/content/docs/snowflake/services/native-apps.md b/src/content/docs/snowflake/features/native-apps.md similarity index 100% rename from src/content/docs/snowflake/services/native-apps.md rename to src/content/docs/snowflake/features/native-apps.md diff --git a/src/content/docs/snowflake/services/polaris-catalog.md b/src/content/docs/snowflake/features/polaris-catalog.md similarity index 100% rename from src/content/docs/snowflake/services/polaris-catalog.md rename to src/content/docs/snowflake/features/polaris-catalog.md diff --git a/src/content/docs/snowflake/services/row-access-policies.md b/src/content/docs/snowflake/features/row-access-policies.md similarity index 100% rename from src/content/docs/snowflake/services/row-access-policies.md rename to src/content/docs/snowflake/features/row-access-policies.md diff --git a/src/content/docs/snowflake/services/snowpipe.md b/src/content/docs/snowflake/features/snowpipe.md similarity index 100% rename from src/content/docs/snowflake/services/snowpipe.md rename to src/content/docs/snowflake/features/snowpipe.md diff --git a/src/content/docs/snowflake/services/stages.md b/src/content/docs/snowflake/features/stages.md similarity index 100% rename from src/content/docs/snowflake/services/stages.md rename to src/content/docs/snowflake/features/stages.md diff --git a/src/content/docs/snowflake/capabilities/storage-integrations.md b/src/content/docs/snowflake/features/storage-integrations.md similarity index 100% rename from src/content/docs/snowflake/capabilities/storage-integrations.md rename to src/content/docs/snowflake/features/storage-integrations.md diff --git a/src/content/docs/snowflake/services/streamlit.md b/src/content/docs/snowflake/features/streamlit.md similarity index 100% rename from src/content/docs/snowflake/services/streamlit.md rename to src/content/docs/snowflake/features/streamlit.md diff --git a/src/content/docs/snowflake/services/streams.md b/src/content/docs/snowflake/features/streams.md similarity index 100% rename from src/content/docs/snowflake/services/streams.md rename to src/content/docs/snowflake/features/streams.md diff --git a/src/content/docs/snowflake/capabilities/tags.md b/src/content/docs/snowflake/features/tags.md similarity index 100% rename from src/content/docs/snowflake/capabilities/tags.md rename to src/content/docs/snowflake/features/tags.md diff --git a/src/content/docs/snowflake/services/tasks.md b/src/content/docs/snowflake/features/tasks.md similarity index 100% rename from src/content/docs/snowflake/services/tasks.md rename to src/content/docs/snowflake/features/tasks.md diff --git a/src/content/docs/snowflake/services/transaction-management.md b/src/content/docs/snowflake/features/transaction-management.md similarity index 100% rename from src/content/docs/snowflake/services/transaction-management.md rename to src/content/docs/snowflake/features/transaction-management.md diff --git a/src/content/docs/snowflake/services/user-defined-functions.md b/src/content/docs/snowflake/features/user-defined-functions.md similarity index 100% rename from src/content/docs/snowflake/services/user-defined-functions.md rename to src/content/docs/snowflake/features/user-defined-functions.md diff --git a/src/content/docs/snowflake/integrations/index.md b/src/content/docs/snowflake/integrations/index.md deleted file mode 100644 index b5f18b3a..00000000 --- a/src/content/docs/snowflake/integrations/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Integrations -description: This is a dummy description. ---- - -# Integrations - -Develop your understanding of various LocalStack for Snowflake integrations and use cases. \ No newline at end of file diff --git a/src/content/docs/snowflake/tooling/snowflake-drivers.md b/src/content/docs/snowflake/integrations/snowflake-drivers.md similarity index 100% rename from src/content/docs/snowflake/tooling/snowflake-drivers.md rename to src/content/docs/snowflake/integrations/snowflake-drivers.md diff --git a/src/content/docs/snowflake/tooling/snowpark.md b/src/content/docs/snowflake/integrations/snowpark.md similarity index 100% rename from src/content/docs/snowflake/tooling/snowpark.md rename to src/content/docs/snowflake/integrations/snowpark.md diff --git a/src/content/docs/snowflake/tooling/index.md b/src/content/docs/snowflake/tooling/index.md deleted file mode 100644 index 8f789b95..00000000 --- a/src/content/docs/snowflake/tooling/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Tooling -description: This is a dummy description. ---- - - -# Tooling \ No newline at end of file From 6a622e070e100c282f51f5af46125200ddc8372d Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Tue, 17 Jun 2025 00:24:31 +0530 Subject: [PATCH 4/5] get few more things done --- astro.config.mjs | 8 + src/content/docs/snowflake/changelog.md | 2 - .../docs/snowflake/coverage-features.md | 160 ++++++++++++++++++ 3 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 src/content/docs/snowflake/coverage-features.md diff --git a/astro.config.mjs b/astro.config.mjs index ccaff644..72db8327 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -324,6 +324,14 @@ export default defineConfig({ label: 'SQL Functions', slug: 'snowflake/sql-functions', }, + { + label: 'Feature Coverage', + slug: 'snowflake/coverage-features', + }, + { + label: 'Changelog', + slug: 'snowflake/changelog', + }, ], }, ], diff --git a/src/content/docs/snowflake/changelog.md b/src/content/docs/snowflake/changelog.md index 85a495c1..b41758c9 100644 --- a/src/content/docs/snowflake/changelog.md +++ b/src/content/docs/snowflake/changelog.md @@ -2,8 +2,6 @@ title: Changelog description: Changelog for the latest releases of the LocalStack for Snowflake. template: doc -nav: -label: --- diff --git a/src/content/docs/snowflake/coverage-features.md b/src/content/docs/snowflake/coverage-features.md new file mode 100644 index 00000000..9b7703a6 --- /dev/null +++ b/src/content/docs/snowflake/coverage-features.md @@ -0,0 +1,160 @@ +--- +title: "Feature Coverage" +description: Overview of the implemented Snowflake features in LocalStack +template: doc +--- + +## Resource Types and Operations + +This page provides a list of Snowflake query features (resource types and operations) that are supported in the LocalStack emulator. +The content will be updated as additional query features and functions are implemented. + +### Applications +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**APPLICATION**|✅|✅|✅|✅|✅| + +### Application Packages +| |ALTER|CREATE|DROP|SHOW| +|----|----|----|----|----| +|**APPLICATION PACKAGE**|✅|✅|✅|✅| + +### Catalog Integration +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**CATALOG INTEGRATION**|❓|✅|❓|✅|✅| + +### Databases +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|UNDROP|USE| +|----|----|----|----|----|----|----|----| +|**DATABASE**|✅|✅|✅|✅|✅|❓|✅| + +### Dynamic Tables +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|UNDROP| +|----|----|----|----|----|----|----| +|**DYNAMIC TABLE**|❓|✅|✅|✅|✅|❓| + +### External Tables +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**EXTERNAL TABLE**|❓|❓|❓|❓|❓| + +### External Volumes +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|UNDROP| +|----|----|----|----|----|----|----| +|**EXTERNAL VOLUME**|✅|✅|✅|✅|✅|❓| + +### File Formats +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**FILE FORMAT**|✅|✅|✅|✅|✅| + +### Functions +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**FUNCTION**|✅|✅|✅|✅|✅| + +### Hybrid Tables +| |CREATE|SHOW| +|----|----|----| +|**HYBRID TABLE**|✅|✅| + +### Iceberg Tables +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|UNDROP| +|----|----|----|----|----|----|----| +|**ICEBERG TABLE**|❓|✅|❓|✅|❓|❓| + +### Indexes +| |CREATE|DROP|SHOW| +|----|----|----|----| +|**INDEX**|✅|✅|✅| + +### Materialized Views +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|TRUNCATE| +|----|----|----|----|----|----|----| +|**MATERIALIZED VIEW**|✅|✅|✅|✅|✅|✅| + +### Pipes +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**PIPE**|✅|✅|✅|✅|✅| + +### Procedures +| |ALTER|CALL|CALL WITH|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----|----|----| +|**PROCEDURE**|❓|✅|❓|✅|✅|✅|✅| + +### Roles +| |ALTER|CREATE|DROP|GRANT|REVOKE|SHOW|USE| +|----|----|----|----|----|----|----|----| +|**ROLE**|❓|✅|✅|❓|❓|✅|✅| + +### Row Access Policies +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**ROW ACCESS POLICY**|✅|✅|✅|✅|✅| + +### Schemas +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|UNDROP|USE| +|----|----|----|----|----|----|----|----| +|**SCHEMA**|✅|✅|✅|✅|✅|❓|✅| + +### Sequences +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**SEQUENCE**|✅|✅|✅|✅|✅| + +### Shares +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**SHARE**|❓|✅|❓|✅|❓| + +### Stages +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**STAGE**|✅|✅|✅|✅|✅| + +### Storage Integrations +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**STORAGE INTEGRATION**|❓|✅|✅|✅|✅| + +### Streams +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**STREAM**|✅|✅|✅|✅|✅| + +### Streamlits +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**STREAMLIT**|✅|✅|✅|✅|✅| + +### Tables +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|TRUNCATE|UNDROP| +|----|----|----|----|----|----|----|----| +|**TABLE**|✅|✅|✅|✅|✅|❓|❓| + +### Tags +| |ALTER|CREATE|DROP|SHOW|UNDROP| +|----|----|----|----|----|----| +|**TAG**|✅|✅|✅|✅|❓| + +### Tasks +| |ALTER|CREATE|DESCRIBE|DROP|EXECUTE|SHOW| +|----|----|----|----|----|----|----| +|**TASK**|✅|✅|✅|✅|✅|✅| + +### Users +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**USER**|✅|✅|❓|✅|✅| + +### Views +| |ALTER|CREATE|DESCRIBE|DROP|SHOW| +|----|----|----|----|----|----| +|**VIEW**|✅|✅|✅|✅|✅| + +### Warehouses +| |ALTER|CREATE|DESCRIBE|DROP|SHOW|USE| +|----|----|----|----|----|----|----| +|**WAREHOUSE**|✅|✅|✅|✅|✅|✅| From cbc25d0f5930a7b55da98da9713b9defeac3c146 Mon Sep 17 00:00:00 2001 From: HarshCasper Date: Tue, 17 Jun 2025 00:25:45 +0530 Subject: [PATCH 5/5] add changelog --- src/content/docs/snowflake/changelog.md | 44 ++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/content/docs/snowflake/changelog.md b/src/content/docs/snowflake/changelog.md index b41758c9..23b9e27a 100644 --- a/src/content/docs/snowflake/changelog.md +++ b/src/content/docs/snowflake/changelog.md @@ -4,6 +4,48 @@ description: Changelog for the latest releases of the LocalStack for Snowflake. template: doc --- +### 1.0.0 +- Add support for `SHOW/ALTER FUNCTION` +- Fix incompatibilities with GO driver and SnowSQL client +- Add support for `SHOW INDEXES` +- Improve timestamp string support in `TO_TIMESTAMP` +- Fix casting values to array +- Cast `MERGE INTO/UPDATE` commands arguments to target type +- Make `TO_BOOLEAN` work with all boolean strings +- Enhance parity for parsing URLs with whitespaces in `PUT` commands +- Enhance and add support for metadata columns in parquet format +- Enhance CRUD support for external volumes +- Add support for `EXECUTE TASK` +- Fix identifier parsing in stages and file formats +- Enhance `SHOW TABLES` feature parity +- Handle `DATE` and `TIME` functions +- Add initial Iceberg support +- Enhance parity for GRANT statements and DB permissions +- Add initial support for password-less auth using RSA key +- Enhance parity for queries over staged JSON files +- Add initial support for Catalog Integrations +- Support prepared statements in ODBC driver +- Enhance decimals parity +- Add initial support for granting `APPLICATION ROLE` +- Enhance parity for SQL procedures with SF-native statements +- Add support for lateral column references on `SELECT` +- Fix `SHOW TABLE` with schema scope for Flyway +- Decode field delimiters passed as hex or octal values +- Remove modifiers from binary columns +- Fix permissions to clone default database +- Add support for numeric paramstyle +- Enhance support for `CASE` expressions in `BEGIN..END` blocks +- Refreshed UI +- Enhance parity for `DESCRIBE DATABASE` queries +- Enable local deployment of Streamlit Native Apps +- Enhance parity for materialized view queries +- Enhance parity for `SHOW DYNAMIC TABLES` +- Fix handling of `IF EXISTS` statements within transactions +- Enhance support for `BEGIN` code blocks with multiple command statements +- Enhance logic for native apps and permission grants +- Enhance parity for Native Apps that contain streamlit apps +- Add auto-conversion of strings to `ARRAY/OBJECT` types +- Add support for Polaris catalog ### 0.3.0 @@ -295,4 +337,4 @@ template: doc - Add `snowpipe`/streaming APIs ### 0.1.0 -- Initial release of the extension \ No newline at end of file +- Initial release of the extension