@clickzetta/cz-cli-darwin-x64 0.3.91 → 0.3.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/bin/cz-cli +0 -0
  2. package/bin/skills/clickzetta-ai-function/SKILL.md +109 -0
  3. package/bin/skills/clickzetta-ai-function/eval_cases.jsonl +4 -0
  4. package/bin/skills/clickzetta-ai-function/references/ai-function-ddl.md +106 -0
  5. package/bin/skills/clickzetta-batch-sync-pipeline/SKILL.md +124 -124
  6. package/bin/skills/clickzetta-batch-sync-pipeline/eval_cases.jsonl +5 -5
  7. package/bin/skills/clickzetta-bi-connect/SKILL.md +79 -78
  8. package/bin/skills/clickzetta-bi-connect/references/bi-tools.md +56 -56
  9. package/bin/skills/clickzetta-cdc-sync-pipeline/SKILL.md +386 -382
  10. package/bin/skills/clickzetta-cdc-sync-pipeline/eval_cases.jsonl +5 -5
  11. package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +73 -212
  12. package/bin/skills/clickzetta-data-science/SKILL.md +57 -56
  13. package/bin/skills/clickzetta-data-science/references/bitmap-profile.md +38 -38
  14. package/bin/skills/clickzetta-data-science/references/data-patterns.md +16 -16
  15. package/bin/skills/clickzetta-data-science/references/setup.md +28 -28
  16. package/bin/skills/clickzetta-data-science/references/stats-functions.md +44 -44
  17. package/bin/skills/clickzetta-data-science/references/write-and-infer.md +22 -22
  18. package/bin/skills/clickzetta-data-science/references/zettapark-api.md +32 -32
  19. package/bin/skills/clickzetta-dw-modeling/SKILL.md +1 -1
  20. package/bin/skills/clickzetta-external-function/SKILL.md +51 -109
  21. package/bin/skills/clickzetta-external-function/eval_cases.jsonl +4 -4
  22. package/bin/skills/clickzetta-external-function/references/external-function-ddl.md +39 -77
  23. package/bin/skills/clickzetta-java-sdk/SKILL.md +49 -48
  24. package/bin/skills/clickzetta-java-sdk/eval_cases.jsonl +12 -12
  25. package/bin/skills/clickzetta-java-sdk/references/bulkload.md +34 -34
  26. package/bin/skills/clickzetta-java-sdk/references/realtime.md +44 -44
  27. package/bin/skills/clickzetta-kafka-ingest-pipeline/SKILL.md +273 -507
  28. package/bin/skills/clickzetta-kafka-ingest-pipeline/references/kafka-pipe-syntax.md +197 -231
  29. package/bin/skills/clickzetta-oss-ingest-pipeline/SKILL.md +231 -304
  30. package/bin/skills/clickzetta-realtime-sync-pipeline/SKILL.md +180 -179
  31. package/bin/skills/clickzetta-realtime-sync-pipeline/eval_cases.jsonl +5 -5
  32. package/bin/skills/clickzetta-semantic-view/SKILL.md +74 -72
  33. package/bin/skills/clickzetta-semantic-view/eval_cases.jsonl +12 -12
  34. package/bin/skills/clickzetta-semantic-view/references/semantic-view-reference.md +75 -75
  35. package/bin/skills/clickzetta-sql-migration/SKILL.md +128 -0
  36. package/bin/skills/clickzetta-sql-migration/eval_cases.jsonl +10 -0
  37. package/bin/skills/clickzetta-sql-migration/references/ddl-reference.md +350 -0
  38. package/bin/skills/clickzetta-sql-migration/references/dml-differences.md +192 -0
  39. package/bin/skills/clickzetta-sql-migration/references/dml-reference.md +279 -0
  40. package/bin/skills/{clickzetta-sql-syntax-guide → clickzetta-sql-migration}/references/dql-reference.md +128 -128
  41. package/bin/skills/clickzetta-sql-migration/references/function-mapping.md +194 -0
  42. package/bin/skills/clickzetta-sql-migration/references/functions-reference.md +372 -0
  43. package/bin/skills/clickzetta-sql-migration/references/implicit-type-conversion.md +143 -0
  44. package/bin/skills/clickzetta-sql-migration/references/migration-databricks.md +260 -0
  45. package/bin/skills/{clickzetta-sql-syntax-guide → clickzetta-sql-migration}/references/migration-snowflake.md +112 -112
  46. package/bin/skills/clickzetta-sql-migration/references/vs-snowflake.md +346 -0
  47. package/bin/skills/clickzetta-sql-migration/references/vs-spark.md +229 -0
  48. package/bin/skills/clickzetta-studio-task-manager/SKILL.md +326 -329
  49. package/bin/skills/clickzetta-table-lineage/SKILL.md +57 -55
  50. package/bin/skills/clickzetta-table-lineage/eval_cases.jsonl +1 -1
  51. package/bin/skills/clickzetta-table-lineage/references/normalize_func.sql +5 -5
  52. package/bin/skills/clickzetta-table-lineage/references/table_cost.sql +6 -6
  53. package/bin/skills/clickzetta-table-lineage/references/table_relation.sql +2 -2
  54. package/bin/skills/clickzetta-volume-manager/SKILL.md +186 -100
  55. package/bin/skills/clickzetta-volume-manager/references/volume-ddl.md +153 -52
  56. package/package.json +1 -1
  57. package/bin/skills/clickzetta-dynamic-table/best-practices/scheduling-guide.md +0 -135
  58. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/dt-declaration-strategy.md +0 -185
  59. package/bin/skills/clickzetta-dynamic-table/dt-creator/references/refresh-history-guide.md +0 -260
  60. package/bin/skills/clickzetta-dynamic-table/dynamic-table-alter/SKILL.md +0 -191
  61. package/bin/skills/clickzetta-sql-syntax-guide/SKILL.md +0 -249
  62. package/bin/skills/clickzetta-sql-syntax-guide/eval_cases.jsonl +0 -3
  63. package/bin/skills/clickzetta-sql-syntax-guide/references/ddl-reference.md +0 -350
  64. package/bin/skills/clickzetta-sql-syntax-guide/references/dml-reference.md +0 -279
  65. package/bin/skills/clickzetta-sql-syntax-guide/references/functions-reference.md +0 -372
  66. package/bin/skills/clickzetta-sql-syntax-guide/references/migration-databricks.md +0 -260
  67. package/bin/skills/clickzetta-sql-syntax-guide/references/vs-snowflake.md +0 -346
  68. package/bin/skills/clickzetta-sql-syntax-guide/references/vs-spark.md +0 -229
  69. /package/bin/skills/{clickzetta-sql-syntax-guide → clickzetta-sql-migration}/LICENSE +0 -0
