Skip to content

Commit 178cf92

Browse files
authored
fix(sf|quadbin): QUADBIN_FROMLONGLAT not clamping latitudes and return some quadbin functions return NULL when NULL parameters (#456)
1 parent f16452b commit 178cf92

9 files changed

+88
-62
lines changed

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMLONGLAT.sql

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMLONGLAT
66
(longitude FLOAT, latitude FLOAT, resolution INT)
@@ -16,13 +16,13 @@ AS $$
1616
SELECT
1717
resolution AS z,
1818
ACOS(-1) AS PI,
19-
GREATEST(-85.05, LEAST(85.05, latitude)) AS latitude
19+
GREATEST(-85.05, LEAST(85.05, latitude)) AS params_latitude
2020
),
2121
__zxy AS (
2222
SELECT
2323
z,
24-
bitand( CAST(FLOOR(BITSHIFTLEFT(1, z) * ((longitude / 360.0) + 0.5)) AS INT), (BITSHIFTLEFT(1, z) - 1)) AS x,
25-
bitand( CAST(FLOOR(BITSHIFTLEFT(1, z) * (0.5 - (LN(TAN(PI/4.0 + latitude/2.0 * PI/180.0)) / (2*PI)))) AS INT),
24+
BITAND( CAST(FLOOR(BITSHIFTLEFT(1, z) * ((longitude / 360.0) + 0.5)) AS INT), (BITSHIFTLEFT(1, z) - 1)) AS x,
25+
BITAND( CAST(FLOOR(BITSHIFTLEFT(1, z) * (0.5 - (LN(TAN(PI/4.0 + params_latitude/2.0 * PI/180.0)) / (2*PI)))) AS INT),
2626
(BITSHIFTLEFT(1, z) - 1)) AS y
2727
FROM __params
2828
)

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMQUADKEY.sql

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_FROMQUADKEY
66
(quadkey STRING)
@@ -22,5 +22,8 @@ CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMQUADKEY
2222
RETURNS BIGINT
2323
IMMUTABLE
2424
AS $$
25-
SELECT CAST(@@SF_SCHEMA@@._QUADBIN_FROMQUADKEY(QUADKEY) AS BIGINT)
25+
IFF(quadkey IS NULL,
26+
NULL,
27+
CAST(@@SF_SCHEMA@@._QUADBIN_FROMQUADKEY(QUADKEY) AS BIGINT)
28+
)
2629
$$;

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMZXY.sql

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_FROMZXY
66
(z DOUBLE, x DOUBLE, y DOUBLE)
@@ -25,7 +25,10 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMZXY
2525
RETURNS BIGINT
2626
IMMUTABLE
2727
AS $$
28-
@@SF_SCHEMA@@._QUADBIN_STRING_TOINT(
29-
@@SF_SCHEMA@@._QUADBIN_FROMZXY(Z, X, Y)
28+
IFF(z IS NULL OR x IS NULL OR y IS NULL,
29+
NULL,
30+
@@SF_SCHEMA@@._QUADBIN_STRING_TOINT(
31+
@@SF_SCHEMA@@._QUADBIN_FROMZXY(Z, X, Y)
32+
)
3033
)
3134
$$;

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING.sql

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
-- The function returns a STRING for two main issues related with Snowflake limitations
66
-- 1. Snowflake has a native support of BigInt numbers, however, if the UDF
@@ -14,5 +14,8 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_KRING
1414
RETURNS ARRAY
1515
IMMUTABLE
1616
AS $$
17-
TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, false)))
17+
IFF(origin IS NULL OR size IS NULL,
18+
NULL,
19+
TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, false)))
20+
)
1821
$$;

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING_DISTANCES.sql

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
-- The function returns a STRING for two main issues related with Snowflake limitations
66
-- 1. Snowflake has a native support of BigInt numbers, however, if the UDF
@@ -14,5 +14,8 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_KRING_DISTANCES
1414
RETURNS ARRAY
1515
IMMUTABLE
1616
AS $$
17-
TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, true)))
17+
IFF(origin IS NULL OR size IS NULL,
18+
NULL,
19+
TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, true)))
20+
)
1821
$$;
+18-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
-- FIXME: slow
66

@@ -9,16 +9,19 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_SIBLING
99
RETURNS INT
1010
IMMUTABLE
1111
AS $$
12-
CASE direction
13-
WHEN 'left' THEN
14-
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, -1, 0)
15-
WHEN 'right' THEN
16-
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 1, 0)
17-
WHEN 'up' THEN
18-
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, -1)
19-
WHEN 'down' THEN
20-
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, 1)
21-
ELSE
22-
NULL
23-
END
12+
IFF(quadbin IS NULL OR direction IS NULL,
13+
NULL,
14+
CASE direction
15+
WHEN 'left' THEN
16+
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, -1, 0)
17+
WHEN 'right' THEN
18+
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 1, 0)
19+
WHEN 'up' THEN
20+
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, -1)
21+
WHEN 'down' THEN
22+
@@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, 1)
23+
ELSE
24+
NULL
25+
END
26+
)
2427
$$;
+21-16
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOPARENT
66
(quadbin BIGINT, resolution INT)
77
RETURNS BIGINT
88
IMMUTABLE
99
AS $$
10-
SELECT bitor(
11-
bitor(
12-
bitand(
13-
quadbin,
14-
bitnot(
15-
bitshiftleft(31, 52)
16-
)
10+
IFF(quadbin IS NULL OR resolution IS NULL OR resolution < 0 OR resolution > 26,
11+
NULL,
12+
(
13+
SELECT bitor(
14+
bitor(
15+
bitand(
16+
quadbin,
17+
bitnot(
18+
bitshiftleft(31, 52)
19+
)
20+
),
21+
bitshiftleft(resolution, 52)
1722
),
18-
bitshiftleft(resolution, 52)
19-
),
20-
bitshiftright(
21-
4503599627370495,
22-
resolution * 2
23+
bitshiftright(
24+
4503599627370495,
25+
resolution * 2
26+
)
2327
)
24-
)
28+
)
29+
)
2530
$$;

Diff for: clouds/snowflake/modules/sql/quadbin/QUADBIN_TOQUADKEY.sql

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55
CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_TOQUADKEY
66
(quadbin STRING)
@@ -20,5 +20,8 @@ CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOQUADKEY
2020
RETURNS STRING
2121
IMMUTABLE
2222
AS $$
23-
SELECT @@SF_SCHEMA@@._QUADBIN_TOQUADKEY(CAST(QUADBIN AS STRING))
23+
IFF(quadbin IS NULL,
24+
NULL,
25+
@@SF_SCHEMA@@._QUADBIN_TOQUADKEY(CAST(QUADBIN AS STRING))
26+
)
2427
$$;
+7-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
----------------------------
2-
-- Copyright (C) 2022 CARTO
3-
----------------------------
1+
--------------------------------
2+
-- Copyright (C) 2022-2023 CARTO
3+
--------------------------------
44

55

66
CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOZXY
77
(quadbin BIGINT)
88
RETURNS OBJECT
99
IMMUTABLE
1010
AS $$
11-
@@SF_SCHEMA@@._QUADBIN_TOZXY(TO_VARCHAR(QUADBIN, 'xxxxxxxxxxxxxxxx'))
11+
IFF(quadbin IS NULL,
12+
NULL,
13+
@@SF_SCHEMA@@._QUADBIN_TOZXY(TO_VARCHAR(QUADBIN, 'xxxxxxxxxxxxxxxx'))
14+
)
1215
$$;

0 commit comments

Comments
 (0)