SQL DELIMITER для TRIGGER в весеннем тесте делает ошибку - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть две таблицы и триггер. Когда мы вставляем строку в одну таблицу, то запускаем вставку строки в другую таблицу.

дохода_multi_currency_test_init_script.sql:

CREATE TABLE `game_operation` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'GAME_OPERATION unique identifier',
  `time` DATETIME NOT NULL COMMENT 'Time',
  `total_bet` INT NOT NULL COMMENT 'Total bet of game operation',
  `total_win` BIGINT NOT NULL COMMENT 'Total win of game operation, including bonus, excluding jackpot',
  `balance` BIGINT DEFAULT 0 COMMENT 'Balance of game operation',
  `result` TEXT COMMENT 'Detailed result of game round, serialized as text',
  `game_session_id` BIGINT UNSIGNED NOT NULL COMMENT 'GAME_SESSION unique identifier during which operation is performed',
  `start_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Unique identifier of GAME_OPERATION that started current bet session (paid game)',
  PRIMARY KEY (`id`),
  KEY `ix_game_operation_game_session_start_id` (`game_session_id`, `start_id`)
);

CREATE TABLE `game_operation_hourly` (
  `id` BIGINT UNSIGNED NOT NULL COMMENT 'Composed value of (HOUR_NUMBER<<45) + (GAME_ID<<32) + PLAYER_ID, where HOUR_NUMBER = (HOUR - 2019-01-01 00:00:00 UTC)/60/60',
  `hour` DATETIME NOT NULL COMMENT 'Timestamp when aggregated hour starts, inclusive',
  `total_bet` BIGINT NOT NULL COMMENT 'Sum of bets in aggregated hour',
  `total_win` BIGINT NOT NULL COMMENT 'Sum of wins in aggregated hour, including bonus, excluding jackpot',
  `bet_count` INT NOT NULL COMMENT 'Count of operations in aggregated hour',
  `game_id` INT NOT NULL COMMENT 'Unique identifier of game engine, defined in code',
  `player_id` INT UNSIGNED NOT NULL COMMENT 'PLAYER unique identifier',
  PRIMARY KEY (`id`),
  KEY `ix_game_operation_hourly_hour_game_id` (`hour`, `game_id`),
  KEY `ix_game_operation_hourly_hour_player_id` (`hour`, `player_id`)
);

DELIMITER //
CREATE TRIGGER game_operation_insert AFTER INSERT ON `game_operation`
FOR EACH ROW
  BEGIN
    IF NEW.total_bet != 0 OR NEW.total_win != 0 THEN
      BEGIN
        DECLARE l_player_id INT;
        DECLARE l_game_id INT;
        DECLARE l_hour_int INT;
        DECLARE l_hour_date DATETIME;
        DECLARE l_id BIGINT;

        SELECT `player_id`, `game_id` INTO l_player_id, l_game_id FROM `game_session` WHERE `id` = NEW.game_session_id;

        IF (l_player_id IS NULL OR l_game_id IS NULL) THEN
          SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Game session not found';
        ELSEIF (l_game_id > 8191) THEN
          SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Parameter `game_id` is greater than 8191';
        END IF;

        SET l_hour_int := UNIX_TIMESTAMP(NEW.time) DIV 3600;
        SET l_id := ((l_hour_int - 429528) << 45) | (l_game_id << 32) | (l_player_id);
        SET l_hour_date := FROM_UNIXTIME(l_hour_int * 3600);

        INSERT INTO `game_operation_hourly` (`id`, `hour`, `total_bet`, `total_win`, `bet_count`, `game_id`, `player_id`)
          VALUES (l_id, l_hour_date, NEW.total_bet, NEW.total_win, IF(NEW.total_bet = 0, 0, 1), l_game_id, l_player_id)
          ON DUPLICATE KEY UPDATE `total_bet`=`total_bet`+VALUES(`total_bet`), `total_win`=`total_win`+VALUES(`total_win`), `bet_count`=`bet_count`+VALUES(`bet_count`);
      END;
    END IF;
  END//
DELIMITER ;

Все работает нормально в mySQL workBanch и вFlyWay sql файлы в проекте. Но когда я вставляю создание триггера в скрипт в моем тесте, он выдает ошибку

, вызванную: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который нужно использовать рядом с 'DELIMITER // CREATE TRIGGER game_operation_insert ПОСЛЕ INSERT ON `game_operatio' в строке 1

Я запускаю свой скрипт в тесте вот так:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = ReportApplicationTests.Initializer.class)
@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:db/migration/revenue_multi_currency_test_init_script.sql")
@Import(DataSourceAutoConfiguration.class)

Как создать триггер в тесте?

...