JavaScript UDF ์๊ฐยถ
JavaScript๋ก UDF(์ฌ์ฉ์ ์ ์ ํจ์)์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์น์ ์ ํญ๋ชฉ์์๋ JavaScript ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค๊ณํ๊ณ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
UDF ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ์ ์๋ ์ธ์ด ๋ชฉ๋ก์ ํฌํจํ์ฌ, UDF์ ๋ํ ์๊ฐ๋ ์ฌ์ฉ์ ์ ์ ํจ์ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ผ๋ฉด SQL๋ก UDF๋ฅผ ์์ฑํฉ๋๋ค. SQL์ ์ฌ์ฉํ์ฌ UDF์ ๋ง๋ค๊ฑฐ๋ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์ ์ ์ ํจ์ ์์ฑํ๊ธฐ ๋๋ UDF ์คํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์คํ๋ ๋ ๋ก๊ทธ ๋ฐ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์บก์ฒํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ก๊น , ์ถ์ ๋ฐ ๋ฉํธ๋ฆญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
JavaScript UDF ์ฒ๋ฆฌ๊ธฐ์ ๊ด๋ จ๋ ์ ํ ์ฌํญ์ JavaScript UDF ์ ํ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด ํญ๋ชฉ์ ๋ด์ฉ:
JavaScript ์ฒ๋ฆฌ๊ธฐ ์๋ ๋ฐฉ์ยถ
์ฌ์ฉ์๋ UDF๋ฅผ ํธ์ถํ ๋ UDF์ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ Snowflake์ ์ ๋ฌํฉ๋๋ค. Snowflake๋ UDF์ ๋ ผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด ๊ด๋ จ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋(์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ธ์๋ ํฌํจ)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฒ๋ฆฌ๊ธฐ ํจ์๋ ์ถ๋ ฅ์ Snowflake๋ก ๋ฐํํ๊ณ Snowflake๋ ์ด๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํฉ๋๋ค.
UDF์ ์ ๋ฌ๋ ๊ฐ ํ์ ๋ํด UDF๋ ์ค์นผ๋ผ(์ฆ, ๋จ์ผ) ๊ฐ์ ๋ฐํํ๊ฑฐ๋, ํ ์ด๋ธ ํจ์๋ก ์ ์๋ ๊ฒฝ์ฐ ํ ์ธํธ๋ฅผ ๋ฐํํฉ๋๋ค.
์ยถ
๋ค์ ์์ ์ ์ฝ๋๋ ์
๋ ฅ ARRAY๋ฅผ ๋ฐ์ ์ญ์์ผ๋ก ์ ๋ ฌ๋ ์์๋ฅผ ํฌํจํ ARRAY๋ฅผ ๋ฐํํ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ก my_array_reverse
๋ผ๋ UDF๋ฅผ ์์ฑํฉ๋๋ค. Snowflake๋ SQL-JavaScript ๋ฐ์ดํฐ ํ์
๋งคํ ์ ์ค๋ช
๋ ๋งคํ์ ๋ฐ๋ผ JavaScript ์ธ์ ๋ฐ ๋ฐํ ์ ํ์ SQL๋ก ๋ณํํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํฉ๋๋ค.
JavaScript ์ฝ๋๋ SQL ์ฝ๋์์ ์ด๋ฆ์ด ๋๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์ ์ด๋ฆ์ ๋ชจ๋ ๋๋ฌธ์๋ก ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
-- Create the UDF.
CREATE OR REPLACE FUNCTION my_array_reverse(a ARRAY)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
return A.reverse();
$$
;
JavaScript ๋ฐ์ดํฐ ํ์ ยถ
SQL ๋ฐ JavaScript UDF๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ง์์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฌํ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ์ ๊ณตํฉ๋๋ค. Snowflake ๋ฐ JavaScript ๋ด์ ์ค๋ธ์ ํธ๋ ๋ค์ ๋งคํ์ ์ฌ์ฉํ์ฌ ์ ์ก๋ฉ๋๋ค.
์ ์ ๋ฐ Doubleยถ
JavaScript์๋ ์ ์ ํ์์ด ์์ต๋๋ค. ๋ชจ๋ ์ซ์๋ Double๋ก ํ์๋ฉ๋๋ค. JavaScript UDF๋ ํ์ ๋ณํ์ ํตํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ ์ ๊ฐ์ ํ์ฉํ๊ฑฐ๋ ๋ฐํํ์ง ์์ต๋๋ค(์ฆ, Double์ ํ์ฉํ๋ JavaScript UDF์ ์ ์๋ฅผ ์ ๋ฌํ ์ ์์).
Snowflake SQL๊ณผ JavaScript๋ ๋ ๋ค Double ๊ฐ์ ์ง์ํฉ๋๋ค. ์ด ๊ฐ์ ์๋ ๊ทธ๋๋ก ์ ์ก๋ฉ๋๋ค.
๋ฌธ์์ดยถ
Snowflake SQL๊ณผ JavaScript๋ ๋ ๋ค ๋ฌธ์์ด ๊ฐ์ ์ง์ํฉ๋๋ค. ์ด ๊ฐ์ ์๋ ๊ทธ๋๋ก ์ ์ก๋ฉ๋๋ค.
์ด์ง ๊ฐยถ
๋ชจ๋ ์ด์ง ๊ฐ์ JavaScript Uint8Array
์ค๋ธ์ ํธ๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฌํ ํ์ํ๋ ๋ฐฐ์ด์ ์ผ๋ฐ JavaScript ๋ฐฐ์ด๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ก์ธ์คํ ์ ์์ง๋ง, ๋ ํจ์จ์ ์ด๊ณ ์ถ๊ฐ ๋ฉ์๋๋ฅผ ์ง์ํฉ๋๋ค.
JavaScript UDF๊ฐ Uint8Array
์ค๋ธ์ ํธ๋ฅผ ๋ฐํํ๋ฉด ์ด๋ Snowflake SQL ์ด์ง ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
๋ ์งยถ
๋ชจ๋ ํ์์คํฌํ ๋ฐ ๋ ์ง ํ์์ JavaScript Date()
์ค๋ธ์ ํธ๋ก ๋ณํ๋ฉ๋๋ค. JavaScript ๋ ์ง ํ์์ Snowflake SQL์ TIMESTAMP_LTZ(3)์ ํด๋นํฉ๋๋ค.
๋ ์ง ๋๋ ์๊ฐ์ ํ์ฉํ๋ JavaScript UDF์ ๋ํด ๋ค์ ์ฐธ๊ณ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
๋ฐ๋ฆฌ์ด๋ฅผ ์ด๊ณผํ๋ ๋ชจ๋ ์ ๋ฐ๋๋ ์์ค๋ฉ๋๋ค.
SQL TIMESTAMP_NTZ์์ ์์ฑ๋ JavaScript
Date
๋ ๋ ์ด์ โ๋ฒฝ์๊ณโ ์๊ฐ์ผ๋ก ์๋ํ์ง ์์ผ๋ฉฐ, ์ผ๊ด ์ ์ฝ ์๊ฐ์ ์ ์ํฅ์ ๋ฐ์ต๋๋ค. ์ด๋ TIMESTAMP_NTZ๋ฅผ TIMESTAMP_LTZ๋ก ๋ณํํ ๋์ ๋์๊ณผ ์ ์ฌํฉ๋๋ค.SQL TIMESTAMP_TZ์์ ์์ฑ๋ JavaScript
Date
๋ ํ์์กด ์ ๋ณด๋ฅผ ์์คํ์ง๋ง, ์ ๋ ฅ๊ณผ ๋์ผํ ์๊ฐ์ ๋ํ๋ ๋๋ค(TIMESTAMP_TZ๋ฅผ TIMESTAMP_LTZ๋ก ๋ณํํ ๋์ ์ ์ฌ).SQL DATE๋ ํ์ง ํ์์กด์ ํ์ฌ ์์ ์ ๋ํ๋ด๋ JavaScript
Date
๋ก ๋ณํ๋ฉ๋๋ค.
๋ํ, DATE ๋ฐ TIMESTAMP ํ์์ ๋ฐํํ๋ JavaScript UDF์ ๋ํด ๋ค์ ์ฐธ๊ณ ์ฌํญ์ ๊ณ ๋ คํ์ญ์์ค.
JavaScript
Date
์ค๋ธ์ ํธ๋ TIMESTAMP_LTZ(3)์์ ๋ฐํ ๋ฐ์ดํฐ ํ์ ์ผ๋ก์ ์บ์คํธ์ ๋์ผํ ๋ณํ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ค์ํ๋ฉด์ UDF์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํ๋ฉ๋๋ค.VARIANT ์ค๋ธ์ ํธ ๋ด๋ถ์ ์ค์ฒฉ๋ JavaScript
Date
์ค๋ธ์ ํธ๋ ํญ์ TIMESTAMP_LTZ(3) ํ์์ ๋๋ค.
๋ฒ ๋ฆฌ์ธํธ, ์ค๋ธ์ ํธ, ๋ฐฐ์ดยถ
JavaScript UDF๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ ๋ฆฌ์ธํธ ๋ฐ JSON ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์กฐ์ํ ์ ์์ต๋๋ค. UDF์ ์ ๋ฌ๋ ๋ฒ ๋ฆฌ์ธํธ ์ค๋ธ์ ํธ๋ ๊ธฐ๋ณธ JavaScript ํ์ ๋ฐ ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค. ์ด์ ์ ๋์ด๋ ๋ชจ๋ ๊ฐ์ ํด๋น JavaScript ํ์์ผ๋ก ๋ณํ๋ฉ๋๋ค. ๋ฒ ๋ฆฌ์ธํธ ์ค๋ธ์ ํธ ๋ฐ ๋ฐฐ์ด์ JavaScript ์ค๋ธ์ ํธ ๋ฐ ๋ฐฐ์ด๋ก ๋ณํ๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, UDF์์ ๋ฐํ๋ ๋ชจ๋ ๊ฐ์ ์ ์ ํ ๋ฒ ๋ฆฌ์ธํธ ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค. UDF๊ฐ ๋ฐํํ๋ ์ค๋ธ์ ํธ์ ๋ฐฐ์ด์๋ ํฌ๊ธฐ์ ๊น์ด ์ ํ์ด ์ ์ฉ๋ฉ๋๋ค.
-- flatten all arrays and values of objects into a single array
-- order of objects may be lost
CREATE OR REPLACE FUNCTION flatten_complete(v variant)
RETURNS variant
LANGUAGE JAVASCRIPT
AS '
// Define a function flatten(), which always returns an array.
function flatten(input) {
var returnArray = [];
if (Array.isArray(input)) {
var arrayLength = input.length;
for (var i = 0; i < arrayLength; i++) {
returnArray.push.apply(returnArray, flatten(input[i]));
}
} else if (typeof input === "object") {
for (var key in input) {
if (input.hasOwnProperty(key)) {
returnArray.push.apply(returnArray, flatten(input[key]));
}
}
} else {
returnArray.push(input);
}
return returnArray;
}
// Now call the function flatten() that we defined earlier.
return flatten(V);
';
select value from table(flatten(flatten_complete(parse_json(
'[
{"key1" : [1, 2], "key2" : ["string1", "string2"]},
{"key3" : [{"inner key 1" : 10, "inner key 2" : 11}, 12]}
]'))));
-----------+
VALUE |
-----------+
1 |
2 |
"string1" |
"string2" |
10 |
11 |
12 |
-----------+
JavaScript ์ธ์ ๋ฐ ๋ฐํ ๊ฐยถ
์ธ์๋ JavaScript ๋ด์์ ์ด๋ฆ์ผ๋ก ์ง์ ์ฐธ์กฐ๋ ์ ์์ต๋๋ค. ์ธ์ฉ๋์ง ์์ ์๋ณ์๋ ๋๋ฌธ์๋ก ๋ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํด์ผ ํฉ๋๋ค. ์ธ์ ๋ฐ UDF๋ JavaScript ๋ด์์ ์ฐธ์กฐ๋๋ฏ๋ก ์ ํจํ JavaScript ์๋ณ์์ฌ์ผ ํฉ๋๋ค. ํนํ UDF ๋ฐ ์ธ์ ์ด๋ฆ์ ๋ฌธ์ ๋๋ $
๋ก ์์ํด์ผ ํ๋ฉฐ ํ์ ๋ฌธ์๋ ์์ซ์, $
๋๋ _
์ผ ์ ์์ต๋๋ค. ๋ํ, ์ด๋ฆ์ JavaScript ์์ฝ์ด์ผ ์ ์์ต๋๋ค.
๋ค์ ์ธ ๊ฐ์ง ์๋ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐ๋๋ ์ธ์๋ฅผ ์ฌ์ฉํ๋ UDF๋ฅผ ๋ณด์ฌ์ค๋๋ค.
-- Valid UDF. 'N' must be capitalized.
CREATE OR REPLACE FUNCTION add5(n double)
RETURNS double
LANGUAGE JAVASCRIPT
AS 'return N + 5;';
select add5(0.0);
-- Valid UDF. Lowercase argument is double-quoted.
CREATE OR REPLACE FUNCTION add5_quoted("n" double)
RETURNS double
LANGUAGE JAVASCRIPT
AS 'return n + 5;';
select add5_quoted(0.0);
-- Invalid UDF. Error returned at runtime because JavaScript identifier 'n' cannot be resolved.
CREATE OR REPLACE FUNCTION add5_lowercase(n double)
RETURNS double
LANGUAGE JAVASCRIPT
AS 'return n + 5;';
select add5_lowercase(0.0);
NULL ๋ฐ ์ ์๋์ง ์์ ๊ฐยถ
JavaScript UDF๋ฅผ ์ฌ์ฉํ ๋๋ NULL ๊ฐ์ ํฌํจํ ์ ์๋ ํ ๋ฐ ๋ณ์์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค. ํนํ Snowflake์๋ ๋ ๊ฐ์ ๊ณ ์ ํ NULL ๊ฐ(SQL NULL
๋ฐ ๋ฒ ๋ฆฌ์ธํธ์ JSON null
)์ด ํฌํจ๋์ด ์๋ ๋ฐ๋ฉด, JavaScript์๋ null
์ธ์ undefined
๊ฐ์ด ํฌํจ๋์ด ์์ต๋๋ค.
JavaScript UDF์ ๋ํ SQL NULL
์ธ์๋ JavaScript undefined
๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฐํ๋ JavaScript undefined
๊ฐ์ SQL NULL
๋ก ๋ค์ ๋ณํ๋ฉ๋๋ค. ์ด๋ ๋ฒ ๋ฆฌ์ธํธ๋ฅผ ํฌํจํ ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์ ํด๋น๋ฉ๋๋ค. ๋ฒ ๋ฆฌ์ธํธ ์ด์ธ ํ์์ ๊ฒฝ์ฐ, ๋ฐํ๋ JavaScript null
๋ SQL NULL
๊ฐ์ด ๋ฉ๋๋ค.
๋ฒ ๋ฆฌ์ธํธ ํ์์ ์ธ์ ๋ฐ ๋ฐํ๋ ๊ฐ์ JavaScript์ undefined
๊ฐ๊ณผ null
๊ฐ์ ๊ตฌ๋ถํฉ๋๋ค SQL NULL
์ JavaScript undefined
๋ก ๊ณ์ ๋ณํ๋ฉ๋๋ค(JavaScript undefined
๋ SQL NULL
๋ก ๋ณํ). ๋ฒ ๋ฆฌ์ธํธ JSON null
์ JavaScript null
๋ก ๋ณํ๋ฉ๋๋ค(JavaScript null
์ Variant JSON null
๋ก ๋ค์ ๋ณํ). JavaScript ์ค๋ธ์ ํธ์ ๊ฐ์ผ๋ก ํฌํจ๋๊ฑฐ๋ ๋ฐฐ์ด์ ํฌํจ๋ undefined
๊ฐ์ผ๋ก ์ธํด ์์๊ฐ ์๋ต๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ๋์ ๋ฌธ์์ด๊ณผ ํ๋์
NULL
๊ฐ์ด ์๋ ํ ์ด๋ธ์ ๋ง๋์ญ์์ค.create or replace table strings (s string); insert into strings values (null), ('non-null string');๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด์
NULL
๋ก ๋ณํํ๊ณNULL
์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํจ์๋ฅผ ๋ง๋์ญ์์ค.CREATE OR REPLACE FUNCTION string_reverse_nulls(s string) RETURNS string LANGUAGE JAVASCRIPT AS ' if (S === undefined) { return "string was null"; } else { return undefined; } ';๋ค์๊ณผ ๊ฐ์ด ํจ์๋ฅผ ํธ์ถํ์ญ์์ค.
select string_reverse_nulls(s) from strings order by 1; +-------------------------+ | STRING_REVERSE_NULLS(S) | |-------------------------| | string was null | | NULL | +-------------------------+SQL
NULL
์ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๋ฒ ๋ฆฌ์ธํธ JSONnull
์ ์ ๋ฌํ๋ ๊ฒ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋์ญ์์ค.CREATE OR REPLACE FUNCTION variant_nulls(V VARIANT) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS ' if (V === undefined) { return "input was SQL null"; } else if (V === null) { return "input was variant null"; } else { return V; } ';select null, variant_nulls(cast(null as variant)), variant_nulls(PARSE_JSON('null')) ; +------+--------------------------------------+-----------------------------------+ | NULL | VARIANT_NULLS(CAST(NULL AS VARIANT)) | VARIANT_NULLS(PARSE_JSON('NULL')) | |------+--------------------------------------+-----------------------------------| | NULL | input was SQL null | input was variant null | +------+--------------------------------------+-----------------------------------+
undefined
๋ฐํ,null
๋ฐํ, ๊ทธ๋ฆฌ๊ณundefined
๋ฐnull
์ ํฌํจํ๋ ๋ฒ ๋ฆฌ์ธํธ ๋ฐํ ๊ฐ์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋์ญ์์ค(undefined
๊ฐ์ ๋ฐํ๋ ๋ฒ ๋ฆฌ์ธํธ์์ ์ ๊ฑฐ๋จ).CREATE OR REPLACE FUNCTION variant_nulls(V VARIANT) RETURNS variant LANGUAGE JAVASCRIPT AS $$ if (V == 'return undefined') { return undefined; } else if (V == 'return null') { return null; } else if (V == 3) { return { key1 : undefined, key2 : null }; } else { return V; } $$;select variant_nulls('return undefined'::VARIANT) AS "RETURNED UNDEFINED", variant_nulls('return null'::VARIANT) AS "RETURNED NULL", variant_nulls(3) AS "RETURNED VARIANT WITH UNDEFINED AND NULL; NOTE THAT UNDEFINED WAS REMOVED"; +--------------------+---------------+---------------------------------------------------------------------------+ | RETURNED UNDEFINED | RETURNED NULL | RETURNED VARIANT WITH UNDEFINED AND NULL; NOTE THAT UNDEFINED WAS REMOVED | |--------------------+---------------+---------------------------------------------------------------------------| | NULL | null | { | | | | "key2": null | | | | } | +--------------------+---------------+---------------------------------------------------------------------------+
JavaScript ๋ด ํ์ ๋ณํยถ
JavaScript๋ ๋ค์ํ ํ์ ๊ฐ์ ๊ฐ์ ์์์ ์ผ๋ก ๋ณํํฉ๋๋ค. ๊ฐ์ด ๋ฐํ๋๋ ๊ฒฝ์ฐ, ๊ฐ์ SQL ๊ฐ์ผ๋ก ๋ณํ๋๊ธฐ ์ ์ ์์ฒญ๋ ๋ฐํ ํ์์ผ๋ก ๋จผ์ ๋ณํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ซ์๊ฐ ๋ฐํ๋์์ง๋ง, UDF๊ฐ ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ ์ธ๋ ๊ฒฝ์ฐ, ์ด ์ซ์๋ JavaScript ๋ด์์ ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์๋ชป๋ ํ์์ ๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ JavaScript ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ ์ด ๋์์ผ๋ก ์ธํด ์จ๊ฒจ์ง ์ ์์ต๋๋ค. ๋ํ, ๊ฐ์ ํ์์ ๋ณํํ๋ ๋์ ์ค๋ฅ๊ฐ ๋ํ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
JavaScript ์ซ์ ๋ฒ์ยถ
์ ๋ฐ๋๊ฐ ๊ทธ๋๋ก ์ ์ง๋๋ ์ซ์์ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-(2^53 -1)
~
(2^53 -1)
Snowflake NUMBER(p, s) ๋ฐ DOUBLE ๋ฐ์ดํฐ ํ์ ์ ์ ํจํ ๊ฐ ๋ฒ์๊ฐ ๋ ํฝ๋๋ค. Snowflake์์ ๊ฐ์ ๊ฒ์ํ์ฌ JavaScript ์ซ์ ๋ณ์์ ์ ์ฅํ๋ฉด ์ ๋ฐ๋๊ฐ ์์ค๋ ์ ์์ต๋๋ค. ์:
CREATE OR REPLACE FUNCTION num_test(a double) RETURNS string LANGUAGE JAVASCRIPT AS $$ return A; $$ ;select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+
์ฒ์ ๋ ์ด์ ์ผ์นํด์ผ ํ๊ณ ์ธ ๋ฒ์งธ ์ด์ 0.0์ ํฌํจํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ JavaScript ์ฌ์ฉ์ ์ ์ ํจ์(UDF) ๋ฐ ์ ์ฅ ํ๋ก์์ ์ ์ ์ฉ๋ฉ๋๋ค.
getColumnValue()
๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฅ ํ๋ก์์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด ๋ค์์ ํตํด ๊ฐ์ ๋ฌธ์์ด๋ก ๊ฒ์ํ์ฌ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
getColumnValueAsString()
๊ทธ๋ฐ ๋ค์ ์ ์ฅ ํ๋ก์์ ์์ ๋ฌธ์์ด์ ๋ฐํํ๊ณ ๋ฌธ์์ด์ SQL์ ์ซ์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์บ์คํ ํ ์ ์์ต๋๋ค.
JavaScript ์ค๋ฅยถ
JavaScript๋ฅผ ์คํํ๋ ๋์ ๋ฐ์ํ ๋ชจ๋ ์ค๋ฅ๋ ์ฌ์ฉ์์๊ฒ SQL ์ค๋ฅ๋ก ๋ํ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ, ๋ฐํ์ ์ค๋ฅ, UDF ๋ด์์ ๋ฐ์ํ ํฌ์ฐฉ๋์ง ์์ ์ค๋ฅ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ค๋ฅ์ ์คํ ์ถ์ ์ด ํฌํจ๋ ๊ฒฝ์ฐ, ์ค๋ฅ ๋ฉ์์ง์ ํจ๊ป ์ถ๋ ฅ๋ฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ๊ณ SQL ์ค๋ฅ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ง ์๊ณ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ํ์ฉ๋ฉ๋๋ค.
๋๋ฒ๊น ํ ๋ SQL ์ค๋ฅ ๋ฉ์์ง ํ ์คํธ์ ๋ํ๋๋๋ก ์ค๋ฅ ๋ฉ์์ง์ ํจ๊ป ์ธ์ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ๊ฒฐ์ ์ UDF์ ๊ฒฝ์ฐ, ์ด๋ ๋ก์ปฌ JavaScript ์์ง์์ ์ค๋ฅ๋ฅผ ์ฌํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจํด์ ์ ์ฒด JavaScript UDF ๋ณธ๋ฌธ์ try-catch ๋ธ๋ก์ ๋ฐฐ์นํ๊ณ , ํฌ์ฐฉ๋ ์ค๋ฅ ๋ฉ์์ง์ ์ธ์ ๊ฐ์ ์ถ๊ฐํ๊ณ , ํ์ฅ๋ ๋ฉ์์ง์ ํจ๊ป ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์ UDF๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ ์ ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง์ ๊ฐ์ ๊ธฐ๋กํ ๊ฒฝ์ฐ, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ์๋์น ์๊ฒ ๋๋ฌ๋ ์ ์์ต๋๋ค.
ํจ์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์์ธ ๋๋ ์ฌ์ฉ์ ์ง์ ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ ํฌ์ฐฉํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฐ๋จํ ์๊ฐ ์ฌ๊ธฐ ์ ์์ต๋๋ค.
JavaScript UDF ๋ฌธ์ ํด๊ฒฐ ๋ ์ฐธ์กฐํ์ญ์์ค.
JavaScript UDF ๋ณด์ยถ
JavaScript UDF๋ ์ฌ๋ฌ ๊ณ์ธต์ ์ฟผ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ์์ ๊ณผ ๋ณด์์ ๊ฐ์ถ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
JavaScript UDF๋ฅผ ์คํํ๋ ๊ฐ์ ์จ์ดํ์ฐ์ค ๋ด์ ์ปดํจํ ๋ฆฌ์์ค๋ ์ฌ์ฉ์ ๊ณ์ ๋ด์์๋ง ์ก์ธ์คํ ์ ์์ต๋๋ค(์ฆ, ์จ์ดํ์ฐ์ค๋ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฅธ Snowflake ๊ณ์ ๊ณผ ๊ณต์ ํ์ง ์์).
๋ฌด๋จ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ด๋ธ ๋ฐ์ดํฐ๋ ๊ฐ์ ์จ์ดํ์ฐ์ค ๋ด์์ ์ํธํ๋์ด ์์ต๋๋ค.
JavaScript ์ฝ๋๋ ์ ํ๋ ์์ง ๋ด์์ ์คํ๋์ด JavaScript ์ปจํ ์คํธ์์ ์์คํ ํธ์ถ์ ๋ฐฉ์งํ๊ณ (์: ๋คํธ์ํฌ ๋ฐ ๋์คํฌ ์ก์ธ์ค ์์) ์์ง, ํนํ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ ์์คํ ๋ฆฌ์์ค๋ฅผ ์ ํํฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, JavaScript UDF๋ ์ ์๋ ํจ์๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ์๋ง ์ก์ธ์คํ ์ ์์ผ๋ฉฐ, ํฉ๋ฆฌ์ ์ธ ์์ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ก์ธ์ ์๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ ์ธ์๋ ๊ธฐ๋ณธ ์์คํ ์ ์ํ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.