diff --git a/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapConstructorSqlTranslation.java b/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapConstructorSqlTranslation.java new file mode 100644 index 000000000..7d55c74aa --- /dev/null +++ b/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapConstructorSqlTranslation.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2021 DataSQRL (contact@datasqrl.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.datasqrl.function.translation.postgres.builtinflink; + +import static com.datasqrl.function.CalciteFunctionUtil.lightweightOp; + +import com.datasqrl.function.translation.PostgresSqlTranslation; +import com.datasqrl.function.translation.SqlTranslation; +import com.google.auto.service.AutoService; +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlWriter; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.sql.parser.SqlParserPos; + +@AutoService(SqlTranslation.class) +public class MapConstructorSqlTranslation extends PostgresSqlTranslation { + + public MapConstructorSqlTranslation() { + super(SqlStdOperatorTable.MAP_VALUE_CONSTRUCTOR); + } + + @Override + public void unparse(SqlCall call, SqlWriter writer, int leftPrec, int rightPrec) { + // Translate MAP['k1', v1, 'k2', v2] to jsonb_build_object('k1', v1, 'k2', v2) + lightweightOp("jsonb_build_object") + .createCall(SqlParserPos.ZERO, call.getOperandList()) + .unparse(writer, leftPrec, rightPrec); + } +} diff --git a/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapElementSqlTranslation.java b/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapElementSqlTranslation.java new file mode 100644 index 000000000..1cc7394c7 --- /dev/null +++ b/sqrl-planner/src/main/java/com/datasqrl/function/translation/postgres/builtinflink/MapElementSqlTranslation.java @@ -0,0 +1,62 @@ +/* + * Copyright © 2021 DataSQRL (contact@datasqrl.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.datasqrl.function.translation.postgres.builtinflink; + +import com.datasqrl.function.translation.PostgresSqlTranslation; +import com.datasqrl.function.translation.SqlTranslation; +import com.google.auto.service.AutoService; +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlIdentifier; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlLiteral; +import org.apache.calcite.sql.SqlWriter; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.sql.type.SqlTypeName; + +@AutoService(SqlTranslation.class) +public class MapElementSqlTranslation extends PostgresSqlTranslation { + + public MapElementSqlTranslation() { + super(SqlStdOperatorTable.ITEM); + } + + @Override + public void unparse(SqlCall call, SqlWriter writer, int leftPrec, int rightPrec) { + if (call.operandCount() == 2) { + var baseOperand = call.operand(0); + var indexOrKey = call.operand(1); + + var isMapBase = + baseOperand instanceof SqlIdentifier + || baseOperand.getKind() == SqlKind.MAP_VALUE_CONSTRUCTOR; + + // Heuristic: If the index/key is a string literal, treat as map access + // Maps use string keys: map['name'], arrays use numeric indices: array[1] + var isLikelyMapAccess = + indexOrKey instanceof SqlLiteral literal && literal.getTypeName() == SqlTypeName.CHAR; + + if (isMapBase && isLikelyMapAccess) { + // Translate map['key'] to map->>'key' for PostgreSQL JSONB access + call.operand(0).unparse(writer, 0, 0); + writer.print("->>"); + call.operand(1).unparse(writer, 0, 0); + return; + } + } + + call.getOperator().unparse(writer, call, leftPrec, rightPrec); + } +} diff --git a/sqrl-testing/sqrl-testing-integration/src/test/java/com/datasqrl/FullUseCaseIT.java b/sqrl-testing/sqrl-testing-integration/src/test/java/com/datasqrl/FullUseCaseIT.java index 879258270..4b1fcac0a 100644 --- a/sqrl-testing/sqrl-testing-integration/src/test/java/com/datasqrl/FullUseCaseIT.java +++ b/sqrl-testing/sqrl-testing-integration/src/test/java/com/datasqrl/FullUseCaseIT.java @@ -49,7 +49,7 @@ public class FullUseCaseIT extends AbstractFullUseCaseTest { @Test @Disabled("Intended for manual usage") void specificUseCase() { - var pkg = USE_CASES.resolve("duckdb").resolve("package.json"); + var pkg = USE_CASES.resolve("function-translation").resolve("postgres").resolve("package.json"); var param = new UseCaseParam(pkg); fullUseCaseTest(param); diff --git a/sqrl-testing/sqrl-testing-integration/src/test/resources/snapshots/com/datasqrl/UseCaseCompileTest/postgres-package.txt b/sqrl-testing/sqrl-testing-integration/src/test/resources/snapshots/com/datasqrl/UseCaseCompileTest/postgres-package.txt index aaf4a844f..f82c7c38e 100644 --- a/sqrl-testing/sqrl-testing-integration/src/test/resources/snapshots/com/datasqrl/UseCaseCompileTest/postgres-package.txt +++ b/sqrl-testing/sqrl-testing-integration/src/test/resources/snapshots/com/datasqrl/UseCaseCompileTest/postgres-package.txt @@ -62,6 +62,7 @@ type FunctionCalls { is_decimal_example: Boolean! is_digit_example: Boolean! element_example: Int! + map_elem_access_example: Int array_contains_example: Boolean! array_prepend_example: [String]! array_concat_example: [String]! @@ -177,6 +178,7 @@ Schema: - is_decimal_example: BOOLEAN NOT NULL - is_digit_example: BOOLEAN NOT NULL - element_example: INTEGER NOT NULL + - map_elem_access_example: INTEGER - array_contains_example: BOOLEAN NOT NULL - array_prepend_example: CHAR(1) CHARACTER SET "UTF-16LE" NOT NULL ARRAY NOT NULL - array_concat_example: CHAR(1) CHARACTER SET "UTF-16LE" NOT NULL ARRAY NOT NULL @@ -218,7 +220,7 @@ SELECT * FROM (VALUES ROW(1)) AS `base` (`dummy`); CREATE VIEW `FunctionCalls` AS -SELECT `LOG2`(8) AS `log2_example`, `LOG`(10) AS `log_nat_example`, `LOG`(2, 8) AS `log_base_example`, `E`() AS `e_example`, RAND() IS NOT NULL AS `rand_example`, RAND_INTEGER(10) IS NOT NULL AS `rand_int_example`, `UUID`() IS NOT NULL AS `uuid_example`, `BIN`(10) AS `bin_example`, `HEX`(255) AS `hex_numeric_example`, `HEX`('AB') AS `hex_string_example`, `UNHEX`('4142') AS `asdasd_example`, TRUNCATE(123.456, 2) AS `truncate_scale_example`, TRUNCATE(123.456) AS `truncate_default_example`, `PRINTF`('%s %d %f %b', 'bob', 42, 0.5, TRUE) AS `printf_example`, `STARTSWITH`('FlinkSQL', 'Flink') AS `startswith_example`, `ENDSWITH`('FlinkSQL', 'SQL') AS `endswith_example`, `REGEXP_EXTRACT`('abc-123-def', '(\d+)') AS `regexp_extract_example`, `REGEXP_EXTRACT`('abc-123-def', '(\d+)', 1) AS `regexp_extract_group_example`, `REGEXP_EXTRACT_ALL`('a1b2c3', '(\d)') AS `regexp_extract_all_example`, `REGEXP_EXTRACT_ALL`('a1b2c3', '(\d)', 1) AS `regexp_extract_all_group_example`, `DECODE`(`ENCODE`('hi', 'UTF-8'), 'UTF-8') AS `decode_example`, `ENCODE`('hi', 'UTF-8') IS NOT NULL AS `encode_example`, `FROM_BASE64`(`TO_BASE64`('hello')) AS `from_base64_example`, `TO_BASE64`('hello') AS `to_base64_example`, `INSTR`('hello world', 'world') AS `instr_example`, `REGEXP`('foo123bar', '\d+') AS `regexp_example`, `SPLIT_INDEX`('a,b,c', ',', 1) AS `split_index_example`, `ELT`(2, 'first', 'second', 'third') AS `elt_example`, `NOW`() IS NOT NULL AS `now_example`, LOCALTIME IS NOT NULL AS `local_time_example`, LOCALTIMESTAMP IS NOT NULL AS `local_timestamp_example`, CURRENT_TIME IS NOT NULL AS `current_time_example`, CURRENT_DATE IS NOT NULL AS `current_date_example`, CURRENT_TIMESTAMP IS NOT NULL AS `current_timestamp_example`, YEAR(DATE '2024-01-02') AS `year_example`, QUARTER(DATE '2024-01-02') AS `quarter_example`, MONTH(DATE '2024-01-02') AS `month_example`, WEEK(DATE '2024-01-02') AS `week_example`, DAYOFYEAR(DATE '2024-01-02') AS `dayofyear_example`, DAYOFMONTH(DATE '2024-01-02') AS `dayofmonth_example`, DAYOFWEEK(DATE '2024-01-02') AS `dayofweek_example`, HOUR(TIMESTAMP '2024-01-02 03:04:05') AS `hour_example`, MINUTE(TIMESTAMP '2024-01-02 03:04:05') AS `minute_example`, SECOND(TIMESTAMP '2024-01-02 03:04:05') AS `second_example`, `CONVERT_TZ`('2024-01-02 03:04:05', 'UTC', 'America/Los_Angeles') AS `convert_tz_example`, `UNIX_TIMESTAMP`() IS NOT NULL AS `unix_timestamp_now_example`, `IF`(1 < 2, 'yes', 'no') AS `if_example`, `IFNULL`(CAST(NULL AS STRING), 'fallback') AS `ifnull_example`, `IS_ALPHA`('OnlyLetters') AS `is_alpha_example`, `IS_DECIMAL`('123.45') AS `is_decimal_example`, `IS_DIGIT`('12345') AS `is_digit_example`, ELEMENT(ARRAY[3]) AS `element_example`, `ARRAY_CONTAINS`(ARRAY[1, 2, 3], 2) AS `array_contains_example`, `ARRAY_PREPEND`(ARRAY['b', 'c'], 'a') AS `array_prepend_example`, `ARRAY_CONCAT`(ARRAY['a', 'b'], ARRAY['c', 'd'], ARRAY['e']) AS `array_concat_example`, `ARRAY_JOIN`(ARRAY['a', NULL, 'c'], '-', '') AS `array_join_example`, `SPLIT`('a|b|c', '|') AS `split_example`, `SHA1`('hello') AS `sha1_example`, `SHA224`('hello') AS `sha224_example`, `SHA256`('hello') AS `sha256_example`, `SHA384`('hello') AS `sha384_example`, `SHA512`('hello') AS `sha512_example`, 'end' AS `the_end` +SELECT `LOG2`(8) AS `log2_example`, `LOG`(10) AS `log_nat_example`, `LOG`(2, 8) AS `log_base_example`, `E`() AS `e_example`, RAND() IS NOT NULL AS `rand_example`, RAND_INTEGER(10) IS NOT NULL AS `rand_int_example`, `UUID`() IS NOT NULL AS `uuid_example`, `BIN`(10) AS `bin_example`, `HEX`(255) AS `hex_numeric_example`, `HEX`('AB') AS `hex_string_example`, `UNHEX`('4142') AS `asdasd_example`, TRUNCATE(123.456, 2) AS `truncate_scale_example`, TRUNCATE(123.456) AS `truncate_default_example`, `PRINTF`('%s %d %f %b', 'bob', 42, 0.5, TRUE) AS `printf_example`, `STARTSWITH`('FlinkSQL', 'Flink') AS `startswith_example`, `ENDSWITH`('FlinkSQL', 'SQL') AS `endswith_example`, `REGEXP_EXTRACT`('abc-123-def', '(\d+)') AS `regexp_extract_example`, `REGEXP_EXTRACT`('abc-123-def', '(\d+)', 1) AS `regexp_extract_group_example`, `REGEXP_EXTRACT_ALL`('a1b2c3', '(\d)') AS `regexp_extract_all_example`, `REGEXP_EXTRACT_ALL`('a1b2c3', '(\d)', 1) AS `regexp_extract_all_group_example`, `DECODE`(`ENCODE`('hi', 'UTF-8'), 'UTF-8') AS `decode_example`, `ENCODE`('hi', 'UTF-8') IS NOT NULL AS `encode_example`, `FROM_BASE64`(`TO_BASE64`('hello')) AS `from_base64_example`, `TO_BASE64`('hello') AS `to_base64_example`, `INSTR`('hello world', 'world') AS `instr_example`, `REGEXP`('foo123bar', '\d+') AS `regexp_example`, `SPLIT_INDEX`('a,b,c', ',', 1) AS `split_index_example`, `ELT`(2, 'first', 'second', 'third') AS `elt_example`, `NOW`() IS NOT NULL AS `now_example`, LOCALTIME IS NOT NULL AS `local_time_example`, LOCALTIMESTAMP IS NOT NULL AS `local_timestamp_example`, CURRENT_TIME IS NOT NULL AS `current_time_example`, CURRENT_DATE IS NOT NULL AS `current_date_example`, CURRENT_TIMESTAMP IS NOT NULL AS `current_timestamp_example`, YEAR(DATE '2024-01-02') AS `year_example`, QUARTER(DATE '2024-01-02') AS `quarter_example`, MONTH(DATE '2024-01-02') AS `month_example`, WEEK(DATE '2024-01-02') AS `week_example`, DAYOFYEAR(DATE '2024-01-02') AS `dayofyear_example`, DAYOFMONTH(DATE '2024-01-02') AS `dayofmonth_example`, DAYOFWEEK(DATE '2024-01-02') AS `dayofweek_example`, HOUR(TIMESTAMP '2024-01-02 03:04:05') AS `hour_example`, MINUTE(TIMESTAMP '2024-01-02 03:04:05') AS `minute_example`, SECOND(TIMESTAMP '2024-01-02 03:04:05') AS `second_example`, `CONVERT_TZ`('2024-01-02 03:04:05', 'UTC', 'America/Los_Angeles') AS `convert_tz_example`, `UNIX_TIMESTAMP`() IS NOT NULL AS `unix_timestamp_now_example`, `IF`(1 < 2, 'yes', 'no') AS `if_example`, `IFNULL`(CAST(NULL AS STRING), 'fallback') AS `ifnull_example`, `IS_ALPHA`('OnlyLetters') AS `is_alpha_example`, `IS_DECIMAL`('123.45') AS `is_decimal_example`, `IS_DIGIT`('12345') AS `is_digit_example`, ELEMENT(ARRAY[3]) AS `element_example`, MAP['a', 1, 'b', 2]['a'] AS `map_elem_access_example`, `ARRAY_CONTAINS`(ARRAY[1, 2, 3], 2) AS `array_contains_example`, `ARRAY_PREPEND`(ARRAY['b', 'c'], 'a') AS `array_prepend_example`, `ARRAY_CONCAT`(ARRAY['a', 'b'], ARRAY['c', 'd'], ARRAY['e']) AS `array_concat_example`, `ARRAY_JOIN`(ARRAY['a', NULL, 'c'], '-', '') AS `array_join_example`, `SPLIT`('a|b|c', '|') AS `split_example`, `SHA1`('hello') AS `sha1_example`, `SHA224`('hello') AS `sha224_example`, `SHA256`('hello') AS `sha256_example`, `SHA384`('hello') AS `sha384_example`, `SHA512`('hello') AS `sha512_example`, 'end' AS `the_end` FROM `_InputData`; CREATE VIEW `_ArrayData` AS @@ -230,6 +232,11 @@ CREATE VIEW `ArrayFunctions` AS SELECT LISTAGG(`val`, ',') AS `listagg_example`, ARRAY_AGG(`val`) AS `arrayagg_example` FROM `_ArrayData`; +CREATE VIEW `_MapData` +AS +SELECT MAP['name', `name`, 'city', `city`] AS `map_elems` +FROM (VALUES ROW('Alice', 'Berlin'), + ROW('Bob', 'Paris')) AS `t` (`name`, `city`); CREATE TABLE `_ArrayData_1` ( `val` CHAR(1) CHARACTER SET `UTF-16LE` NOT NULL, PRIMARY KEY (`val`) NOT ENFORCED @@ -271,7 +278,7 @@ CREATE TABLE IF NOT EXISTS "_InputData" ("dummy" INTEGER NOT NULL, "__pk_hash" I >>>postgres-views.sql CREATE OR REPLACE VIEW "ArrayFunctions"("listagg_example", "arrayagg_example") AS SELECT "string_agg"("val", ',') AS "listagg_example", ARRAY_AGG("val") AS "arrayagg_example" FROM "_ArrayData"; -CREATE OR REPLACE VIEW "FunctionCalls"("log2_example", "log_nat_example", "log_base_example", "e_example", "rand_example", "rand_int_example", "uuid_example", "bin_example", "hex_numeric_example", "hex_string_example", "asdasd_example", "truncate_scale_example", "truncate_default_example", "printf_example", "startswith_example", "endswith_example", "regexp_extract_example", "regexp_extract_group_example", "regexp_extract_all_example", "regexp_extract_all_group_example", "decode_example", "encode_example", "from_base64_example", "to_base64_example", "instr_example", "regexp_example", "split_index_example", "elt_example", "now_example", "local_time_example", "local_timestamp_example", "current_time_example", "current_date_example", "current_timestamp_example", "year_example", "quarter_example", "month_example", "week_example", "dayofyear_example", "dayofmonth_example", "dayofweek_example", "hour_example", "minute_example", "second_example", "convert_tz_example", "unix_timestamp_now_example", "if_example", "ifnull_example", "is_alpha_example", "is_decimal_example", "is_digit_example", "element_example", "array_contains_example", "array_prepend_example", "array_concat_example", "array_join_example", "split_example", "sha1_example", "sha224_example", "sha256_example", "sha384_example", "sha512_example", "the_end") AS SELECT LOG(2, 8) AS "log2_example", LN(10) AS "log_nat_example", LOG(2, 8) AS "log_base_example", EXP(1) AS "e_example", RANDOM() IS NOT NULL AS "rand_example", FLOOR(RANDOM() * 10) IS NOT NULL AS "rand_int_example", GEN_RANDOM_UUID() IS NOT NULL AS "uuid_example", TO_BIN(10) AS "bin_example", ENCODE(CONVERT_TO(255 ::text, 'UTF8'), 'hex') AS "hex_numeric_example", ENCODE(CONVERT_TO('AB' ::text, 'UTF8'), 'hex') AS "hex_string_example", CONVERT_FROM(DECODE('4142' ::text, 'hex'), 'UTF8') AS "asdasd_example", TRUNC(123.456, 2) AS "truncate_scale_example", TRUNC(123.456) AS "truncate_default_example", FORMAT('%s %s %s %s', 'bob', 42, 0.5, TRUE) AS "printf_example", STARTS_WITH('FlinkSQL', 'Flink') AS "startswith_example", RIGHT('FlinkSQL', CHAR_LENGTH('SQL')) = 'SQL' AS "endswith_example", REGEXP_SUBSTR('abc-123-def', '(\d+)') AS "regexp_extract_example", (REGEXP_MATCH('abc-123-def', '(\d+)'))[1] AS "regexp_extract_group_example", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\d)', 'g') AS m) AS "regexp_extract_all_example", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\d)', 'g') AS m) AS "regexp_extract_all_group_example", CONVERT_FROM(CONVERT_TO('hi', 'UTF-8'), 'UTF-8') AS "decode_example", CONVERT_TO('hi', 'UTF-8') IS NOT NULL AS "encode_example", CONVERT_FROM(DECODE(ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64'), 'base64'), 'UTF8') AS "from_base64_example", ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64') AS "to_base64_example", STRPOS('hello world', 'world') AS "instr_example", REGEXP_LIKE('foo123bar', '\d+') AS "regexp_example", SPLIT_PART('a,b,c', ',', 2) AS "split_index_example", (ARRAY['first', 'second', 'third'])[3] AS "elt_example", NOW() IS NOT NULL AS "now_example", LOCALTIME(0)IS NOT NULL AS "local_time_example", LOCALTIMESTAMP(3)IS NOT NULL AS "local_timestamp_example", LOCALTIME(0)IS NOT NULL AS "current_time_example", CURRENT_DATE IS NOT NULL AS "current_date_example", CURRENT_TIMESTAMP(3)IS NOT NULL AS "current_timestamp_example", EXTRACT(YEAR FROM DATE '2024-01-02') AS "year_example", EXTRACT(QUARTER FROM DATE '2024-01-02') AS "quarter_example", EXTRACT(MONTH FROM DATE '2024-01-02') AS "month_example", EXTRACT(WEEK FROM DATE '2024-01-02') AS "week_example", EXTRACT(DOY FROM DATE '2024-01-02') AS "dayofyear_example", EXTRACT(DAY FROM DATE '2024-01-02') AS "dayofmonth_example", EXTRACT(DOW FROM DATE '2024-01-02') + 1 AS "dayofweek_example", EXTRACT(HOUR FROM TIMESTAMP '2024-01-02 03:04:05') AS "hour_example", EXTRACT(MINUTE FROM TIMESTAMP '2024-01-02 03:04:05') AS "minute_example", EXTRACT(SECOND FROM TIMESTAMP '2024-01-02 03:04:05') AS "second_example", (TIMESTAMP '2024-01-02 03:04:05' AT TIME ZONE 'UTC') AT TIME ZONE 'America/Los_Angeles' AS "convert_tz_example", (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) ::bigint)IS NOT NULL AS "unix_timestamp_now_example", CASE WHEN TRUE THEN 'yes' ELSE 'no' END AS "if_example", COALESCE(NULL, 'fallback') AS "ifnull_example", ('OnlyLetters' ~ '^[A-Za-z]+$') AS "is_alpha_example", '123.45' ~ '^[+-]?[0-9]+(\.[0-9]+)?$' AS "is_decimal_example", ('12345' ~ '^[0-9]+$') AS "is_digit_example", CASE WHEN CARDINALITY(ARRAY[3]) = 1 THEN (ARRAY[3])[1] ELSE NULL END AS "element_example", 2 = ANY (ARRAY[1, 2, 3]) AS "array_contains_example", ARRAY_PREPEND('a', ARRAY['b', 'c']) AS "array_prepend_example", "array_cat"("array_cat"(ARRAY['a', 'b'], ARRAY['c', 'd']), ARRAY['e']) AS "array_concat_example", ARRAY_TO_STRING(ARRAY['a', NULL, 'c'], '-', '') AS "array_join_example", STRING_TO_ARRAY('a|b|c', '|') AS "split_example", ENCODE(DIGEST('hello', 'sha1'), 'hex') AS "sha1_example", ENCODE(DIGEST('hello', 'sha224'), 'hex') AS "sha224_example", ENCODE(DIGEST('hello', 'sha256'), 'hex') AS "sha256_example", ENCODE(DIGEST('hello', 'sha384'), 'hex') AS "sha384_example", ENCODE(DIGEST('hello', 'sha512'), 'hex') AS "sha512_example", 'end' AS "the_end" +CREATE OR REPLACE VIEW "FunctionCalls"("log2_example", "log_nat_example", "log_base_example", "e_example", "rand_example", "rand_int_example", "uuid_example", "bin_example", "hex_numeric_example", "hex_string_example", "asdasd_example", "truncate_scale_example", "truncate_default_example", "printf_example", "startswith_example", "endswith_example", "regexp_extract_example", "regexp_extract_group_example", "regexp_extract_all_example", "regexp_extract_all_group_example", "decode_example", "encode_example", "from_base64_example", "to_base64_example", "instr_example", "regexp_example", "split_index_example", "elt_example", "now_example", "local_time_example", "local_timestamp_example", "current_time_example", "current_date_example", "current_timestamp_example", "year_example", "quarter_example", "month_example", "week_example", "dayofyear_example", "dayofmonth_example", "dayofweek_example", "hour_example", "minute_example", "second_example", "convert_tz_example", "unix_timestamp_now_example", "if_example", "ifnull_example", "is_alpha_example", "is_decimal_example", "is_digit_example", "element_example", "map_elem_access_example", "array_contains_example", "array_prepend_example", "array_concat_example", "array_join_example", "split_example", "sha1_example", "sha224_example", "sha256_example", "sha384_example", "sha512_example", "the_end") AS SELECT LOG(2, 8) AS "log2_example", LN(10) AS "log_nat_example", LOG(2, 8) AS "log_base_example", EXP(1) AS "e_example", RANDOM() IS NOT NULL AS "rand_example", FLOOR(RANDOM() * 10) IS NOT NULL AS "rand_int_example", GEN_RANDOM_UUID() IS NOT NULL AS "uuid_example", TO_BIN(10) AS "bin_example", ENCODE(CONVERT_TO(255 ::text, 'UTF8'), 'hex') AS "hex_numeric_example", ENCODE(CONVERT_TO('AB' ::text, 'UTF8'), 'hex') AS "hex_string_example", CONVERT_FROM(DECODE('4142' ::text, 'hex'), 'UTF8') AS "asdasd_example", TRUNC(123.456, 2) AS "truncate_scale_example", TRUNC(123.456) AS "truncate_default_example", FORMAT('%s %s %s %s', 'bob', 42, 0.5, TRUE) AS "printf_example", STARTS_WITH('FlinkSQL', 'Flink') AS "startswith_example", RIGHT('FlinkSQL', CHAR_LENGTH('SQL')) = 'SQL' AS "endswith_example", REGEXP_SUBSTR('abc-123-def', '(\d+)') AS "regexp_extract_example", (REGEXP_MATCH('abc-123-def', '(\d+)'))[1] AS "regexp_extract_group_example", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\d)', 'g') AS m) AS "regexp_extract_all_example", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\d)', 'g') AS m) AS "regexp_extract_all_group_example", CONVERT_FROM(CONVERT_TO('hi', 'UTF-8'), 'UTF-8') AS "decode_example", CONVERT_TO('hi', 'UTF-8') IS NOT NULL AS "encode_example", CONVERT_FROM(DECODE(ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64'), 'base64'), 'UTF8') AS "from_base64_example", ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64') AS "to_base64_example", STRPOS('hello world', 'world') AS "instr_example", REGEXP_LIKE('foo123bar', '\d+') AS "regexp_example", SPLIT_PART('a,b,c', ',', 2) AS "split_index_example", (ARRAY['first', 'second', 'third'])[3] AS "elt_example", NOW() IS NOT NULL AS "now_example", LOCALTIME(0)IS NOT NULL AS "local_time_example", LOCALTIMESTAMP(3)IS NOT NULL AS "local_timestamp_example", LOCALTIME(0)IS NOT NULL AS "current_time_example", CURRENT_DATE IS NOT NULL AS "current_date_example", CURRENT_TIMESTAMP(3)IS NOT NULL AS "current_timestamp_example", EXTRACT(YEAR FROM DATE '2024-01-02') AS "year_example", EXTRACT(QUARTER FROM DATE '2024-01-02') AS "quarter_example", EXTRACT(MONTH FROM DATE '2024-01-02') AS "month_example", EXTRACT(WEEK FROM DATE '2024-01-02') AS "week_example", EXTRACT(DOY FROM DATE '2024-01-02') AS "dayofyear_example", EXTRACT(DAY FROM DATE '2024-01-02') AS "dayofmonth_example", EXTRACT(DOW FROM DATE '2024-01-02') + 1 AS "dayofweek_example", EXTRACT(HOUR FROM TIMESTAMP '2024-01-02 03:04:05') AS "hour_example", EXTRACT(MINUTE FROM TIMESTAMP '2024-01-02 03:04:05') AS "minute_example", EXTRACT(SECOND FROM TIMESTAMP '2024-01-02 03:04:05') AS "second_example", (TIMESTAMP '2024-01-02 03:04:05' AT TIME ZONE 'UTC') AT TIME ZONE 'America/Los_Angeles' AS "convert_tz_example", (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) ::bigint)IS NOT NULL AS "unix_timestamp_now_example", CASE WHEN TRUE THEN 'yes' ELSE 'no' END AS "if_example", COALESCE(NULL, 'fallback') AS "ifnull_example", ('OnlyLetters' ~ '^[A-Za-z]+$') AS "is_alpha_example", '123.45' ~ '^[+-]?[0-9]+(\.[0-9]+)?$' AS "is_decimal_example", ('12345' ~ '^[0-9]+$') AS "is_digit_example", CASE WHEN CARDINALITY(ARRAY[3]) = 1 THEN (ARRAY[3])[1] ELSE NULL END AS "element_example", "jsonb_build_object"('a', 1, 'b', 2) ->>'a' AS "map_elem_access_example", 2 = ANY (ARRAY[1, 2, 3]) AS "array_contains_example", ARRAY_PREPEND('a', ARRAY['b', 'c']) AS "array_prepend_example", "array_cat"("array_cat"(ARRAY['a', 'b'], ARRAY['c', 'd']), ARRAY['e']) AS "array_concat_example", ARRAY_TO_STRING(ARRAY['a', NULL, 'c'], '-', '') AS "array_join_example", STRING_TO_ARRAY('a|b|c', '|') AS "split_example", ENCODE(DIGEST('hello', 'sha1'), 'hex') AS "sha1_example", ENCODE(DIGEST('hello', 'sha224'), 'hex') AS "sha224_example", ENCODE(DIGEST('hello', 'sha256'), 'hex') AS "sha256_example", ENCODE(DIGEST('hello', 'sha384'), 'hex') AS "sha384_example", ENCODE(DIGEST('hello', 'sha512'), 'hex') AS "sha512_example", 'end' AS "the_end" FROM "_InputData" >>>vertx.json { @@ -320,7 +327,7 @@ FROM "_InputData" ], "query" : { "type" : "SqlQuery", - "sql" : "SELECT LOG(2, 8) AS \"log2_example\", LN(10) AS \"log_nat_example\", LOG(2, 8) AS \"log_base_example\", EXP(1) AS \"e_example\", RANDOM() IS NOT NULL AS \"rand_example\", FLOOR(RANDOM() * 10) IS NOT NULL AS \"rand_int_example\", GEN_RANDOM_UUID() IS NOT NULL AS \"uuid_example\", TO_BIN(10) AS \"bin_example\", ENCODE(CONVERT_TO(255 ::text, 'UTF8'), 'hex') AS \"hex_numeric_example\", ENCODE(CONVERT_TO('AB' ::text, 'UTF8'), 'hex') AS \"hex_string_example\", CONVERT_FROM(DECODE('4142' ::text, 'hex'), 'UTF8') AS \"asdasd_example\", TRUNC(123.456, 2) AS \"truncate_scale_example\", TRUNC(123.456) AS \"truncate_default_example\", FORMAT('%s %s %s %s', 'bob', 42, 0.5, TRUE) AS \"printf_example\", STARTS_WITH('FlinkSQL', 'Flink') AS \"startswith_example\", RIGHT('FlinkSQL', CHAR_LENGTH('SQL')) = 'SQL' AS \"endswith_example\", REGEXP_SUBSTR('abc-123-def', '(\\d+)') AS \"regexp_extract_example\", (REGEXP_MATCH('abc-123-def', '(\\d+)'))[1] AS \"regexp_extract_group_example\", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\\d)', 'g') AS m) AS \"regexp_extract_all_example\", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\\d)', 'g') AS m) AS \"regexp_extract_all_group_example\", CONVERT_FROM(CONVERT_TO('hi', 'UTF-8'), 'UTF-8') AS \"decode_example\", CONVERT_TO('hi', 'UTF-8') IS NOT NULL AS \"encode_example\", CONVERT_FROM(DECODE(ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64'), 'base64'), 'UTF8') AS \"from_base64_example\", ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64') AS \"to_base64_example\", STRPOS('hello world', 'world') AS \"instr_example\", REGEXP_LIKE('foo123bar', '\\d+') AS \"regexp_example\", SPLIT_PART('a,b,c', ',', 2) AS \"split_index_example\", (ARRAY['first', 'second', 'third'])[3] AS \"elt_example\", NOW() IS NOT NULL AS \"now_example\", LOCALTIME(0)IS NOT NULL AS \"local_time_example\", LOCALTIMESTAMP(3)IS NOT NULL AS \"local_timestamp_example\", LOCALTIME(0)IS NOT NULL AS \"current_time_example\", CURRENT_DATE IS NOT NULL AS \"current_date_example\", CURRENT_TIMESTAMP(3)IS NOT NULL AS \"current_timestamp_example\", EXTRACT(YEAR FROM DATE '2024-01-02') AS \"year_example\", EXTRACT(QUARTER FROM DATE '2024-01-02') AS \"quarter_example\", EXTRACT(MONTH FROM DATE '2024-01-02') AS \"month_example\", EXTRACT(WEEK FROM DATE '2024-01-02') AS \"week_example\", EXTRACT(DOY FROM DATE '2024-01-02') AS \"dayofyear_example\", EXTRACT(DAY FROM DATE '2024-01-02') AS \"dayofmonth_example\", EXTRACT(DOW FROM DATE '2024-01-02') + 1 AS \"dayofweek_example\", EXTRACT(HOUR FROM TIMESTAMP '2024-01-02 03:04:05') AS \"hour_example\", EXTRACT(MINUTE FROM TIMESTAMP '2024-01-02 03:04:05') AS \"minute_example\", EXTRACT(SECOND FROM TIMESTAMP '2024-01-02 03:04:05') AS \"second_example\", (TIMESTAMP '2024-01-02 03:04:05' AT TIME ZONE 'UTC') AT TIME ZONE 'America/Los_Angeles' AS \"convert_tz_example\", (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) ::bigint)IS NOT NULL AS \"unix_timestamp_now_example\", CASE WHEN TRUE THEN 'yes' ELSE 'no' END AS \"if_example\", COALESCE(NULL, 'fallback') AS \"ifnull_example\", ('OnlyLetters' ~ '^[A-Za-z]+$') AS \"is_alpha_example\", '123.45' ~ '^[+-]?[0-9]+(\\.[0-9]+)?$' AS \"is_decimal_example\", ('12345' ~ '^[0-9]+$') AS \"is_digit_example\", CASE WHEN CARDINALITY(ARRAY[3]) = 1 THEN (ARRAY[3])[1] ELSE NULL END AS \"element_example\", 2 = ANY (ARRAY[1, 2, 3]) AS \"array_contains_example\", ARRAY_PREPEND('a', ARRAY['b', 'c']) AS \"array_prepend_example\", \"array_cat\"(\"array_cat\"(ARRAY['a', 'b'], ARRAY['c', 'd']), ARRAY['e']) AS \"array_concat_example\", ARRAY_TO_STRING(ARRAY['a', NULL, 'c'], '-', '') AS \"array_join_example\", STRING_TO_ARRAY('a|b|c', '|') AS \"split_example\", ENCODE(DIGEST('hello', 'sha1'), 'hex') AS \"sha1_example\", ENCODE(DIGEST('hello', 'sha224'), 'hex') AS \"sha224_example\", ENCODE(DIGEST('hello', 'sha256'), 'hex') AS \"sha256_example\", ENCODE(DIGEST('hello', 'sha384'), 'hex') AS \"sha384_example\", ENCODE(DIGEST('hello', 'sha512'), 'hex') AS \"sha512_example\", 'end' AS \"the_end\"\nFROM \"_InputData\"", + "sql" : "SELECT LOG(2, 8) AS \"log2_example\", LN(10) AS \"log_nat_example\", LOG(2, 8) AS \"log_base_example\", EXP(1) AS \"e_example\", RANDOM() IS NOT NULL AS \"rand_example\", FLOOR(RANDOM() * 10) IS NOT NULL AS \"rand_int_example\", GEN_RANDOM_UUID() IS NOT NULL AS \"uuid_example\", TO_BIN(10) AS \"bin_example\", ENCODE(CONVERT_TO(255 ::text, 'UTF8'), 'hex') AS \"hex_numeric_example\", ENCODE(CONVERT_TO('AB' ::text, 'UTF8'), 'hex') AS \"hex_string_example\", CONVERT_FROM(DECODE('4142' ::text, 'hex'), 'UTF8') AS \"asdasd_example\", TRUNC(123.456, 2) AS \"truncate_scale_example\", TRUNC(123.456) AS \"truncate_default_example\", FORMAT('%s %s %s %s', 'bob', 42, 0.5, TRUE) AS \"printf_example\", STARTS_WITH('FlinkSQL', 'Flink') AS \"startswith_example\", RIGHT('FlinkSQL', CHAR_LENGTH('SQL')) = 'SQL' AS \"endswith_example\", REGEXP_SUBSTR('abc-123-def', '(\\d+)') AS \"regexp_extract_example\", (REGEXP_MATCH('abc-123-def', '(\\d+)'))[1] AS \"regexp_extract_group_example\", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\\d)', 'g') AS m) AS \"regexp_extract_all_example\", ARRAY (SELECT m[1] FROM REGEXP_MATCHES('a1b2c3', '(\\d)', 'g') AS m) AS \"regexp_extract_all_group_example\", CONVERT_FROM(CONVERT_TO('hi', 'UTF-8'), 'UTF-8') AS \"decode_example\", CONVERT_TO('hi', 'UTF-8') IS NOT NULL AS \"encode_example\", CONVERT_FROM(DECODE(ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64'), 'base64'), 'UTF8') AS \"from_base64_example\", ENCODE(CONVERT_TO('hello', 'UTF8'), 'base64') AS \"to_base64_example\", STRPOS('hello world', 'world') AS \"instr_example\", REGEXP_LIKE('foo123bar', '\\d+') AS \"regexp_example\", SPLIT_PART('a,b,c', ',', 2) AS \"split_index_example\", (ARRAY['first', 'second', 'third'])[3] AS \"elt_example\", NOW() IS NOT NULL AS \"now_example\", LOCALTIME(0)IS NOT NULL AS \"local_time_example\", LOCALTIMESTAMP(3)IS NOT NULL AS \"local_timestamp_example\", LOCALTIME(0)IS NOT NULL AS \"current_time_example\", CURRENT_DATE IS NOT NULL AS \"current_date_example\", CURRENT_TIMESTAMP(3)IS NOT NULL AS \"current_timestamp_example\", EXTRACT(YEAR FROM DATE '2024-01-02') AS \"year_example\", EXTRACT(QUARTER FROM DATE '2024-01-02') AS \"quarter_example\", EXTRACT(MONTH FROM DATE '2024-01-02') AS \"month_example\", EXTRACT(WEEK FROM DATE '2024-01-02') AS \"week_example\", EXTRACT(DOY FROM DATE '2024-01-02') AS \"dayofyear_example\", EXTRACT(DAY FROM DATE '2024-01-02') AS \"dayofmonth_example\", EXTRACT(DOW FROM DATE '2024-01-02') + 1 AS \"dayofweek_example\", EXTRACT(HOUR FROM TIMESTAMP '2024-01-02 03:04:05') AS \"hour_example\", EXTRACT(MINUTE FROM TIMESTAMP '2024-01-02 03:04:05') AS \"minute_example\", EXTRACT(SECOND FROM TIMESTAMP '2024-01-02 03:04:05') AS \"second_example\", (TIMESTAMP '2024-01-02 03:04:05' AT TIME ZONE 'UTC') AT TIME ZONE 'America/Los_Angeles' AS \"convert_tz_example\", (EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) ::bigint)IS NOT NULL AS \"unix_timestamp_now_example\", CASE WHEN TRUE THEN 'yes' ELSE 'no' END AS \"if_example\", COALESCE(NULL, 'fallback') AS \"ifnull_example\", ('OnlyLetters' ~ '^[A-Za-z]+$') AS \"is_alpha_example\", '123.45' ~ '^[+-]?[0-9]+(\\.[0-9]+)?$' AS \"is_decimal_example\", ('12345' ~ '^[0-9]+$') AS \"is_digit_example\", CASE WHEN CARDINALITY(ARRAY[3]) = 1 THEN (ARRAY[3])[1] ELSE NULL END AS \"element_example\", \"jsonb_build_object\"('a', 1, 'b', 2) ->>'a' AS \"map_elem_access_example\", 2 = ANY (ARRAY[1, 2, 3]) AS \"array_contains_example\", ARRAY_PREPEND('a', ARRAY['b', 'c']) AS \"array_prepend_example\", \"array_cat\"(\"array_cat\"(ARRAY['a', 'b'], ARRAY['c', 'd']), ARRAY['e']) AS \"array_concat_example\", ARRAY_TO_STRING(ARRAY['a', NULL, 'c'], '-', '') AS \"array_join_example\", STRING_TO_ARRAY('a|b|c', '|') AS \"split_example\", ENCODE(DIGEST('hello', 'sha1'), 'hex') AS \"sha1_example\", ENCODE(DIGEST('hello', 'sha224'), 'hex') AS \"sha224_example\", ENCODE(DIGEST('hello', 'sha256'), 'hex') AS \"sha256_example\", ENCODE(DIGEST('hello', 'sha384'), 'hex') AS \"sha384_example\", ENCODE(DIGEST('hello', 'sha512'), 'hex') AS \"sha512_example\", 'end' AS \"the_end\"\nFROM \"_InputData\"", "parameters" : [ ], "pagination" : "LIMIT_AND_OFFSET", "cacheDurationMs" : 0, @@ -376,7 +383,7 @@ FROM "_InputData" }, "format" : "JSON", "apiQuery" : { - "query" : "query FunctionCalls($limit: Int = 10, $offset: Int = 0) {\nFunctionCalls(limit: $limit, offset: $offset) {\nlog2_example\nlog_nat_example\nlog_base_example\ne_example\nrand_example\nrand_int_example\nuuid_example\nbin_example\nhex_numeric_example\nhex_string_example\ntruncate_scale_example\ntruncate_default_example\nprintf_example\nstartswith_example\nendswith_example\nregexp_extract_example\nregexp_extract_group_example\nregexp_extract_all_example\nregexp_extract_all_group_example\ndecode_example\nencode_example\nfrom_base64_example\nto_base64_example\ninstr_example\nregexp_example\nsplit_index_example\nelt_example\nnow_example\nlocal_time_example\nlocal_timestamp_example\ncurrent_time_example\ncurrent_date_example\ncurrent_timestamp_example\nyear_example\nquarter_example\nmonth_example\nweek_example\ndayofyear_example\ndayofmonth_example\ndayofweek_example\nhour_example\nminute_example\nsecond_example\nconvert_tz_example\nunix_timestamp_now_example\nif_example\nifnull_example\nis_alpha_example\nis_decimal_example\nis_digit_example\nelement_example\narray_contains_example\narray_prepend_example\narray_concat_example\narray_join_example\nsplit_example\nsha1_example\nsha224_example\nsha256_example\nsha384_example\nsha512_example\nthe_end\n}\n\n}", + "query" : "query FunctionCalls($limit: Int = 10, $offset: Int = 0) {\nFunctionCalls(limit: $limit, offset: $offset) {\nlog2_example\nlog_nat_example\nlog_base_example\ne_example\nrand_example\nrand_int_example\nuuid_example\nbin_example\nhex_numeric_example\nhex_string_example\ntruncate_scale_example\ntruncate_default_example\nprintf_example\nstartswith_example\nendswith_example\nregexp_extract_example\nregexp_extract_group_example\nregexp_extract_all_example\nregexp_extract_all_group_example\ndecode_example\nencode_example\nfrom_base64_example\nto_base64_example\ninstr_example\nregexp_example\nsplit_index_example\nelt_example\nnow_example\nlocal_time_example\nlocal_timestamp_example\ncurrent_time_example\ncurrent_date_example\ncurrent_timestamp_example\nyear_example\nquarter_example\nmonth_example\nweek_example\ndayofyear_example\ndayofmonth_example\ndayofweek_example\nhour_example\nminute_example\nsecond_example\nconvert_tz_example\nunix_timestamp_now_example\nif_example\nifnull_example\nis_alpha_example\nis_decimal_example\nis_digit_example\nelement_example\nmap_elem_access_example\narray_contains_example\narray_prepend_example\narray_concat_example\narray_join_example\nsplit_example\nsha1_example\nsha224_example\nsha256_example\nsha384_example\nsha512_example\nthe_end\n}\n\n}", "queryName" : "FunctionCalls", "operationType" : "QUERY" }, @@ -387,7 +394,7 @@ FROM "_InputData" ], "schema" : { "type" : "string", - "schema" : "type ArrayFunctions {\n listagg_example: String!\n arrayagg_example: [String]!\n}\n\n\"An RFC-3339 compliant Full Date Scalar\"\nscalar Date\n\n\"A DateTime scalar that handles both full RFC3339 and shorter timestamp formats\"\nscalar DateTime\n\ntype FunctionCalls {\n log2_example: Float!\n log_nat_example: Float!\n log_base_example: Float!\n e_example: Float!\n rand_example: Boolean!\n rand_int_example: Boolean!\n uuid_example: Boolean!\n bin_example: String!\n hex_numeric_example: String!\n hex_string_example: String!\n truncate_scale_example: Float!\n truncate_default_example: Float!\n printf_example: String\n startswith_example: Boolean!\n endswith_example: Boolean!\n regexp_extract_example: String\n regexp_extract_group_example: String\n regexp_extract_all_example: [String]\n regexp_extract_all_group_example: [String]\n decode_example: String!\n encode_example: Boolean!\n from_base64_example: String!\n to_base64_example: String!\n instr_example: Int!\n regexp_example: Boolean!\n split_index_example: String\n elt_example: String\n now_example: Boolean!\n local_time_example: Boolean!\n local_timestamp_example: Boolean!\n current_time_example: Boolean!\n current_date_example: Boolean!\n current_timestamp_example: Boolean!\n year_example: Long!\n quarter_example: Long!\n month_example: Long!\n week_example: Long!\n dayofyear_example: Long!\n dayofmonth_example: Long!\n dayofweek_example: Long!\n hour_example: Long!\n minute_example: Long!\n second_example: Long!\n convert_tz_example: String\n unix_timestamp_now_example: Boolean!\n if_example: String!\n ifnull_example: String!\n is_alpha_example: Boolean!\n is_decimal_example: Boolean!\n is_digit_example: Boolean!\n element_example: Int!\n array_contains_example: Boolean!\n array_prepend_example: [String]!\n array_concat_example: [String]!\n array_join_example: String!\n split_example: [String]\n sha1_example: String!\n sha224_example: String!\n sha256_example: String!\n sha384_example: String!\n sha512_example: String!\n the_end: String!\n}\n\n\"A JSON scalar\"\nscalar JSON\n\n\"24-hour clock time value string in the format `hh:mm:ss` or `hh:mm:ss.sss`.\"\nscalar LocalTime\n\n\"A 64-bit signed integer\"\nscalar Long\n\ntype Query {\n ArrayFunctions(limit: Int = 10, offset: Int = 0): [ArrayFunctions!]\n FunctionCalls(limit: Int = 10, offset: Int = 0): [FunctionCalls!]\n}\n\nenum _McpMethodType {\n NONE\n TOOL\n RESOURCE\n}\n\nenum _RestMethodType {\n NONE\n GET\n POST\n}\n\ndirective @api(mcp: _McpMethodType, rest: _RestMethodType, uri: String) on QUERY | MUTATION | FIELD_DEFINITION\n" + "schema" : "type ArrayFunctions {\n listagg_example: String!\n arrayagg_example: [String]!\n}\n\n\"An RFC-3339 compliant Full Date Scalar\"\nscalar Date\n\n\"A DateTime scalar that handles both full RFC3339 and shorter timestamp formats\"\nscalar DateTime\n\ntype FunctionCalls {\n log2_example: Float!\n log_nat_example: Float!\n log_base_example: Float!\n e_example: Float!\n rand_example: Boolean!\n rand_int_example: Boolean!\n uuid_example: Boolean!\n bin_example: String!\n hex_numeric_example: String!\n hex_string_example: String!\n truncate_scale_example: Float!\n truncate_default_example: Float!\n printf_example: String\n startswith_example: Boolean!\n endswith_example: Boolean!\n regexp_extract_example: String\n regexp_extract_group_example: String\n regexp_extract_all_example: [String]\n regexp_extract_all_group_example: [String]\n decode_example: String!\n encode_example: Boolean!\n from_base64_example: String!\n to_base64_example: String!\n instr_example: Int!\n regexp_example: Boolean!\n split_index_example: String\n elt_example: String\n now_example: Boolean!\n local_time_example: Boolean!\n local_timestamp_example: Boolean!\n current_time_example: Boolean!\n current_date_example: Boolean!\n current_timestamp_example: Boolean!\n year_example: Long!\n quarter_example: Long!\n month_example: Long!\n week_example: Long!\n dayofyear_example: Long!\n dayofmonth_example: Long!\n dayofweek_example: Long!\n hour_example: Long!\n minute_example: Long!\n second_example: Long!\n convert_tz_example: String\n unix_timestamp_now_example: Boolean!\n if_example: String!\n ifnull_example: String!\n is_alpha_example: Boolean!\n is_decimal_example: Boolean!\n is_digit_example: Boolean!\n element_example: Int!\n map_elem_access_example: Int\n array_contains_example: Boolean!\n array_prepend_example: [String]!\n array_concat_example: [String]!\n array_join_example: String!\n split_example: [String]\n sha1_example: String!\n sha224_example: String!\n sha256_example: String!\n sha384_example: String!\n sha512_example: String!\n the_end: String!\n}\n\n\"A JSON scalar\"\nscalar JSON\n\n\"24-hour clock time value string in the format `hh:mm:ss` or `hh:mm:ss.sss`.\"\nscalar LocalTime\n\n\"A 64-bit signed integer\"\nscalar Long\n\ntype Query {\n ArrayFunctions(limit: Int = 10, offset: Int = 0): [ArrayFunctions!]\n FunctionCalls(limit: Int = 10, offset: Int = 0): [FunctionCalls!]\n}\n\nenum _McpMethodType {\n NONE\n TOOL\n RESOURCE\n}\n\nenum _RestMethodType {\n NONE\n GET\n POST\n}\n\ndirective @api(mcp: _McpMethodType, rest: _RestMethodType, uri: String) on QUERY | MUTATION | FIELD_DEFINITION\n" } } } diff --git a/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/pg-translation.sqrl b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/pg-translation.sqrl index ae9d63bdb..a47577db6 100644 --- a/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/pg-translation.sqrl +++ b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/pg-translation.sqrl @@ -83,7 +83,7 @@ FunctionCalls := SELECT ELEMENT(ARRAY[3]) AS element_example, -- CARDINALITY(MAP['a', 1, 'b', 2]) AS cardinality_example, --- MAP['a', 1, 'b', 2]['a'] AS map_index_example, + MAP['a', 1, 'b', 2]['a'] AS map_elem_access_example, ARRAY_CONTAINS(ARRAY[1, 2, 3], 2) AS array_contains_example, -- ARRAY_DISTINCT(ARRAY['a', 'b', 'b', 'c']) AS array_distinct_example, ARRAY_PREPEND(ARRAY['b', 'c'], 'a') AS array_prepend_example, @@ -141,3 +141,11 @@ ArrayFunctionsTest := ARRAY_POSITION(arrayagg_example, 'y') IS NOT NULL AS array_has_y, ARRAY_POSITION(arrayagg_example, 'z') IS NOT NULL AS array_has_z FROM ArrayFunctions; + +/*+engine(postgres)*/ +_MapData := SELECT MAP['name', name,'city', city] AS map_elems + FROM (VALUES ('Alice', 'Berlin'), ('Bob', 'Paris')) AS t(name, city); + +/*+test */ +MapTest := + SELECT map_elems['name'] AS elem_name FROM _MapData; diff --git a/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/FunctionCallsTest.snapshot b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/FunctionCallsTest.snapshot index 43517373f..17061cd14 100644 --- a/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/FunctionCallsTest.snapshot +++ b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/FunctionCallsTest.snapshot @@ -52,6 +52,7 @@ "is_decimal_example" : true, "is_digit_example" : true, "element_example" : 3, + "map_elem_access_example" : 1, "array_contains_example" : true, "array_prepend_example" : [ "a", "b", "c" ], "array_concat_example" : [ "a", "b", "c", "d", "e" ], diff --git a/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/MapTest.snapshot b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/MapTest.snapshot new file mode 100644 index 000000000..6443ffc8a --- /dev/null +++ b/sqrl-testing/sqrl-testing-integration/src/test/resources/usecases/function-translation/postgres/snapshots/MapTest.snapshot @@ -0,0 +1,9 @@ +{ + "data" : { + "MapTest" : [ { + "elem_name" : "Alice" + }, { + "elem_name" : "Bob" + } ] + } +} \ No newline at end of file