@@ -1,28 +1,28 @@
1
- # Snowflake → ClickZetta 迁移指南
1
+ # Snowflake → ClickZetta Migration Guide
2
2
 
3
- > 全面覆盖从 Snowflake 迁移到 ClickZetta Lakehouse 时遇到的 SQL 兼容性问题,所有结论均经过真实 Lakehouse 验证。
3
+ > Comprehensive coverage of SQL compatibility issues when migrating from Snowflake to ClickZetta Lakehouse. All conclusions verified on a real Lakehouse instance.
4
4
 
5
5
  ---
6
6
 
7
- ## 对象概念映射
7
+ ## Object Concept Mapping
8
8
 
9
- | Snowflake | ClickZetta | 说明 |
9
+ | Snowflake | ClickZetta | Description |
10
10
  |---|---|---|
11
- | DATABASE | WORKSPACE | 顶层容器 |
12
- | SCHEMA | SCHEMA | 相同 |
13
- | WAREHOUSE | VCLUSTER | 计算集群 |
14
- | STAGE | VOLUME | 文件存储区域 |
15
- | STORAGE INTEGRATION | STORAGE CONNECTION | 对象存储认证 |
16
- | SNOWPIPE | PIPE | 持续导入管道 |
17
- | STREAM | TABLE STREAM | CDC 变更捕获 |
18
- | DYNAMIC TABLE | DYNAMIC TABLE | 语法不同 |
19
- | TASK | Studio 任务 | 调度任务 |
20
- | SEQUENCE | IDENTITY | 自增序列 |
21
- | SHARE | SHARE | 跨实例数据共享(语法相同) |
11
+ | DATABASE | WORKSPACE | Top-level container |
12
+ | SCHEMA | SCHEMA | Same |
13
+ | WAREHOUSE | VCLUSTER | Compute cluster |
14
+ | STAGE | VOLUME | File storage area |
15
+ | STORAGE INTEGRATION | STORAGE CONNECTION | Object storage authentication |
16
+ | SNOWPIPE | PIPE | Continuous ingestion pipeline |
17
+ | STREAM | TABLE STREAM | CDC change capture |
18
+ | DYNAMIC TABLE | DYNAMIC TABLE | Different syntax |
19
+ | TASK | Studio Task | Scheduled tasks |
20
+ | SEQUENCE | IDENTITY column | Auto-increment sequence |
21
+ | SHARE | SHARE | Cross-instance data sharing (same syntax) |
22
22
 
