powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Руководство по языку SQL СУБД Firebird 3.0
25 сообщений из 345, страница 5 из 14
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014013
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНе совсем так. 1 диалект. В общем-то конечно не совсем тот же, но и не всегда BIGINT.Тогда лучше по диалектам отдельно расписать.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014018
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

там не в диалекте дело. Если в 3 диалекте тип FLOAT будешь суммировать получится DOUBLE. Вот в 3 ем диалекте

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL> set sqlda_display on;
SQL> select sum(0.23465) over() from rdb$fields rows 1;

INPUT message field count: 0

OUTPUT message field count: 1
01: sqltype: 580 INT64 Nullable scale: -5 subtype: 0 len: 8
  :  name: SUM  alias: SUM
  : table:   owner:

                  SUM
=====================
             45.28745

SQL> select sum(cast(0.23465 as float)) over() from rdb$fields rows 1;

INPUT message field count: 0

OUTPUT message field count: 1
01: sqltype: 480 DOUBLE Nullable scale: 0 subtype: 0 len: 8
  :  name: SUM  alias: SUM
  : table:   owner:

                    SUM
=======================
      45.28745017945766

SQL>
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014056
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

добавил всё кроме агрегатов в оконных функциях. Во первых там не самое удачное место ибо описываются именно агрегатные функции, предложение окна там добавлено только потому что оно может использоваться. Во вторых надо дополнительно исследовать этот вопрос. Я ещё посмотрю что у других СУБД по этому поводу.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014134
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В раздел "Операторы управления пользователями" неплохо бы добавить, что:

1) усеров теперь можно вводить с non-ascii символами. Однако из-за вот этого:
Код: plaintext
1.
2.
SQL> show table sec$users;
SEC$USER_NAME                   (RDB$USER) CHAR( 31 ) CHARACTER SET  UNICODE_FSS  Nullable
. . .
-- максимальная длина логина будет определяться тем, сколько байт отводится на 1 символ в unicode-кодировке.
Для кириллицы отводится два байта на символ, поэтому вот этот вариант:
Код: plaintext
SQL> create or alter user "ВасяПупкинКулха" password '123';
-- прокатывает, а вот этот обломится:
Код: plaintext
1.
2.
3.
4.
SQL> create or alter user "ВасяПупкинКулха ц " password '123';
Statement failed, SQLSTATE = 22001
arithmetic exception, numeric overflow, or string truncation
-string right truncation
-expected length 31, actual 16
(перед этими танцами, конечно, необходимо делать chcp 1251 и запускать isql -ch win1251, либо делатьв isql'e до коннекта 'set names win1251'; иначе прилетит швабра 'malformed string').

2) непривилегированный усер может поменять свой пароль и атрибуты (firstname, lastname + теги):
Код: plaintext
1.
2.
SQL> alter user "ВасисуалийПупка" firstname 'Vasisualiy';
SQL> alter user "ВасисуалийПупка" password '000';
SQL> alter user "ВасисуалийПупка" tags( city = 'Balaha', favorite_group = 'Deep Purple');

Но он не может сделать себя inactive или грохнуть - получит "no permission for <...> access to TABLE <...>".
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014147
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg 230Замечание о равенстве

Оператор "=", который явно используется во многих условиях соединении и неявно
в соединениях именованными столбцами и естественных соединениях, только при
сравнении значений со значениями.
В соответствии со стандартом SQL, NULL не
является значением и, следовательно, два значения NULL не равны и ни неравны
друг с другом.В выделенном тексте пропущено какое-то слово. Может, имелось в виду это: "Оператор "=", который <...>, ДАЁТ ОЖИДАЕМЫЙ РЕЗУЛЬТАТ только при сравнении значений со значениями (а не с NULL)" - ?
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014152
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу в доке замечания о том, что в 3.0 запрещено юзать смешанные джойны. Об этом говорится в RN ("Prohibit Edgy Mixing of Implicit/Explicit Joins"), также см. CORE-2812
Ну, и пример для "забавы мозга" можно привести:

Код: plaintext
1.
2.
3.
4.
5.
recreate table t1(id int); 
commit;
insert into t1 values( 1 ); 
commit;
select a.id from t1  a , t1  b  join t1  c  on a.id=c.id where a.id=b.id; -- этот завалится
select a.id from t1  b , t1  a  join t1  c  on a.id=c.id where a.id=b.id; -- а этот - отработает без ошибок :-)
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014166
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдобавил всё кроме агрегатов в оконных функциях.Про rank(), pg. 424, - что там, будешь исправлять фразу про его вычисление или так оставишь ?
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014193
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидСимонов Денисдобавил всё кроме агрегатов в оконных функциях.Про rank(), pg. 424, - что там, будешь исправлять фразу про его вычисление или так оставишь ?

посмотрю ещё вечерком сегодня. Это из Release Notes вроде фраза. Надо бы посмотреть как оно описано в других СУБД.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014195
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидpg 230Замечание о равенстве

