powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
5 сообщений из 5, страница 1 из 1
LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
    #38611873
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
set term ^;
execute block as begin
  execute statement 'drop sequence g_tgt'; when any do begin end
end
^set term ;^
commit;
create sequence g_tgt;
recreate table tgt(id int constraint pk_tgt primary key using index pk_tgt, p varchar(80));
recreate table src(id int, n varchar(80));
create index tgt_p on tgt(p);
commit;

insert into src(id, n) values (21949, 'aaa');
insert into src(id, n) values (21950, 'bbb');
insert into src(id, n) values (21952, 'aaa');
commit;

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
merge into tgt t
using (
  select 'name similar to %'||a.n||'%'||coalesce(' or name similar to %'||b.n||'%', '') p
  from src a left join src b on a.n <> b.n
) s
on t.p = s.p
when  NOT  matched then insert(t.id, t.p) values(gen_id(g_tgt,1), s.p);
commit;

А теперь смотрим на содержимое таблицы `tgt`.

Результат на LI-V6.3.3.26744 (правильный; вроде бы... ;-) ):IDP3name similar to %aaa% or name similar to %bbb%4name similar to %bbb% or name similar to %aaa%

Результат на LI-T3.0.0.31037:IDP1name similar to %aaa% or name similar to %bbb%2name similar to %bbb% or name similar to %aaa%3name similar to %bbb% or name similar to %aaa%4name similar to %aaa% or name similar to %bbb%

Наличие / отсутствие индекса tgt_p на погоду не влияет. Равно как и замена в источнике left join'a на inner или right.

Что-то в 3.0.х поломалось в борьбе за стабильный курсор ?
...
Рейтинг: 0 / 0
LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
    #38611890
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидРезультат на LI-V6.3.3.26744 (правильный; вроде бы... ;-)):

я бы так не сказал он был бы правильный если бы ID были 1 и 2, а не 3 и 4

в тройке похоже что это действительно связано с исправлением стабильности курсора. Но здесь скорее ошибка заключается в том, что merge не послал тебя из за того что под условие соединения подпадает более 1 записи, чего требует стандарт

http://en.wikipedia.org/wiki/Merge_(SQL) Firebird supports MERGE INTO though fails to throw an error when there are multiple Source data rows. Additionally there is a single-row version, UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)], but the latter does not give you the option to take different actions on insert versus update (e.g. setting a new sequence value only for new rows, not for existing ones.)
...
Рейтинг: 0 / 0
LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
    #38611892
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисскорее ошибка заключается в том, что merge не послал тебя из за того что под условие соединения подпадает более 1 записи, чего требует стандартСогласен. Он должен был отвалиться с ошибкой при таком раскладе.
Кстати, когда индекс на 'tgt' уникальный, то merge в этом примере вывалит ошибку нарушения unique-индекса. Именно из-за неё я и начал раскопки.
...
Рейтинг: 0 / 0
LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
    #38611893
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу, был же пример уже, недавно совсем.
Спать пора.

ЗЫ. Но таки merge допилить бы надо, чтобы он ошибку вываливал в таких случаях...
...
Рейтинг: 0 / 0
LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
    #38611894
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидРезультат на LI-V6.3.3.26744 (правильный; /вроде бы... ;-)/):
Почему это он правильный? Результат запроса в USING - четыре строки. Таблица tgt - пустая,
следовательно в результате в ней должны оказаться все эти четыре строки. Как, по какой
логике там могло быть меньше?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / LI-T3.0.0.31037: merge допускает дубликаты при наличии when NOT matched
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]