Как позволить функции приведения в ignite возвращать ноль вместо генерирования исключения? - PullRequest
0 голосов
/ 15 января 2019

Когда я использую функцию ignate cast, когда исходные данные не могут быть преобразованы в целевой тип, то ignite вызовет это исключение:

javax.cache.CacheException: Не удалось выполнить запрос карты удаленно. Не удалось выполнить запрос карты на узле: 3ed8c3f3-31d3-4e18-a41c-83e2b6d4bf4a, класс org.apache.ignite.IgniteCheckedException: Не удалось выполнить запрос SQL. Невозможно проанализировать константу "DATE" "xxxx";

Но мне нужно использовать null вместо этого, когда он не может быть конвертирован, как база данных Postgresql.

Что мне делать?

Версия Ignite: 2.6, версия JDBC: 2.5

SELECT CAST(city AS DATE) AS `a1` FROM orders GROUP BY CAST(city AS DATE);

Ожидаемое:

a1

Null

Фактически:

java.sql.SQLException: javax.cache.CacheException: Failed to run map query remotely.Failed to execute map query on the node: 3ed8c3f3-31d3-4e18-a41c-83e2b6d4bf4a, class org.apache.ignite.IgniteCheckedException:Failed to execute SQL query. Cannot parse "DATE" constant "xxxx"; SQL statement:
SELECT
CAST(__Z0.city AS DATE) __C0_0
FROM PUBLIC.ORDERS2 __Z0
GROUP BY CAST(__Z0.city AS DATE) LIMIT 3 [22007-195]
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.sendRequest(JdbcThinConnection.java:751)
at org.apache.ignite.internal.jdbc.thin.JdbcThinStatement.execute0(JdbcThinStatement.java:210)
at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeWithArguments(JdbcThinPreparedStatement.java:252)
at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeQuery(JdbcThinPreparedStatement.java:78)
at com.uniplore.calculation.connectors.IgniteConnector.execute(IgniteConnector.java:58)
at tests.AbstractFunctionTransTest.getResult(AbstractFunctionTransTest.java:65)
at tests.IgniteFunctionTransTest.Date(IgniteFunctionTransTest.java:840)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Хорошо, я знаю, CAST - это стандартная функция, которая должна возвращать исключения.

Mysql имеет функцию с именем DATE, которая может возвращать значения NULL, когда преобразование завершается неудачно , за исключением того, что у ignite нет соответствующей функции.

Лучший способ - вернуть ошибку пользователю или разрешить пользователю использовать вместо нее функцию PARSEDATETIME.

0 голосов
/ 15 января 2019

Так ли работает PostgreSQL CAST? Этот пост отчасти предполагает иное.

В любом случае вы не можете изменить это поведение в Ignite. Если вы используете то же значение xxxx в качестве даты-заполнителя, вы можете использовать CASE в качестве обходного пути:

SELECT CASE WHEN city = 'xxxx' THEN NULL ELSE CAST(city AS DATE) END AS a1 
FROM orders GROUP BY a1
...