Я пытаюсь выполнить «toUnixTimestamp(now())» для таблицы system.local (AstraDB Serverless).
Он отлично работает, когда я выполняю его в консоли AstraDB CQL: SELECT toUnixTimestamp(now()) FROM
system.local
;
Проблема в том, что я не могу успешно выполнить ее с помощью Astra CLI или Java-драйвера:
команда: SELECT toUnixTimestamp(now()) FROM
system.local
;
вывод ошибки:
com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unexpected argument type for function call 'toUnixTimestamp(...)' in select statementat com.datastax.oss.driver.api.core.servererrors.InvalidQueryException.copy(InvalidQueryException.java:48) at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149)
Я могу выполнить его, используя специальную таблицу (Astra CLI/Java-драйвер): SELECT toUnixTimestamp(now()) FROM
demo.example
;
Но в моем случае мне нужно выполнить его для system.local.
Сценарий тот же для следующих функций: toUnixTimestamp(), toTimestamp() и dateOf().
Функция only now() работает со всеми подходами: консолью AstraDB CQL, Astra CLI и Java-драйвером (SELECT now() FROM
system.local
;
).
Существуют ли какие-либо ограничения на то, к чему можно получить доступ внутри system.local с помощью консоли AstraDB CQL, но нельзя получить доступ с помощью Astra CLI или Java-драйвера?
Это действительно странно. Мне было бы любопытно узнать, как вы создаете свои операторы CQL в коде, потому что это должно работать.
У меня это работает с Java 21 и версией драйвера Java 4.17.0:
try (CqlSession session = CqlSession.builder()
.withCloudSecureConnectBundle(Paths.get(secureConnectBundlePath))
.withAuthCredentials(username,password)
.withKeyspace("system")
.build()) {
ResultSet rs = session.execute("select release_version from system.local");
Row row = rs.one();
System.out.println(row.getString(0));
ResultSet rs2 = session.execute("select now() from system.local");
Row row2 = rs2.one();
System.out.println(row2.getUuid(0));
ResultSet rs3 = session.execute("SELECT toUnixTimestamp(now()) FROM system.local;");
Row row3 = rs3.one();
System.out.println(row3.getLong(0));
}
Я также создал асинхронный пример, просто чтобы убедиться, что ничего не пропустил:
CompletionStage<CqlSession> sessionStage = CqlSession.builder()
.withCloudSecureConnectBundle(Paths.get(secureConnectBundlePath))
.withAuthCredentials(username,password)
.withKeyspace("system")
.buildAsync();
CompletionStage<AsyncResultSet> result = sessionStage.thenCompose(
session -> session.executeAsync("SELECT toUnixTimestamp(now()) FROM system.local;"));
CompletionStage<Long> unixTimeResult = result.thenApply(resultSet -> resultSet.one().getLong(0));
unixTimeResult.whenComplete(
(unixtime, error) -> {
if (error != null) {
System.out.println(error);
} else {
System.out.println(unixtime);
}
});
Результаты:
4.0.11-09ec37c912ed
556541c0-5980-11ef-b3cf-fdfdcd27eb44
1723559319596
1723559324300
Если у вас есть дополнительные вопросы, я поместил этот код в репозиторий Git, чтобы его было легко найти: https://github.com/aar0np/TestAstra/blob/main/src/main/java/testastra/TestAstra. Ява
Редактировать 20240815
Обсуждал этот вопрос с ребятами из Astra Engineering. Оказывается, в будущем Astra будет использовать другую маршрутизацию/обработку запросов к system.local
и system.peers
. Функция now()
может продолжать работать, но вложение now()
внутри другой функции (например: toUnixTimestamp()
) не будет. Мы также находимся в процессе внедрения этого изменения маршрутизации, поэтому оно по-прежнему работает в GCP, но больше не будет работать в AWS.
Официальная рекомендация — использовать для этого однострочную фиктивную таблицу, а не прямые запросы по system.local
.
Я проверил это еще раз, но теперь с Google Cloud в качестве провайдера. Все работает так, как ожидалось. Возможно ли, что два провайдера ведут себя по-разному?
Это действительно странно. Я бы не думал, что у нас будут такие разногласия между провайдерами. Я заметил, что ваша версия (4.0.0.6816) старше моей (4.0.11-09ec37c912ed). Различаются ли release_versions
у разных поставщиков? Может быть, это все.
Release_versions одинаковы у обоих поставщиков (4.0.0.6816).
@AleksandarHardi внес правку.
Привет @Aaron, я использовал твой проект с GitHub и получил то же исключение, что я описал выше. Вывод: 4.0.0.6816 42153458-5a15-11ef-a032-062a1e7aa9d3
Exception in thread "main" com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unexpected argument type for function call 'toUnixTimestamp(...)' in select statement at com.datastax.oss.driver.api.core.servererrors.InvalidQueryException.copy(InvalidQueryException.java:48)
--- Проблема, должно быть, в том, как создается база данных. Я использую AWS в качестве провайдера и бессерверную (не векторную) систему. Токен - Администратор организации.