Драйвер Yugabyte C# Найдено слишком много соответствий для встроенной функции '+' - PullRequest
1 голос
/ 03 февраля 2020

Я попытался выполнить этот запрос с драйвером yugabyte-cassandra (C#):

        public async Task IncreaseUnread(int userId, long peerId, int count)
        {
            var statement = await Session.PrepareAsync("UPDATE messaging_db.dialog SET unreadCount = unreadCount + ? WHERE userId = ? AND longPeerId = ?");
            var bounded = statement.Bind(count, userId, peerId);

            await Session.ExecuteAsync(bounded);
        }

И я столкнулся с этой ошибкой:

Cassandra.InvalidQueryException: Invalid Function Call. Failed calling '+(int,anytype)'. Found too many matches for builtin function '+'
UPDATE messaging_db.dialog SET unreadCount = unreadCount + ? WHERE userId = ? AND longPeerId = ?
                                                     ^

Что мне делать, чтобы исправить это? Есть ли доступное приведение типов?

Обновление:

Схема моей таблицы:

CREATE TABLE IF NOT EXISTS messaging_db.dialog(
    userId INT,
    longPeerId BIGINT,
    topMessageId INT,
    readInboxMaxId INT,
    readOutboxMaxId INT,
    unreadCount INT,
    unreadMentionCount INT,
    pts INT,
    draft TEXT,
    pinned BOOLEAN,
    unreadMark BOOLEAN,
    modificationTime TIMESTAMP,
    PRIMARY KEY((userId), longPeerId)
);

1 Ответ

0 голосов
/ 04 февраля 2020

В качестве обходного пути вы можете выполнить запрос с жестко заданными параметрами. С форматированием строки:

UPDATE messaging_db.dialog SET unreadCount = unreadCount + 1 WHERE userId = 2 AND longPeerId = 3;

Воспроизводится с Java:

 @Test
  public void testPrepare() throws Exception {
    session.execute("CREATE TABLE dialog(userId INT PRIMARY KEY, unreadCount INT);");
    session.execute("insert into dialog (userId, unreadCount) values (100, 1);");
    String stmt = "UPDATE dialog SET unreadCount = unreadCount + ? WHERE userId = 10;";
    PreparedStatement prep = session.prepare(stmt);
    session.execute(prep.bind(2));
    assertQueryRowsUnordered("select * from dialog;", "Row[100, 3]");
    session.execute("drop table dialog;");
  }

Исключение:

[ERROR] testPrepare(org.yb.cql.TestPrepareExecute)  Time elapsed: 9.713 s  <<< ERROR!
com.datastax.driver.core.exceptions.InvalidQueryException: 
Invalid Function Call. Failed calling '+(int,anytype)'. Found too many matches for builtin function '+'
UPDATE dialog SET unreadCount = unreadCount + ? WHERE userId = 10;
                                            ^
 (ql error -214)

Ошибка отслеживания: github.com / yugabyte / yugabyte-дб / вопросы / 3559

...