23
23
  ---
24
24
 
25
- ## DDL 差异
25
+ ## DDL Differences
26
26
 
27
27
  ### CREATE TABLE
28
28
 
@@ -38,7 +38,7 @@ CREATE OR REPLACE TABLE orders (
38
38
  tags ARRAY
39
39
  ) CLUSTER BY (DATE_TRUNC('month', created_at));
40
40
 
41
- -- ClickZetta 等价写法
41
+ -- ClickZetta equivalent
42
42
  CREATE TABLE IF NOT EXISTS orders (
43
43
  id BIGINT IDENTITY(1), -- AUTOINCREMENT → IDENTITY
44
44
  customer_id INT, -- NUMBER(10,0) → INT
@@ -46,99 +46,99 @@ CREATE TABLE IF NOT EXISTS orders (
46
46
  status STRING DEFAULT 'pending',
47
47
  created_at TIMESTAMP DEFAULT current_timestamp(),
48
48
  meta JSON, -- VARIANT → JSON
49
- tags ARRAY<STRING> -- ARRAY → ARRAY<T>(需指定元素类型)
49
+ tags ARRAY<STRING> -- ARRAY → ARRAY<T> (must specify element type)
50
50
  )
51
51
  CLUSTERED BY (customer_id) INTO 16 BUCKETS; -- CLUSTER BY → CLUSTERED BY ... BUCKETS
52
52
  ```
53
53
 
54
- ### 不支持的 DDL
54
+ ### Unsupported DDL
55
55
 
56
56
  ```sql
57
- -- ❌ CREATE OR REPLACE TABLE(用 IF NOT EXISTS
57
+ -- ❌ CREATE OR REPLACE TABLE (use IF NOT EXISTS)
58
58
  CREATE OR REPLACE TABLE t (...);
59
59
  -- ✅ ClickZetta
60
60
  CREATE TABLE IF NOT EXISTS t (...);
61
61
 
62
- -- ❌ CREATE SEQUENCE(用 IDENTITY 列)
62
+ -- ❌ CREATE SEQUENCE (use IDENTITY column)
63
63
  CREATE SEQUENCE my_seq START 1 INCREMENT 1;
64
64
  -- ✅ ClickZetta
65
65
  CREATE TABLE t (id BIGINT IDENTITY(1), ...);
66
66
 
67
- -- ❌ CREATE TEMPORARY TABLE(用 CTE 替代)
67
+ -- ❌ CREATE TEMPORARY TABLE (use CTE instead)
68
68
  CREATE TEMPORARY TABLE temp_t AS SELECT ...;
69
69
  -- ✅ ClickZetta
70
70
  WITH temp_t AS (SELECT ...) SELECT * FROM temp_t;
71
71
 
72
- -- ❌ CREATE TRANSIENT TABLE(用 data_lifecycle 控制)
72
+ -- ❌ CREATE TRANSIENT TABLE (use data_lifecycle to control)
73
73
  CREATE TRANSIENT TABLE t (...);
74
74
  -- ✅ ClickZetta
75
75
  CREATE TABLE t (...) PROPERTIES ('data_lifecycle' = '1');
76
76
 
77
- -- ❌ CLUSTER BY(列级别)
77
+ -- ❌ CLUSTER BY (column-level)
78
78
  CREATE TABLE t (...) CLUSTER BY (col1, col2);
79
- -- ✅ ClickZetta(分桶)
79
+ -- ✅ ClickZetta (bucketing)
80
80
  CREATE TABLE t (...) CLUSTERED BY (col1) INTO 16 BUCKETS;
81
81
  ```
82
82
 
83
83
  ---
84
84
 
85
- ## 数据类型映射
85
+ ## Data Type Mapping
86
86
 
87
- | Snowflake | ClickZetta | 注意事项 |
87
+ | Snowflake | ClickZetta | Notes |
88
88
  |---|---|---|
89
89
  | `NUMBER(p,s)` / `NUMERIC(p,s)` | `DECIMAL(p,s)` | |
90
90
  | `NUMBER(10,0)` / `INTEGER` | `INT` / `BIGINT` | |
91
91
  | `FLOAT` / `FLOAT4` | `FLOAT` | |
92
92
  | `FLOAT8` / `DOUBLE` | `DOUBLE` | |
93
- | `VARCHAR(n)` / `TEXT` | `STRING` `VARCHAR(n)` | |
94
- | `CHAR(n)` | `CHAR(n)` | 相同 |
95
- | `BOOLEAN` | `BOOLEAN` | 相同,但写入规则不同(见下) |
96
- | `DATE` | `DATE` | 相同 |
97
- | `TIMESTAMP_LTZ` | `TIMESTAMP` | 带本地时区 |
98
- | `TIMESTAMP_NTZ` | `TIMESTAMP_NTZ` | 无时区 |
99
- | `TIMESTAMP_TZ` | `TIMESTAMP` | ClickZetta 无独立 TZ 类型 |
100
- | `VARIANT` | `JSON` | 访问语法不同(见下) |
101
- | `ARRAY` | `ARRAY<T>` | 需指定元素类型 |
102
- | `OBJECT` | `MAP<STRING,STRING>` `STRUCT<...>` | |
103
- | `GEOGRAPHY` | 不支持 | |
104
- | `VECTOR(FLOAT, N)` | `VECTOR(FLOAT, N)` | 相同 |
93
+ | `VARCHAR(n)` / `TEXT` | `STRING` or `VARCHAR(n)` | |
94
+ | `CHAR(n)` | `CHAR(n)` | Same |
95
+ | `BOOLEAN` | `BOOLEAN` | Same, but different write rules (see below) |
96
+ | `DATE` | `DATE` | Same |
97
+ | `TIMESTAMP_LTZ` | `TIMESTAMP` | With local timezone |
98
+ | `TIMESTAMP_NTZ` | `TIMESTAMP_NTZ` | Without timezone |
99
+ | `TIMESTAMP_TZ` | `TIMESTAMP` | ClickZetta has no separate TZ type |
100
+ | `VARIANT` | `JSON` | Different access syntax (see below) |
101
+ | `ARRAY` | `ARRAY<T>` | Must specify element type |
102
+ | `OBJECT` | `MAP<STRING,STRING>` or `STRUCT<...>` | |
103
+ | `GEOGRAPHY` | Not supported | |
104
+ | `VECTOR(FLOAT, N)` | `VECTOR(FLOAT, N)` | Same |
105
105
 
106
106
  ---
107
107
 
108
- ## ⚠️ 写入时类型转换(重要差异)
108
+ ## ⚠️ Type Conversion on Write (Important Difference)
109
109
 
110
- Snowflake 允许字符串隐式转换为日期/布尔等类型,ClickZetta **不允许**:
110
+ Snowflake allows implicit string conversion to date/boolean types; ClickZetta **does not**:
111
111
 
112
112
  ```sql
113
- -- ❌ Snowflake 可以,ClickZetta 报错
113
+ -- ❌ Works in Snowflake, errors in ClickZetta
114
114
  INSERT INTO t VALUES ('2024-01-15', 'true', '123');
115
115
 
116
- -- ✅ ClickZetta 必须显式转换
116
+ -- ✅ ClickZetta requires explicit conversion
117
117
  INSERT INTO t VALUES (DATE '2024-01-15', TRUE, CAST('123' AS INT));
118
118
  INSERT INTO t VALUES (CAST('2024-01-15' AS DATE), CAST('true' AS BOOLEAN), 123);
119
119
  ```
120
120
 
121
- | 目标类型 | Snowflake | ClickZetta |
121
+ | Target Type | Snowflake | ClickZetta |
122
122
  |---|---|---|
123
- | `DATE` ← `'2024-01-15'` | ✅ 隐式 | ❌ `DATE '...'` `CAST` |
124
- | `TIMESTAMP` ← `'2024-01-15 12:00'` | ✅ 隐式 | ❌ `TIMESTAMP '...'` `CAST` |
125
- | `BOOLEAN` ← `'true'` | ✅ 隐式 | ❌ `TRUE`/`FALSE` `CAST` |
126
- | `BOOLEAN` ← `1` | ✅ 隐式 | ❌ `CAST(1 AS BOOLEAN)` |
127
- | `INT` ← `'123'` | ✅ 隐式 | ❌ `CAST('123' AS INT)` |
128
- | `JSON` ← `'{"k":1}'` | ✅ 隐式 | ❌ `PARSE_JSON(...)` `CAST` |
129
- | WHERE 中字符串比较 | ✅ | ✅ 允许 |
123
+ | `DATE` ← `'2024-01-15'` | ✅ Implicit | ❌ Requires `DATE '...'` or `CAST` |
124
+ | `TIMESTAMP` ← `'2024-01-15 12:00'` | ✅ Implicit | ❌ Requires `TIMESTAMP '...'` or `CAST` |
125
+ | `BOOLEAN` ← `'true'` | ✅ Implicit | ❌ Requires `TRUE`/`FALSE` or `CAST` |
126
+ | `BOOLEAN` ← `1` | ✅ Implicit | ❌ Requires `CAST(1 AS BOOLEAN)` |
127
+ | `INT` ← `'123'` | ✅ Implicit | ❌ Requires `CAST('123' AS INT)` |
128
+ | `JSON` ← `'{"k":1}'` | ✅ Implicit | ❌ Requires `PARSE_JSON(...)` or `CAST` |
129
+ | String comparison in WHERE | ✅ | ✅ Allowed |
130
130
 
131
131
  ---
132
132
 
133
- ## DML 差异
133
+ ## DML Differences
134
134
 
135
135
  ### INSERT / UPDATE
136
136
 
137
137
  ```sql
138
- -- Snowflake:字符串可隐式转换
138
+ -- Snowflake: strings can be implicitly converted
139
139
  INSERT INTO orders VALUES (1, '2024-01-15', 'true');
140
140
 
141
- -- ClickZetta:必须显式转换
141
+ -- ClickZetta: must explicitly convert
142
142
  INSERT INTO orders VALUES (1, DATE '2024-01-15', TRUE);
143
143
  UPDATE orders SET dt = CAST('2024-06-01' AS DATE) WHERE id = 1;
144
144
  ```
@@ -146,41 +146,41 @@ UPDATE orders SET dt = CAST('2024-06-01' AS DATE) WHERE id = 1;
146
146
  ### MERGE INTO
147
147
 
148
148
  ```sql
149
- -- Snowflake:支持多个 WHEN NOT MATCHED,支持 WHEN NOT MATCHED BY SOURCE
149
+ -- Snowflake: supports multiple WHEN NOT MATCHED, supports WHEN NOT MATCHED BY SOURCE
150
150
  MERGE INTO t USING s ON t.id = s.id
151
151
  WHEN MATCHED THEN UPDATE SET ...
152
152
  WHEN NOT MATCHED THEN INSERT ...
153
- WHEN NOT MATCHED BY SOURCE THEN DELETE; -- ❌ ClickZetta 不支持
153
+ WHEN NOT MATCHED BY SOURCE THEN DELETE; -- ❌ ClickZetta does not support
154
154
 
155
- -- ClickZettaWHEN NOT MATCHED 只能有一个,UPDATE 必须在 DELETE
155
+ -- ClickZetta: WHEN NOT MATCHED can only appear once, UPDATE must come before DELETE
156
156
  MERGE INTO t USING s ON t.id = s.id
157
- WHEN MATCHED AND s.flag = 0 THEN UPDATE SET t.val = s.val -- UPDATE 在前
158
- WHEN MATCHED AND s.flag = 1 THEN DELETE -- DELETE 在后
157
+ WHEN MATCHED AND s.flag = 0 THEN UPDATE SET t.val = s.val -- UPDATE first
158
+ WHEN MATCHED AND s.flag = 1 THEN DELETE -- DELETE second
159
159
  WHEN NOT MATCHED THEN INSERT (id, val) VALUES (s.id, s.val);
160
160
  ```
161
161
 
162
- ### 事务
162
+ ### Transactions
163
163
 
164
164
  ```sql
165
- -- ❌ ClickZetta 不支持事务语法
165
+ -- ❌ ClickZetta does not support transaction syntax
166
166
  BEGIN;
167
167
  BEGIN TRANSACTION;
168
168
  START TRANSACTION;
169
169
  COMMIT;
170
170
  ROLLBACK;
171
171
 
172
- -- ✅ MERGE 实现原子性 UPSERT
172
+ -- ✅ Use MERGE for atomic UPSERT
173
173
  MERGE INTO target USING source ON ...
174
174
  ```
175
175
 
176
176
  ---
177
177
 
178
- ## DQL 差异
178
+ ## DQL Differences
179
179
 
180
- ### QUALIFY(窗口函数过滤)
180
+ ### QUALIFY (Window Function Filtering)
181
181
 
182
182
  ```sql
183
- -- 两者都支持 QUALIFY
183
+ -- Both support QUALIFY
184
184
  SELECT * FROM orders
185
185
  QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) = 1;
186
186
  ```
@@ -188,11 +188,11 @@ QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) =
188
188
  ### PIVOT / UNPIVOT
189
189
 
190
190
  ```sql
191
- -- Snowflake:原生支持
191
+ -- Snowflake: natively supported
192
192
  SELECT * FROM sales
193
193
  PIVOT (SUM(amount) FOR month IN ('Jan', 'Feb', 'Mar'));
194
194
 
195
- -- ClickZetta:用 CASE WHEN
195
+ -- ClickZetta: use CASE WHEN
196
196
  SELECT product,
197
197
  SUM(CASE WHEN month = 'Jan' THEN amount END) AS Jan,
198
198
  SUM(CASE WHEN month = 'Feb' THEN amount END) AS Feb
@@ -202,35 +202,35 @@ FROM sales GROUP BY product;
202
202
  ### LATERAL FLATTEN → LATERAL VIEW EXPLODE
203
203
 
204
204
  ```sql
205
- -- SnowflakeLATERAL FLATTEN
205
+ -- Snowflake: LATERAL FLATTEN
206
206
  SELECT f.value::STRING AS skill
207
207
  FROM employees, LATERAL FLATTEN(input => skills) f;
208
208
 
209
- -- ClickZettaLATERAL VIEW EXPLODE
209
+ -- ClickZetta: LATERAL VIEW EXPLODE
210
210
  SELECT skill
211
211
  FROM employees
212
212
  LATERAL VIEW EXPLODE(skills) lv AS skill;
213
213
 
214
- -- 带位置索引
214
+ -- With position index
215
215
  SELECT pos, skill
216
216
  FROM employees
217
217
  LATERAL VIEW POSEXPLODE(skills) lv AS pos, skill;
218
218
  ```
219
219
 
220
- ### JSON 访问语法
220
+ ### JSON Access Syntax
221
221
 
222
222
  ```sql
223
- -- Snowflake:冒号语法
223
+ -- Snowflake: colon syntax
224
224
  SELECT data:address:city AS city FROM users;
225
225
  SELECT data[0]:name AS name FROM users;
226
226
  SELECT data:scores[2] AS score FROM users;
227
227
 
228
- -- ClickZetta:方括号语法
228
+ -- ClickZetta: bracket syntax
229
229
  SELECT data['address']['city'] AS city FROM users;
230
230
  SELECT data['phoneNumbers'][0]['name'] AS name FROM users;
231
231
  SELECT data['scores'][2] AS score FROM users;
232
232
 
233
- -- 类型转换
233
+ -- Type conversion
234
234
  -- Snowflake: data:age::INT
235
235
  -- ClickZetta: CAST(data['age'] AS INT)
236
236
  ```
@@ -243,92 +243,92 @@ SELECT OBJECT_CONSTRUCT('name', 'Alice', 'age', 30) AS obj;
243
243
  SELECT ARRAY_CONSTRUCT(1, 2, 3) AS arr;
244
244
 
245
245
  -- ClickZetta
246
- SELECT MAP('name', 'Alice') AS obj; -- 简单 MAP
247
- SELECT named_struct('id', 1, 'name', 'Alice') AS person; -- ✅ 命名字段用 named_struct
248
- SELECT STRUCT(1, 'Alice') AS person; -- 位置参数写法
246
+ SELECT MAP('name', 'Alice') AS obj; -- simple MAP
247
+ SELECT named_struct('id', 1, 'name', 'Alice') AS person; -- ✅ named fields use named_struct
248
+ SELECT STRUCT(1, 'Alice') AS person; -- positional parameter syntax
249
249
  SELECT ARRAY(1, 2, 3) AS arr; -- ARRAY_CONSTRUCT → ARRAY()
250
250
  ```
251
251
 
252
252
  ### ASOF JOIN / MATCH_RECOGNIZE
253
253
 
254
254
  ```sql
255
- -- ❌ ClickZetta 不支持
255
+ -- ❌ ClickZetta does not support
256
256
  SELECT * FROM t1 ASOF JOIN t2 ON t1.id = t2.id;
257
257
  SELECT * FROM t MATCH_RECOGNIZE (...);
258
258
  ```
259
259
 
260
260
  ---
261
261
 
262
- ## 函数差异
262
+ ## Function Differences
263
263
 
264
- ### 日期函数
264
+ ### Date Functions
265
265
 
266
266
  ```sql
267
267
  -- Snowflake → ClickZetta
268
- DATEADD(day, 7, dt) → DATEADD(day, 7, dt) ✅ 相同;也可用 DATE_ADD(dt, 7)
269
- DATEDIFF(day, start, end) → DATEDIFF(end, start) ⚠️ 参数顺序相反!
270
- DATE_TRUNC('month', dt) → DATE_TRUNC('month', dt) 相同
271
- TO_DATE('2024-01-01') → TO_DATE('2024-01-01') 相同
268
+ DATEADD(day, 7, dt) → DATEADD(day, 7, dt) ✅ same; also DATE_ADD(dt, 7)
269
+ DATEDIFF(day, start, end) → DATEDIFF(end, start) ⚠️ parameter order reversed!
270
+ DATE_TRUNC('month', dt) → DATE_TRUNC('month', dt) same
271
+ TO_DATE('2024-01-01') → TO_DATE('2024-01-01') same
272
272
  CONVERT_TIMEZONE(tz, dt) → CONVERT_TZ(dt, from_tz, to_tz)
273
273
  SYSDATE() / GETDATE() → CURRENT_TIMESTAMP() / NOW()
274
- LAST_DAY(dt) → LAST_DAY(dt) 相同
275
- YEAR(dt) / MONTH(dt) → YEAR(dt) / MONTH(dt) 相同
274
+ LAST_DAY(dt) → LAST_DAY(dt) same
275
+ YEAR(dt) / MONTH(dt) → YEAR(dt) / MONTH(dt) same
276
276
  ```
277
277
 
278
- ### 字符串函数
278
+ ### String Functions
279
279
 
280
280
  ```sql
281
281
  -- Snowflake → ClickZetta
282
- CHARINDEX(sub, s) → INSTR(s, sub) ⚠️ 参数顺序相反!
282
+ CHARINDEX(sub, s) → INSTR(s, sub) ⚠️ parameter order reversed!
283
283
  EDITDISTANCE(s1, s2) → LEVENSHTEIN(s1, s2)
284
284
  STRTOK(s, delim, n) → SPLIT_PART(s, delim, n)
285
- ILIKE(s, pattern) → ILIKE(s, pattern) ✅ ClickZetta 也支持!
285
+ ILIKE(s, pattern) → ILIKE(s, pattern) ✅ ClickZetta also supports!
286
286
  CONTAINS(s, sub) → INSTR(s, sub) > 0
287
287
  STARTSWITH(s, prefix) → s LIKE 'prefix%'
288
288
  ENDSWITH(s, suffix) → s LIKE '%suffix'
289
- INITCAP(s) → INITCAP(s) 相同
290
- REGEXP_LIKE(s, p) → RLIKE(s, p) s RLIKE p
289
+ INITCAP(s) → INITCAP(s) same
290
+ REGEXP_LIKE(s, p) → RLIKE(s, p) or s RLIKE p
291
291
  ```
292
292
 
293
- ### 聚合函数
293
+ ### Aggregate Functions
294
294
 
295
295
  ```sql
296
296
  -- Snowflake → ClickZetta
297
297
  LISTAGG(col, ',') WITHIN GROUP (ORDER BY col) → GROUP_CONCAT(col ORDER BY col SEPARATOR ',')
298
- ARRAY_AGG(col) WITHIN GROUP (ORDER BY col) → ARRAY_AGG(col) ⚠️ 不支持 WITHIN GROUP
298
+ ARRAY_AGG(col) WITHIN GROUP (ORDER BY col) → ARRAY_AGG(col) ⚠️ WITHIN GROUP not supported
299
299
  OBJECT_AGG(key, value) → MAP_AGG(key, value)
300
- APPROX_COUNT_DISTINCT(col) → APPROX_COUNT_DISTINCT(col) 相同
301
- MEDIAN(col) → MEDIAN(col) 相同
300
+ APPROX_COUNT_DISTINCT(col) → APPROX_COUNT_DISTINCT(col) same
301
+ MEDIAN(col) → MEDIAN(col) same
302
302
  ```
303
303
 
304
- ### 条件函数
304
+ ### Conditional Functions
305
305
 
306
306
  ```sql
307
307
  -- Snowflake → ClickZetta
308
308
  IFF(cond, a, b) → IF(cond, a, b)
309
- ZEROIFNULL(x) → COALESCE(x, 0) NVL(x, 0)
309
+ ZEROIFNULL(x) → COALESCE(x, 0) or NVL(x, 0)
310
310
  NULLIFZERO(x) → NULLIF(x, 0)
311
- DECODE(expr, v1, r1, ...) → DECODE(expr, v1, r1, ...) 相同
311
+ DECODE(expr, v1, r1, ...) → DECODE(expr, v1, r1, ...) same
312
312
  BOOLAND(a, b) → a AND b
313
313
  BOOLOR(a, b) → a OR b
314
314
  ```
315
315
 
316
316
  ---
317
317
 
318
- ## Stream 元数据字段
318
+ ## Stream Metadata Fields
319
319
 
320
320
  ```sql
321
321
  -- Snowflake Stream
322
322
  METADATA$ACTION -- 'INSERT' / 'DELETE'
323
- METADATA$ISUPDATE -- TRUE/FALSEUPDATE 会产生一对 DELETE+INSERT
324
- METADATA$ROW_ID -- 行唯一标识
323
+ METADATA$ISUPDATE -- TRUE/FALSE (UPDATE produces a DELETE+INSERT pair)
324
+ METADATA$ROW_ID -- row unique identifier
325
325
 
326
326
  -- ClickZetta Table Stream
327
327
  __change_type -- 'INSERT' / 'UPDATE_BEFORE' / 'UPDATE_AFTER' / 'DELETE'
328
- __commit_version -- 提交版本号
329
- __commit_timestamp -- 提交时间戳
328
+ __commit_version -- commit version number
329
+ __commit_timestamp -- commit timestamp
330
330
 
331
- -- 消费 Stream MERGE 写法
331
+ -- MERGE pattern for consuming Stream
332
332
  -- Snowflake
333
333
  MERGE INTO target t USING stream s ON t.id = s.id
334
334
  WHEN MATCHED AND s.METADATA$ACTION = 'DELETE' THEN DELETE
@@ -344,7 +344,7 @@ WHEN NOT MATCHED AND s.__change_type = 'INSERT' THEN INSERT ...;
344
344
 
345
345
  ---
346
346
 
347
- ## Dynamic Table 差异
347
+ ## Dynamic Table Differences
348
348
 
349
349
  ```sql
350
350
  -- Snowflake
@@ -353,7 +353,7 @@ CREATE DYNAMIC TABLE product_sales
353
353
  WAREHOUSE = my_warehouse
354
354
  AS SELECT ...;
355
355
 
356
- -- ClickZetta(不支持 TARGET_LAG
356
+ -- ClickZetta (does not support TARGET_LAG)
357
357
  CREATE DYNAMIC TABLE product_sales
358
358
  REFRESH INTERVAL 1 MINUTE VCLUSTER default_ap
359
359
  AS SELECT ...;
@@ -361,13 +361,13 @@ AS SELECT ...;
361
361
 
362
362
  ---
363
363
 
364
- ## 已验证的兼容性(Snowflake 有,ClickZetta 也有)
364
+ ## Verified Compatibility (Snowflake has it, ClickZetta also has it)
365
365
 
366
366
  - `SEMI JOIN` / `ANTI JOIN` ✅
367
- - `QUALIFY` ✅(ClickZetta 也支持)
368
- - `ILIKE` ✅(ClickZetta 也支持)
369
- - `DATEADD` ✅(ClickZetta 也支持)
370
- - `MINUS`(等价于 EXCEPT)✅
367
+ - `QUALIFY` ✅ (ClickZetta also supports)
368
+ - `ILIKE` ✅ (ClickZetta also supports)
369
+ - `DATEADD` ✅ (ClickZetta also supports)
370
+ - `MINUS` (equivalent to EXCEPT) ✅
371
371
  - `DECODE` ✅
372
372
  - `INITCAP` ✅
373
373
  - `MEDIAN` ✅
@@ -379,4 +379,4 @@ AS SELECT ...;
379
379
  - `REGEXP_LIKE` / `RLIKE` ✅
380
380
  - `SPLIT_PART` ✅
381
381
  - `LAST_DAY` ✅
382
- - `IDENTITY` 列(替代 AUTOINCREMENT/SEQUENCE)✅
382
+ - `IDENTITY` column (replaces AUTOINCREMENT/SEQUENCE) ✅