Символ ";" в запросе

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Символ ";" в запросе

Сообщение Lars » 21 сен 2006, 09:05

При использовании FibPlus 6.3.0 запрос имеет такой вид:

Код: Выделить всё

SELECT
    CAR_NAME,
    WORKSHOP_NAME,
    STATE_NAME
FROM
    VIEW_NOW_CAR_STATE
ORDER BY CAR_NAME;
Выполняется на Firebird 1.5.3 нормально,
на Firebird 2 выдает ошибку

Код: Выделить всё

RST_CAR_STATE.: [Prepare] DM.RST_CAR_STATE:
Invalid token.Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 7, column 18.
;.
Так должно быть?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2006, 11:39

Возьми да убери. Зачем вообще в запросе точка с запятой?

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 21 сен 2006, 13:20

Убрать - не проблема.

Так важна причина такого поведения. При тестировании в IBExpert ошибка не появляется, т.е. через эксперта можно передавать запросы с ";".

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 21 сен 2006, 13:48

Вполне вероятно что Эксперт сам отрезает эту точкозапятую. Сможешь сделать тесткейс на API - кинь в трэкер.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2006, 14:19

Нет, эксперт не отрезает, проверил монитором, так и кидает с ";".
По мне - так и правильно, что ошибку вызывает. Чем строже - тем лучше. От "нестрогости" никакого функционала не добавляется.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 21 сен 2006, 14:24

WildSery писал(а):По мне - так и правильно, что ошибку вызывает. Чем строже - тем лучше. От "нестрогости" никакого функционала не добавляется.
А разве в SQL 92 не указано, что строка запроса должна заканчиваться ";"?

--------------

p.s. ВОт только с sql.ru c:

Структуризированный язык запросов (SQL)

Учебное пособие

Санкт-Петербургский Государственный институт
точной механики и оптики (технический университет)
Кафедра вычислительной техники
В.В.Кириллов, Г.Ю.Громов


http://www.cs.ifmo.ru/education/documen ... /2-1.shtml
точка с запятой (;) - завершающий элемент предложений SQL;
Тоже самое замечание (относительно SELECT запросов) есть и М.Грубера:

"Точка с запятой используется во всех интерактивных командах SQL чтобы сообщать базе данных что команда заполнена и готова выполниться. В некоторых системах наклонна черта влево (\) в строке, является индикатором конца команды."


Все это не к тому, что поспорить хочу. Важна причина такого поведения, странно, что никто не сталкивался.[/i]

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2006, 14:32

Да везде так написано.
Это я такой неправильный, что отдельные стейтменты никогда не завершаю ";" :roll:
Потому как считаю нужным только в тексте у предложений указывать конец.

ЗЫ: Грабера, не Грубера :wink:

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 21 сен 2006, 14:34

WildSery писал(а):ЗЫ: Грабера, не Грубера :wink:
Ошибся

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 21 сен 2006, 15:10

AFAIR он Gruber, а вот на какой манер его транскрибировать: по-английски или (вспоминая происхождение) по-немецки - дело вкуса.

Настораживает в вышеприведенном тексте слово "интерактивный". То что в isql без разделителя не обойтись - однозначно, но DSQL это птица другого полета...

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 21 сен 2006, 15:15

Dimitry Sibiryakov писал(а):AFAIR он Gruber, а вот на какой манер его транскрибировать: по-английски или (вспоминая происхождение) по-немецки - дело вкуса.

Настораживает в вышеприведенном тексте слово "интерактивный". То что в isql без разделителя не обойтись - однозначно, но DSQL это птица другого полета...
Хорошо, я попробую тесткейс сделать на API, может действительно нужно принять как новое и все.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2006, 18:10

Dimitry Sibiryakov писал(а):AFAIR он Gruber, а вот на какой манер его транскрибировать: по-английски или (вспоминая происхождение) по-немецки - дело вкуса.
На книге написано русским по синему - "Грабер". Так я и читаю :roll:
Это извечная беда транскрипций. Почему "миссис Хадсон", однако "Гудзонов пролив", ведь фамилия одна?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 сен 2006, 20:35

читать правильно в английской, Грабер. Книжки надо покупать, а не читать в неизвестно чьем переводе :)

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 22 сен 2006, 06:42

Да какая разница в фамилии автора? Все точно поняли о ком идет речь, но ответа так и нет дельного по вопросу.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 22 сен 2006, 08:11

Двойки у меня нет, но попробуй выполнить следующее в isql:

Код: Выделить всё

SET TERM ^;
SELECT CURRENT_DATE FROM RDB$DATABASE;^

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 22 сен 2006, 08:24

Код: Выделить всё

SET TERM ^;
SELECT CURRENT_DATE FROM RDB$DATABASE;^
Ошибок нет, выполнил.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 22 сен 2006, 08:44

Значит с сервером все в порядке и DSQL модуль точкозапятые все еще игнорирует. Копай свое приложение дальше. Может, у тебя там пробел есть после точкозапятой или еще что-то в этом роде...

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 22 сен 2006, 08:53

Dimitry Sibiryakov писал(а):Значит с сервером все в порядке и DSQL модуль точкозапятые все еще игнорирует. Копай свое приложение дальше. Может, у тебя там пробел есть после точкозапятой или еще что-то в этом роде...
нет символов после ";"

Ответить