Оператор "=", который явно используется во многих условиях соединении и неявно
в соединениях именованными столбцами и естественных соединениях, только при
сравнении значений со значениями.
В соответствии со стандартом SQL, NULL не
является значением и, следовательно, два значения NULL не равны и ни неравны
друг с другом.В выделенном тексте пропущено какое-то слово. Может, имелось в виду это: "Оператор "=", который <...>, ДАЁТ ОЖИДАЕМЫЙ РЕЗУЛЬТАТ только при сравнении значений со значениями (а не с NULL)" - ?

это кривоватый перевод того что Paul писал. Посмотрю сегодня ещё раз как там в оригинале написано.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014198
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

про смешения джойнов я в обзоре фич FB3 писал. Там причём не все смешанные виды джойнов запрещены, а только самые кривые. Но лучше считать что все.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014280
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ раздел "Операторы управления пользователями" неплохо бы добавить, что:

1) усеров теперь можно вводить с non-ascii символами. Однако из-за вот этого:
Код: plaintext
1.
2.
SQL> show table sec$users;
SEC$USER_NAME                   (RDB$USER) CHAR( 31 ) CHARACTER SET  UNICODE_FSS  Nullable
. . .
-- максимальная длина логина будет определяться тем, сколько байт отводится на 1 символ в unicode-кодировке.
Для кириллицы отводится два байта на символ, поэтому вот этот вариант:
Код: plaintext
SQL> create or alter user "ВасяПупкинКулха" password '123';


эта байда не только для имён пользователей, но и для всех объектов метаданных. В тройке здесь вряд ли что-то правится будет. Может быть в 4ке перейдут на внутреннюю кодировку UTF-8 и увеличат максимальный размер идентификаторов.

Таблоид2) непривилегированный усер может поменять свой пароль и атрибуты (firstname, lastname + теги):
Но он не может сделать себя inactive или грохнуть - получит "no permission for <...> access to TABLE <...>".

ну про грохнуть это в операторе DROP USER написано. Про INACTIVE добавлю
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014405
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg 310BEGIN ... END
. . .
Блоки могут быть вложенными, глубина вложения не ограничена.я бы не был столь категоричен :-)
Хотя пример ниже - чистой воды издевательство и за гранью добра и зла, но таки вот:

1) батник, который генерит .sql-скрипт с begin-end блоками необходимого уровня вложенности:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
@echo off
setlocal enabledelayedexpansion enableextensions
cls
set fq=%1
if .%fq%.==.. set fq=3
set sql=%~n0.tmp

del %sql% 2>nul
echo recreate exception ex_test 'Hi from Mariana Trench, depth=@1';>>%sql%
echo recreate sequence g;>>%sql%
echo commit;>>%sql%
echo set term ^^;>>%sql%
echo execute block as>>%sql%
echo declare n int = 0;>>%sql%
echo begin>>%sql%
for /l %%i in (1, 1, %fq%) do ( 
  echo begin -- level = %%i>>%sql%
  echo   n = gen_id(g, 1^);>>%sql%
)
for /l %%i in (%fq%, -1, 1) do (
  if .%%i.==.%fq%. echo exception ex_test using( n ^);>>%sql%
  echo end -- level = %%i>>%sql%
)

echo end^^>>%sql%
echo set term ;^^>>%sql%
echo commit;>>%sql%

При запуске его без параметров будет создан код в три уровня вложенности:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
recreate exception ex_test 'Hi from Mariana Trench, depth=@1';
recreate sequence g;
commit;
set term ^;
execute block as
declare n int = 0;
begin
begin -- level = 1
  n = gen_id(g, 1);
begin -- level = 2
  n = gen_id(g, 1);
begin -- level = 3
  n = gen_id(g, 1);
exception ex_test using( n );
end -- level = 3
end -- level = 2
end -- level = 1
end^
set term ;^
commit;


2) генерим теперь мега-монстра, задавая аргумент = 32000 (да, 32 тысячи уровней :)). Это будет файлик размером 2 Мб - см аттач.
3) запускаем на пустой базе: isql /3333:e30 -i nested_blocks.tmp

Можно перед "3)" открыть соседнее окошко, чтобы глядеть, как будет меняться значение генератора по мере выполнения блока "в глубину".
Только... никак оно не будут меняться! Примерно 30-40 сек значение по show sequ так и будет торчать в нуле, а затем команда 'show sequ' вообще перестанет что-либо выдавать - и наступит глухой висяк. Более того, с этого момента станет невозможным:
1) подключение к этой базе;
2) подключение или создание вообще любой другой базы по удаленному протоколу для данного инстанса ФБ (!)
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014408
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидчистой воды издевательство и за гранью добра и злаps. а еще и службу ФБ при этом не остановить, только килянием в PE...
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014414
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очередной вариант на тему "уложу сервер одним запросом"?
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014416
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

>BEGIN..END

ты правда считаешь что такую ересь надо документировать? "Не ограничено" это в разумных пределах. Никто такую процедуру написать руками не сможет и да поддерживать её не реально.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014424
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мало ему того, что разработчикам мозг выносит, так теперь и до парсера очередь дошла.

