View Issue Details

IDProjectCategoryView StatusLast Update
0008273VCOMPONENT-VKERNELSQLpublic2019-01-21 10:49
ReporterVladimir Esipov Assigned ToRuslan Zasukhin  
PrioritynormalSeveritymajorReproducibilityalways
Status resolvedResolutionfixed 
Platform32OSWindowsOS Version7
Product Version8.2.x 
Target Version9.0.xFixed in Version9.0.x 
Summary0008273: The VStudio 8.3 crashes on a MERGE query
DescriptionЕсли верить примерам в WIKI (и сниппету), должен выполняться запрос вида:

  MERGE t1 USING t2
  ON (t1.ID = t2.ptr)
  WHEN MATCHED THEN UPDATE
       SET t1.f1 = t2.f2

Но в реале такой синтаксис не срабатывает!
Синтаксис команды MERGE, расписанный в доках (а также в сниппете студии) некорректен...

MERGE tblA USING tblB ON (tblA.RecID=tblB.ptrA) WHEN MATCHED THEN UPDATE SET tblA.EXS = 1;
-- VStudio 6.54 Kernel error: 0x71000. line 1:84: expecting '=', found '.'
-- VStudio 8.3 Kernel error: 0x71000. line 1:84: unexpected token:

MERGE tblA USING tblB ON (tblA.RecID=tblB.ptrA) WHEN MATCHED THEN UPDATE SET EXS = 1;
-- VStudio 6.54 Kernel error: 0x51500. Identifier "EXS" is not found.
-- VStudio 8.3 CRASH

Я об этом упоминал с год назад, вы говорили, что исправите...
Парсер подхватывает запрос вида

  MERGE t1 USING t2
  ON (t2.ptr = t1.ID) --< Порядок следования полей в связи важен (?)
  WHEN MATCHED THEN UPDATE
       SET f1 = t2.f2 --< Имя таблицы в UPDATE SET не должно указываться

Но версия VStudio 8.3x32(WIN64) валится на запросах, которые ранее,
в версии 6.54 выполнялись без проблем:
Steps To ReproduceCREATE TABLE tblA (EXS BOOLEAN NOT NULL, mPHN ULLONG METHOD ('4232099999 + RecID') NOT NULL );
INSERT INTO tblA (EXS) VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
CREATE TABLE tblB (VLD VARCHAR(10) NOT NULL, ptrA OBJECTPTR INDEXED );
ALTER TABLE tblB MODIFY ptrA OBJECTPTR CONSTRAINT lnkA REFERENCES tblA ON DELETE SET NULL;
INSERT INTO tblB (VLD, ptrA)
 VALUES ('VLD1',1),('VLD3',3),('VLD5',5),('VLD7',7),('VLD8',7),('VLD9',9),('VLD10',10);

MERGE tblA USING tblB ON (tblB.ptrA=tblA.RecID) WHEN MATCHED THEN UPDATE SET EXS = 1;
-- VStudio 6.54 Number of affected rows: 7
-- VStudio 8.3 CRASH
MERGE INTO tblA USING tblB ON lnkA WHEN MATCHED THEN UPDATE SET EXS = 1;
-- VStudio 6.54 Number of affected rows: 7
-- VStudio 8.3 CRASH

-- Как видите, в версии 6.54 два последних запроса отработали должным образом!
TagsNo tags attached.

Activities

Ruslan Zasukhin

Ruslan Zasukhin

2019-01-21 10:39

administrator   ~0010642

IT looks this is is because of SQL Standard.

MERGE stmt uses the same clause 'set_clause_list' as UPDATE stmt.

As you can see here COLUMN NAME only.
So it seems we need fix just example in WIKI


set_clause_list
    : set_clause ( COMMA! set_clause )*
            { ## = #(#[SET_CLAUSE_LIST,"SET_CLAUSE_LIST"],##); }
    ;
    
set_clause
    : update_target EQ^ update_source
    ;

update_target
    : column_name
            (LBRACK expr RBRACK!)? // for arrays. ATTN: We do not remove LBRACK, so tree parser can recognize case
    ;
Ruslan Zasukhin

Ruslan Zasukhin

2019-01-21 10:49

administrator   ~0010643

crash was fixed yet in Aug 2018

Today fixed WIKI page,
   http://valentina-db.com/docs/dokuwiki/v8/doku.php?id=valentina:vcomponents:vsql:reference:merge


UPDATE SET fld =

can be only fld, by rules of UPDATE stmt.

Issue History

Date Modified Username Field Change
2018-05-30 12:16 Vladimir Esipov New Issue
2018-07-25 18:14 Ruslan Zasukhin Assigned To => Ivan Smahin
2018-07-25 18:14 Ruslan Zasukhin Status new => assigned
2018-07-27 07:55 Ivan Smahin Assigned To Ivan Smahin => Ruslan Zasukhin
2019-01-21 10:39 Ruslan Zasukhin Note Added: 0010642
2019-01-21 10:48 Ruslan Zasukhin Fixed in Version => 9.0.x
2019-01-21 10:48 Ruslan Zasukhin Target Version => 9.0.x
2019-01-21 10:49 Ruslan Zasukhin Note Added: 0010643
2019-01-21 10:49 Ruslan Zasukhin Status assigned => resolved
2019-01-21 10:49 Ruslan Zasukhin Resolution open => fixed