Bug in Smartquery SQL generator
Posted: Tue 13 Mar 2012 08:34
Hi,
Delphi XE2, ODAC 8.1.5 has bug when generating INSERT, UPDATE, REFRESH... sql.
Case 1, compound primary key
query : SELECT com,
kasa,
provider,
prodaja_na_rate,
ecr_id,
auto_send
FROM pos_kasa pk
where "com,kasa,provider" is primary key.
Primary key is correctly recognized.
"Generate SQL" create error
Accces violation .....
[0CC20AE5]{dac160.bpl } Dbaccess.TDASQLGenerator.SQLInfo + $9 [0CC2168D]{dac160.bpl } Dbaccess.TDASQLGenerator.AddFieldToInsertSQL + $61 [0CD46974]{odac160.bpl } Oraservices.TCustomOraSQLGenerator.AddFieldToInsertSQL + $16C [0CC21757]{dac160.bpl } Dbaccess.TDASQLGenerator.GenerateInsertSQL + $6B [0CD46BBB]{odac160.bpl } Oraservices.TCustomOraSQLGenerator.GenerateInsertSQL + $1A7 [0CC22453]{dac160.bpl } Dbaccess.TDASQLGenerator.GenerateSQLforUpdTable + $C7 [0CB10A8A]{dcldac160.bpl} Dasqlgeneratorframe.TDASQLGeneratorFrame.GenerateSQLforUpdTable + $36 [0CE0E5F0]{dclodac160.bpl} Orasqlgeneratorframe.TOraSQLGeneratorFrame.GenerateSQLforUpdTable + $64 [0CB10DAE]{dcldac160.bpl} Dasqlgeneratorframe.TDASQLGeneratorFrame.btGenerateClick + $31A [0CE0E6C1]{dclodac160.bpl} Orasqlgeneratorframe.TOraSQLGeneratorFrame.btGenerateClick + $85 [50332EEB]{vcl160.bpl } Vcl.Controls.TControl.Click (Line 7320, "Vcl.Controls.pas" + 9) + $8 [50357392]{vcl160.bpl } Vcl.StdCtrls.TCustomButton.Click (Line 5160, "Vcl.StdCtrls.pas" + 3) + $2 [50357EC0]{vcl160.bpl } Vcl.StdCtrls.TCustomButton.CNCommand (Line 5621, "Vcl.StdCtrls.pas" + 1) + $D [50332995]{vcl160.bpl } Vcl.Controls.TControl.WndProc (Line 7204, "Vcl.Controls.pas" + 91) + $6 [0AAAE176]{AQtime7BDS9.bpl} Aqdockutils.ShowDockForm + $302 [503372F3]{vcl160.bpl } Vcl.Controls.TWinControl.WndProc (Line 9976, "Vcl.Controls.pas" + 152) + $6 [5035705C]{vcl160.bpl } Vcl.StdCtrls.TButtonControl.WndProc (Line 5002, "Vcl.StdCtrls.pas" + 13) + $4 [503325D0]{vcl160.bpl } Vcl.Controls.TControl.Perform (Line 6982, "Vcl.Controls.pas" + 10) + $8 [50337443]{vcl160.bpl } Vcl.Controls.DoControlMsg (Line 10045, "Vcl.Controls.pas" + 12) + $11 [50337ED7]{vcl160.bpl } Vcl.Controls.TWinControl.WMCommand (Line 10320, "Vcl.Controls.pas" + 1) + $5 [50332995]{vcl160.bpl } Vcl.Controls.TControl.WndProc (Line 7204, "Vcl.Controls.pas" + 91) + $6 [503372F3]{vcl160.bpl } Vcl.Controls.TWinControl.WndProc (Line 9976, "Vcl.Controls.pas" + 152) + $6 [50336948]{vcl160.bpl } Vcl.Controls.TWinControl.MainWndProc (Line 9689, "Vcl.Controls.pas" + 3) + $6 [500B6890]{rtl160.bpl } System.Classes.StdWndProc (Line 13878, "System.Classes.pas" +
+ $0 [503373F0]{vcl160.bpl } Vcl.Controls.TWinControl.DefaultHandler (Line 10017, "Vcl.Controls.pas" + 30) + $17 [50333340]{vcl160.bpl } Vcl.Controls.TControl.WMLButtonUp (Line 7453, "Vcl.Controls.pas" + 1) + $6 [50332995]{vcl160.bpl } Vcl.Controls.TControl.WndProc (Line 7204, "Vcl.Controls.pas" + 91) + $6 [19A56920]{rbIDE1416.bpl} Ppsynuedit.TSynEditPlugin + $70 [50336B3B]{vcl160.bpl } Vcl.Controls.TWinControl.IsControlMouseMsg (Line 9745, "Vcl.Controls.pas" + 1) + $9 [503372F3]{vcl160.bpl } Vcl.Controls.TWinControl.WndProc (Line 9976, "Vcl.Controls.pas" + 152) + $6 [1ACD3F51]{cxLibraryRS16.bpl} Dxhooks. + $0 [5035705C]{vcl160.bpl } Vcl.StdCtrls.TButtonControl.WndProc (Line 5002, "Vcl.StdCtrls.pas" + 13) + $4 [50336948]{vcl160.bpl } Vcl.Controls.TWinControl.MainWndProc (Line 9689, "Vcl.Controls.pas" + 3) + $6 [500B6890]{rtl160.bpl } System.Classes.StdWndProc (Line 13878, "System.Classes.pas" +
+ $0 [50454598]{vcl160.bpl } Vcl.Forms.TApplication.CancelHint (Line 10993, "Vcl.Forms.pas" + 6) + $7 [50453213]{vcl160.bpl } Vcl.Forms.TApplication.ProcessMessage (Line 10164, "Vcl.Forms.pas" + 23) + $1 [50453256]{vcl160.bpl } Vcl.Forms.TApplication.HandleMessage (Line 10194, "Vcl.Forms.pas" + 1) + $4 [5044EA75]{vcl160.bpl } Vcl.Forms.TCustomForm.ShowModal (Line 7035, "Vcl.Forms.pas" + 33) + $5 [0CB1717B]{dcldac160.bpl} Daqueryeditor.TDAQueryEditorForm.SetComponent + $17 [0CB2A05C]{dcldac160.bpl} Crdesign.TCRComponentEditor.ShowEditorEx + $8C [0CB29FAA]{dcldac160.bpl} Crdesign.TCRComponentEditor.ShowEditor + $32 [0CB2A373]{dcldac160.bpl} Crdesign.TCRComponentEditor.Edit + $B
Generated INSERT SQL is OK.
UPDATE/LOCK & DELETE SQL is completely wrong :
UPDATE POS_KASA
SET
AUTO_SEND = :AUTO_SEND, ECR_ID = :ECR_ID, PRODAJA_NA_RATE = :PRODAJA_NA_RATE, PROVIDER = :PROVIDER, KASA = :KASA, COM = :COM WHERE
AUTO_SEND = :Old_AUTO_SEND AND ECR_ID = :Old_ECR_ID AND PRODAJA_NA_RATE = :Old_PRODAJA_NA_RATE should be reversed as where clause is not using primary key but all other fields.
CASE 2, single field as primary key does not generate error but though recognize correctly primary key, generated SQL uses field that is not primary . Could not find the logic as tried few times to generate SQL but each time different field is used as primary key.
Best regards,
Boris
Delphi XE2, ODAC 8.1.5 has bug when generating INSERT, UPDATE, REFRESH... sql.
Case 1, compound primary key
query : SELECT com,
kasa,
provider,
prodaja_na_rate,
ecr_id,
auto_send
FROM pos_kasa pk
where "com,kasa,provider" is primary key.
Primary key is correctly recognized.
"Generate SQL" create error
Accces violation .....
[0CC20AE5]{dac160.bpl } Dbaccess.TDASQLGenerator.SQLInfo + $9 [0CC2168D]{dac160.bpl } Dbaccess.TDASQLGenerator.AddFieldToInsertSQL + $61 [0CD46974]{odac160.bpl } Oraservices.TCustomOraSQLGenerator.AddFieldToInsertSQL + $16C [0CC21757]{dac160.bpl } Dbaccess.TDASQLGenerator.GenerateInsertSQL + $6B [0CD46BBB]{odac160.bpl } Oraservices.TCustomOraSQLGenerator.GenerateInsertSQL + $1A7 [0CC22453]{dac160.bpl } Dbaccess.TDASQLGenerator.GenerateSQLforUpdTable + $C7 [0CB10A8A]{dcldac160.bpl} Dasqlgeneratorframe.TDASQLGeneratorFrame.GenerateSQLforUpdTable + $36 [0CE0E5F0]{dclodac160.bpl} Orasqlgeneratorframe.TOraSQLGeneratorFrame.GenerateSQLforUpdTable + $64 [0CB10DAE]{dcldac160.bpl} Dasqlgeneratorframe.TDASQLGeneratorFrame.btGenerateClick + $31A [0CE0E6C1]{dclodac160.bpl} Orasqlgeneratorframe.TOraSQLGeneratorFrame.btGenerateClick + $85 [50332EEB]{vcl160.bpl } Vcl.Controls.TControl.Click (Line 7320, "Vcl.Controls.pas" + 9) + $8 [50357392]{vcl160.bpl } Vcl.StdCtrls.TCustomButton.Click (Line 5160, "Vcl.StdCtrls.pas" + 3) + $2 [50357EC0]{vcl160.bpl } Vcl.StdCtrls.TCustomButton.CNCommand (Line 5621, "Vcl.StdCtrls.pas" + 1) + $D [50332995]{vcl160.bpl } Vcl.Controls.TControl.WndProc (Line 7204, "Vcl.Controls.pas" + 91) + $6 [0AAAE176]{AQtime7BDS9.bpl} Aqdockutils.ShowDockForm + $302 [503372F3]{vcl160.bpl } Vcl.Controls.TWinControl.WndProc (Line 9976, "Vcl.Controls.pas" + 152) + $6 [5035705C]{vcl160.bpl } Vcl.StdCtrls.TButtonControl.WndProc (Line 5002, "Vcl.StdCtrls.pas" + 13) + $4 [503325D0]{vcl160.bpl } Vcl.Controls.TControl.Perform (Line 6982, "Vcl.Controls.pas" + 10) + $8 [50337443]{vcl160.bpl } Vcl.Controls.DoControlMsg (Line 10045, "Vcl.Controls.pas" + 12) + $11 [50337ED7]{vcl160.bpl } Vcl.Controls.TWinControl.WMCommand (Line 10320, "Vcl.Controls.pas" + 1) + $5 [50332995]{vcl160.bpl } Vcl.Controls.TControl.WndProc (Line 7204, "Vcl.Controls.pas" + 91) + $6 [503372F3]{vcl160.bpl } Vcl.Controls.TWinControl.WndProc (Line 9976, "Vcl.Controls.pas" + 152) + $6 [50336948]{vcl160.bpl } Vcl.Controls.TWinControl.MainWndProc (Line 9689, "Vcl.Controls.pas" + 3) + $6 [500B6890]{rtl160.bpl } System.Classes.StdWndProc (Line 13878, "System.Classes.pas" +
Generated INSERT SQL is OK.
UPDATE/LOCK & DELETE SQL is completely wrong :
UPDATE POS_KASA
SET
AUTO_SEND = :AUTO_SEND, ECR_ID = :ECR_ID, PRODAJA_NA_RATE = :PRODAJA_NA_RATE, PROVIDER = :PROVIDER, KASA = :KASA, COM = :COM WHERE
AUTO_SEND = :Old_AUTO_SEND AND ECR_ID = :Old_ECR_ID AND PRODAJA_NA_RATE = :Old_PRODAJA_NA_RATE should be reversed as where clause is not using primary key but all other fields.
CASE 2, single field as primary key does not generate error but though recognize correctly primary key, generated SQL uses field that is not primary . Could not find the logic as tried few times to generate SQL but each time different field is used as primary key.
Best regards,
Boris