From 83b5f2a5951b745cda10578235de20fb794118cd Mon Sep 17 00:00:00 2001
From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com>
Date: Sat, 24 Jan 2026 06:18:21 +0000
Subject: [PATCH 01/11] fix: pom.xml to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JAVA-CHQOSLOGBACK-15062482
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 9c5992b..c193297 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,13 +27,13 @@
ch.qos.logback
logback-core
- 1.5.18
+ 1.5.25
ch.qos.logback
logback-classic
- 1.5.18
+ 1.5.25
org.slf4j
From 0ff4eb927b4ecf59b991557ee24d0ee20e1147c2 Mon Sep 17 00:00:00 2001
From: Arjun Danda Sureshbabu
Date: Wed, 4 Feb 2026 12:02:26 -0800
Subject: [PATCH 02/11] Adding support for Search, Agent and Semantic View
support
---
.../MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql | 40 +++++
.../CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql | 12 ++
.../SEMANTIC_VIEWS/SALES_ANALYTICS.sql | 33 ++++
.../dlsync/models/ScriptObjectType.java | 3 +
.../dependency/DependencyExtractorTest.java | 167 ++++++++++++++++++
.../snowflake/dlsync/doa/ScriptRepoTest.java | 91 ++++++++++
.../dlsync/parser/SqlTokenizerTest.java | 112 ++++++++++++
7 files changed, 458 insertions(+)
create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql
create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql
create mode 100644 example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql
diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql b/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql
new file mode 100644
index 0000000..0153c9c
--- /dev/null
+++ b/example_scripts/main/example_db/MAIN_SCHEMA/AGENTS/SALES_ASSISTANT.sql
@@ -0,0 +1,40 @@
+CREATE OR REPLACE AGENT ${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ASSISTANT
+ COMMENT = 'Sales assistant agent for product and order queries'
+ PROFILE = '{"display_name": "Sales Assistant", "avatar": "sales-icon.png", "color": "blue"}'
+ FROM SPECIFICATION
+ $$
+ models:
+ orchestration: claude-4-sonnet
+
+ orchestration:
+ budget:
+ seconds: 30
+ tokens: 16000
+
+ instructions:
+ response: "You will respond in a friendly but professional manner about sales and products"
+ orchestration: "For product questions use Search; for sales analytics use Analyst"
+ system: "You are a helpful sales assistant that helps with product and order inquiries"
+ sample_questions:
+ - question: "What products do we have in stock?"
+ answer: "I'll search our product catalog to find available items."
+ - question: "What were our top selling products last month?"
+ answer: "I'll analyze our sales data to find the best performers."
+
+ tools:
+ - tool_spec:
+ type: "cortex_analyst_text_to_sql"
+ name: "SalesAnalyst"
+ description: "Analyzes sales data and generates reports"
+ - tool_spec:
+ type: "cortex_search"
+ name: "ProductSearch"
+ description: "Searches product catalog and documentation"
+
+ tool_resources:
+ SalesAnalyst:
+ semantic_view: "${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ANALYTICS"
+ ProductSearch:
+ name: "${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCT_SEARCH"
+ max_results: "10"
+ $$;
diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql b/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql
new file mode 100644
index 0000000..a24f018
--- /dev/null
+++ b/example_scripts/main/example_db/MAIN_SCHEMA/CORTEX_SEARCH_SERVICES/PRODUCT_SEARCH.sql
@@ -0,0 +1,12 @@
+CREATE OR REPLACE CORTEX SEARCH SERVICE ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCT_SEARCH
+ ON product_description
+ ATTRIBUTES product_name, category
+ WAREHOUSE = ${MY_WAREHOUSE}
+ TARGET_LAG = '1 hour'
+AS (
+ SELECT
+ product_name,
+ product_description,
+ category
+ FROM ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCTS
+);
diff --git a/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql b/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql
new file mode 100644
index 0000000..02807ba
--- /dev/null
+++ b/example_scripts/main/example_db/MAIN_SCHEMA/SEMANTIC_VIEWS/SALES_ANALYTICS.sql
@@ -0,0 +1,33 @@
+CREATE OR REPLACE SEMANTIC VIEW ${EXAMPLE_DB}.${MAIN_SCHEMA}.SALES_ANALYTICS
+ TABLES (
+ products AS ${EXAMPLE_DB}.${MAIN_SCHEMA}.PRODUCTS
+ PRIMARY KEY (PRODUCT_ID)
+ COMMENT = 'Product catalog table',
+ orders AS ${EXAMPLE_DB}.${MAIN_SCHEMA}.ORDERS
+ PRIMARY KEY (ORDER_ID)
+ COMMENT = 'Customer orders table'
+ )
+ RELATIONSHIPS (
+ orders (PRODUCT_ID) REFERENCES products
+ )
+ DIMENSIONS (
+ products.product_name AS products.NAME
+ WITH SYNONYMS = ('product', 'item')
+ COMMENT = 'Name of the product',
+ products.category AS products.CATEGORY
+ WITH SYNONYMS = ('type', 'group')
+ COMMENT = 'Product category',
+ orders.order_date AS orders.ORDER_DATE
+ WITH SYNONYMS = ('date', 'purchase date')
+ COMMENT = 'Date when order was placed'
+ )
+ METRICS (
+ orders.total_revenue AS SUM(orders.PRICE * orders.QUANTITY)
+ WITH SYNONYMS = ('revenue', 'sales')
+ COMMENT = 'Total revenue from orders',
+ orders.order_count AS COUNT(orders.ORDER_ID)
+ WITH SYNONYMS = ('number of orders', 'count')
+ COMMENT = 'Total number of orders'
+ )
+ COMMENT = 'Semantic view for sales analytics'
+ AI_SQL_GENERATION 'When asked about sales, use total_revenue metric. When asked about orders, use order_count metric.';
diff --git a/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java b/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java
index 1673c8b..375c04d 100644
--- a/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java
+++ b/src/main/java/com/snowflake/dlsync/models/ScriptObjectType.java
@@ -8,6 +8,9 @@ public enum ScriptObjectType {
STREAMLITS("STREAMLIT", ObjectLevel.SCHEMA, false),
PIPES("PIPE", ObjectLevel.SCHEMA, false),
MASKING_POLICIES("MASKING POLICY", ObjectLevel.SCHEMA, false),
+ CORTEX_SEARCH_SERVICES("CORTEX SEARCH SERVICE", ObjectLevel.SCHEMA, false),
+ SEMANTIC_VIEWS("SEMANTIC VIEW", ObjectLevel.SCHEMA, false),
+ AGENTS("AGENT", ObjectLevel.SCHEMA, false),
NETWORK_RULES("NETWORK RULE", ObjectLevel.SCHEMA, false),
RESOURCE_MONITORS("RESOURCE MONITOR", ObjectLevel.ACCOUNT, false),
NETWORK_POLICIES("NETWORK POLICY", ObjectLevel.ACCOUNT, false),
diff --git a/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java b/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java
index b986dce..32314c2 100644
--- a/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java
+++ b/src/test/java/com/snowflake/dlsync/dependency/DependencyExtractorTest.java
@@ -388,5 +388,172 @@ void extractScriptDependenciesIdentifierInQuotes() {
}
+ SchemaScript mockCortexSearchDependency(String name, String schema) {
+ String content = "CREATE OR REPLACE CORTEX SEARCH SERVICE " + name + "\n" +
+ " ON search_column\n" +
+ " ATTRIBUTES attr1, attr2\n" +
+ " WAREHOUSE = MY_WH\n" +
+ " TARGET_LAG = '1 hour'\n" +
+ "AS (SELECT * FROM SOURCE_TABLE);";
+ return ScriptFactory.getSchemaScript("TEST_DB", schema, ScriptObjectType.CORTEX_SEARCH_SERVICES, name, content);
+ }
+
+ @Test
+ void extractScriptDependenciesCortexSearchService() {
+ String content = "CREATE OR REPLACE CORTEX SEARCH SERVICE TEST_SCHEMA.PRODUCT_SEARCH\n" +
+ " ON product_description\n" +
+ " ATTRIBUTES product_name, category\n" +
+ " WAREHOUSE = MY_WH\n" +
+ " TARGET_LAG = '1 hour'\n" +
+ "AS (\n" +
+ " SELECT product_name, product_description, category\n" +
+ " FROM TEST_SCHEMA.PRODUCTS\n" +
+ ");";
+ SchemaScript script = ScriptFactory.getSchemaScript("TEST_DB", "TEST_SCHEMA", ScriptObjectType.CORTEX_SEARCH_SERVICES, "PRODUCT_SEARCH", content);
+ MigrationScript dependency1 = mockTableDependency("PRODUCTS", "TEST_SCHEMA");
+ List