снимите шляпы! обнажите головы! сейчас состоится вынос тела моцга! (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014430
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если количество вложенных BEGIN..END превышает 10 уже стоит задуматься над сменой консерватории. Ну разбить процедуру на несколько, или может логические условия по возможности объединить.

Теперь про скрипт создающий мегапроцедуры. Когда такое видишь уже начинаешь жалеть о том что лимит на текст запроса в 64K сняли. Хотя для пакетов это было необходимо.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014445
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы "оно" в ответ на 32к уровней вывалилось с ошибкой, или с багчеком или вообще ФБ бы грохнулся, то я бы тихо промолчал :)
Но тут - висяк, причём конкретный такой: ни к одной из баз подключиться больше не могу. При том, что проц не загружен, вообще.
Такие вот делы...
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014470
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

это не к доке вопросы. Пиши трекеру.

Для execute block это может быть критично, для объектов метаданных нет, потому как создать объекты метаданных в FB3 может только SYSDBA, владелец базы, пользователь с ролью RDB$ADMIN и кому те выданы права grant create ...
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014506
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисэто не к доке вопросы. Пиши трекеру.Трекер я успею посетить, но к доке таки просьба есть: убери оттуда слова "глубина неограниченна". На вышеприведенном батнике у мну получается, что её лимит ~12240 уровня для 32 битного ФБ на винде, и вроде как свыше 15000 для 64-битного linux-инстанса.

После незначительного превышения числа уровней (не до 32 к, конечно):
1) на винде лезет спасительное:
Statement failed, SQLSTATE = HY001
Stack overflow. The resource requirements of the runtime stack have exceeded the memory available to it.
("спасительное" - потому что это гораздо лучше, чем глухой висяк!)
2) на линухе - печалька про "error reading data from connection". При этом создался коредамп размером 170 Мб, а каким будет размер у бактрассы - хз, до сих пор формируется, уже больше 350 Мб :)

Так что пропиши, плз, что дескать "уровней может быть достаточно много, но не следует превышать их число разумным пределом (10-15)".
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014607
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПиши трекеру. Сбацал... Теперь побьют, наверное... С вердиктом "Won't fix" ...
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014668
Таблоид
Код: plaintext
SQL> create or alter user "ВасяПупкинКулха" password '123';
-- прокатывает, а вот этот обломится:
Код: plaintext
1.
2.
3.
4.
SQL> create or alter user "ВасяПупкинКулха ц " password '123';
Statement failed, SQLSTATE = 22001
arithmetic exception, numeric overflow, or string truncation
-string right truncation
-expected length 31, actual 16

Кто бы Trusted Auth потестировал, на предмет адекватности работы с длинными именами win-пользователей, типа "Фамилия Имя Отчество". Возможно там всё плохо.
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014686
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pp 311-312IF ... THEN ... ELSE
. . .
IF (<condition>)
THEN <compound_statement>
[ELSE <compound_statement>
. . .
сompound_statement Оператор или блок операторовПосле выделенного слова предлагаю добавить: "(для ELSE - можно указать следующий IF)", т.е. я вот про это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute block returns(how_much varchar(20)) as
    declare n int;
begin
    n = rand()*1000;
    if (n < 100) then how_much = 'poor';
    else  if  ( n < 300 ) then how_much = 'middle';
    else  if  ( n < 700 ) then how_much = 'optimal';
    else how_much = 'high';
    suspend;
end
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014814
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидpp 311-312IF ... THEN ... ELSE
. . .
IF (<condition>)
THEN <compound_statement>
[ELSE <compound_statement>
. . .
сompound_statement Оператор или блок операторовПосле выделенного слова предлагаю добавить: "(для ELSE - можно указать следующий IF)", т.е. я вот про это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute block returns(how_much varchar(20)) as
    declare n int;
begin
    n = rand()*1000;
    if (n < 100) then how_much = 'poor';
    else  if  ( n < 300 ) then how_much = 'middle';
    else  if  ( n < 700 ) then how_much = 'optimal';
    else how_much = 'high';
    suspend;
end


следующий IF как раз и является оператором. Не вижу противоречий
...
Рейтинг: 0 / 0
ANN Руководство по языку SQL СУБД Firebird 3.0
    #39014848
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто мысльКто бы Trusted Auth потестировал, на предмет адекватности работы с длинными именами win-пользователей, типа "Фамилия Имя Отчество". Возможно там всё плохо.У меня получился взлёт TrustedAuth только при выполнении следующих условий:
1) коннект идёт к localhost, а не к другому хосту. При попытке коннекта не к localhost - "your user name / password траляля, идите к вашему сисдбаю"
и
2) имя OS-усера записано только в ascii-символах. Если оно есть "ВасисуалийПупка", то выдать его в isql'е не получится - malformed string (при том, что предварительно в консоли делаю chcp 1251 и коннект идёт с -ch win1251).

Короче, кому интересно - трахайтесь сами с этим trusted auth, "изабэлло" гарантированно )
...
Рейтинг: 0 / 0
25 сообщений из 345, страница 5 из 14
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Руководство по языку SQL СУБД Firebird 3.0
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]