Recent

Author Topic: Lazarus 2.0.0.RC3 - ошибка в Sequence для SQLite: Near FOR syntaх error  (Read 3224 times)

wanderus

  • New member
  • *
  • Posts: 5
Зарегистрировался чтобы об ошибке сообщить. Вдруг поможет.
Lazarus 2.0.0.RC3
Используется SQLite 3.2.5
Win32

TSQLite3Connection.GetNextValue(...)  ругается near "FOR": syntax error.
Та же самая ошибка возникает, если использовать редактируемый ТSQLQuery, у которого указать Sequence. Ошибка возникает после вызова Post для вставляемой записи.

Это как-то можно обойти или починить?

sash

  • Sr. Member
  • ****
  • Posts: 251
Не пользуюсь SQLite, но было бы лучше описать проблему полнее.
Lazarus 2.0.2 FPC 3.0.4 x86_64-linux-gtk2 -- Ubuntu 19.04 XFCE

wanderus

  • New member
  • *
  • Posts: 5
Разобрался, как включить протоколирование запросов и уточнил проблему. При использовании Sequence пытается выполнить запрос:
Code: SQL  [Select]
  1. SELECT NEXT VALUE FOR <sequencename>
  2.  
Но этот запрос некорректен для SQLite.
Ругается как я описал выше.
Выполнение такого запроса происходит если явным образом у компонента TSQLite3Connection вызвать метод GetNextValue,
либо если у компонента TSQLQuery заполнить свойство Sequence и попытаться сохранить новую запись.

Приемлемый запрос вместо ошибочного может выглядеть примерно так:
Code: SQL  [Select]
  1. SELECT seq+1 FROM sqlite_sequence WHERE name=<sequencename>
  2.  
С его помощью я смог обойти проблему, отключив в компоненте TSQLQuery использование Sequence и просто заполняя автоинкрементное поле с помощью этого запроса на событии BeforePost.
« Last Edit: February 01, 2019, 10:48:00 am by wanderus »

wanderus

  • New member
  • *
  • Posts: 5
Поиском по исходникам локализовал проблему:
sqldb.pp строка 2000
Code: Pascal  [Select]
  1. function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;
  2. begin
  3.   Result := 'SELECT NEXT VALUE FOR ' + SequenceName;
  4. end;
  5.  
Очевидно, что этот метод должен быть переопределен для TSQLite3Connection (файл sqlite3conn.pp), но это не сделано.
Собственно, вот и способ исправления нарисовался.
Могу сам себе поправить, но может кто-нибудь сможет донести это до разработчиков, чтобы в релизе поправили?

HuntingKashket

  • New member
  • *
  • Posts: 33
  • I'm interested in upgrading everything
Поиском по исходникам локализовал проблему:
sqldb.pp строка 2000
Code: Pascal  [Select]
  1. function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;
  2. begin
  3.   Result := 'SELECT NEXT VALUE FOR ' + SequenceName;
  4. end;
  5.  
Очевидно, что этот метод должен быть переопределен для TSQLite3Connection (файл sqlite3conn.pp), но это не сделано.
Собственно, вот и способ исправления нарисовался.
Могу сам себе поправить, но может кто-нибудь сможет донести это до разработчиков, чтобы в релизе поправили?

With search in sources i localized the problem:
sqldb.pp string 2000
Code: Text  [Select]
  1. function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;
  2. begin
  3.   Result := 'SELECT NEXT VALUE FOR ' + SequenceName;
  4. end;
  5.  
This code isn't correct for sqlite3, which faults with <<near "FOR": syntax error.>>
Obviously, this method must be redeclared for TSQLite3Connection (file sqlite3conn.pp), but this isn't done.
Please, redeclare this with something like
Code: MySQL  [Select]
  1. SELECT seq+1 FROM sqlite_sequence WHERE name=<sequencename>
  2.  
-- Translation & summary from wanderus

Please, someone, pay attention to this bug.

« Last Edit: March 17, 2019, 04:42:38 pm by HuntingKashket »
Leu Zenin
-------------------------------
Lazarus 2.1.0  with FPC 3.1
Windows 8.1 x64

JuhaManninen

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 3609
  • I like bugs.
Please report with steps to reproduce and preferably a patch to fix it.
 https://bugs.freepascal.org/my_view_page.php