Возможно bag

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Возможно bag

Сообщение avenger » 12 янв 2007, 11:34

Привет Всем!

Есть select:

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

SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE', 129, 1)
UNION ALL
SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE1', 129, 1)
Последовательно выполняю процедуры:
Процедура SEARCH_SELECT_OR(NULL, 'TITLE', 129, 1) выполняется без ошибок, а процедура SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE1', 129, 1) говорит "Violation of Primary or Unique Key..."

Тем не менее приведенный селект выполняется и дает результат, состоящий из двух строк. Например: 2, null

Почему весь селект не вылетает по ошибке?

С уважением, Иван.

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

Сообщение kdv » 12 янв 2007, 11:47

фиг знает. ты в процедуре данные меняешь? иначе откуда там violation of ... может вообще быть.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 12 янв 2007, 11:55

kdv писал(а):фиг знает. ты в процедуре данные меняешь? иначе откуда там violation of ... может вообще быть.
Да меняю, происходит Insert. Я намеренно сделал такой тест. В реальной ситуации у меня "violation" не будет.

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

Сообщение kdv » 12 янв 2007, 12:05

Почему весь селект не вылетает по ошибке?
он и не должен. селект "вылетает по ошибке" только если при обработке какой-то записи произошла ошибка.
Например, если выполняется select * from table, и где-то в записи кривые данные (overflow, string truncation и т.п.) - вылетит именно на этой записи.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 12 янв 2007, 12:16

kdv писал(а):он и не должен.
Странно все это.
Выполняю

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

SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE1', 129, 1)
вылетает ошибка "Violation of Primary or Unique Key...", а

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

SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE', 129, 1)
UNION ALL
SELECT RESULT_COUNT FROM SEARCH_SELECT_OR(NULL, 'TITLE1', 129, 1)
- все ок.

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

Сообщение Dimitry Sibiryakov » 12 янв 2007, 12:36

А как насчет перестать темнить и показать таки нам внутренности процедуры?.. А еще лучше - полный test case в формате isql.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 12 янв 2007, 14:36

Dimitry Sibiryakov писал(а):А как насчет перестать темнить и показать таки нам внутренности процедуры?.. А еще лучше - полный test case в формате isql.

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

SET TERM ^ ;

CREATE PROCEDURE SEARCH_SELECT_OR (
    table_name varchar(32),
    attribute_name varchar(32),
    query_id integer,
    flag smallint)
returns (
    result_count integer)
as
declare variable table_name_id integer;
declare variable attribute_name_id integer;
BEGIN
  TABLE_NAME     = UPPER(TABLE_NAME);
  ATTRIBUTE_NAME = UPPER(ATTRIBUTE_NAME);
  SELECT NAME_ID FROM SEARCH_NAMES WHERE NAME = :TABLE_NAME INTO :TABLE_NAME_ID;
  SELECT NAME_ID FROM SEARCH_NAMES WHERE NAME = :ATTRIBUTE_NAME INTO :ATTRIBUTE_NAME_ID;

  INSERT INTO SEARCH_QUERY_RESULTS (QUERY_ID, TABLE_FK, ATTRIBUTE_FK, WEIGHT, WORD_COUNT)
    SELECT :QUERY_ID, ST.TABLE_ID, SA.ATTRIBUTE_ID, PS.WEIGHT, PS.WORD_COUNT
    FROM SEARCH_PREPARE_SELECT_OR(:QUERY_ID, :FLAG) PS
    JOIN SEARCH_ATTRIBUTES SA ON SA.ATTRIBUTE_ID = PS.ATTRIBUTE_ID
    JOIN SEARCH_TABLES ST ON ST.TABLE_ID = SA.TABLE_FK AND ST.FLAG = 0;

  SELECT COUNT(*) FROM SEARCH_QUERY_RESULTS WHERE QUERY_ID = :QUERY_ID INTO :RESULT_COUNT;
  SUSPEND;
END^

SET TERM ; ^
Попробовал собрать test case, думал так:

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

CREATE TABLE TESTS (
    TESTID  INTEGER NOT NULL
);

ALTER TABLE TESTS ADD CONSTRAINT PK_TESTS PRIMARY KEY (TESTID);

SET TERM ^ ;

ALTER PROCEDURE INSERT_ID (
    ID INTEGER)
RETURNS (
    RESULT_COUNT INTEGER)
AS
BEGIN
  INSERT INTO TESTS (TESTID) VALUES (1);

  SELECT COUNT(*) FROM TESTS INTO :RESULT_COUNT;
  SUSPEND;
END
^
SET TERM ; ^
Но результат совсем другой.

Хотя нет, при выполнении

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

SELECT RESULT_COUNT FROM INSERT_ID(1)
UNION ALL
SELECT RESULT_COUNT FROM INSERT_ID(1)
Возвращает результат 1, null

У меня FB2.0, смотрел IBExpert

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

Сообщение Dimitry Sibiryakov » 12 янв 2007, 15:02

Совсем не вижу ни одного ПК, который эта процедура могла бы нарушить.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 12 янв 2007, 15:07

Dimitry Sibiryakov писал(а):Совсем не вижу ни одного ПК, который эта процедура могла бы нарушить.
А это что

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

ALTER TABLE TESTS ADD CONSTRAINT PK_TESTS PRIMARY KEY (TESTID);

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

Сообщение Dimitry Sibiryakov » 12 янв 2007, 15:46

Не эта, предыдущая.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 12 янв 2007, 16:44

Dimitry Sibiryakov писал(а):Не эта, предыдущая.
А там вот это

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

INSERT INTO SEARCH_QUERY_RESULTS (QUERY_ID, TABLE_FK, ATTRIBUTE_FK, WEIGHT, WORD_COUNT)
    SELECT :QUERY_ID, ST.TABLE_ID, SA.ATTRIBUTE_ID, PS.WEIGHT, PS.WORD_COUNT

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 12 янв 2007, 22:45

avenger писал(а):Хотя нет, при выполнении

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

SELECT RESULT_COUNT FROM INSERT_ID(1)
UNION ALL
SELECT RESULT_COUNT FROM INSERT_ID(1)
Возвращает результат 1, null
первая запись фетчится успешно, на фетче второй выбрасывается ошибка "primary key volation", в гриде показывается {1, null}. Второй нулл - это давний глюк IBExpert-а, на самом деле сервером возвращена одна строка.

Ответить