Забить нельзя доделать

В этом месяца, без фанатизма, пилил очередную подсистему провайдера для EFcore — локальные варианты серверных арифметических операций. Сложение, вычитание, умножение и деление. Третий и первый диалекты.

Вроде все получалось и неделю назад, даже, появилось ложное ощущение что «пронесёт» и все получится 🙂

Не пронесло.

Вчера добрался до последнего этапа этой стадии (или наоборот, не суть) — деление для первого диалекта.

И (снова) нарвался на мину фундаментальные ограничения базовой технологии, лежащей в основе всего этого поделия — LINQ.

  1. Компилятор может самостоятельно выполнить часть работы с константами (преобразовать тип, выполнить арифметическию операцию) и передать результат работы в LINQ.
  2. В LINQ не передается информация о явном и неявном конвертировании.

Но обо все попорядку. Попробую описать проблему как можно короче. (далее…)

Семинар по возможностям InterBase

Позавчера посетил семинар по возможностям InterBase. Для расширения кругозора и все такое.

Особо не скучал.

По всей видимости рассказывали про

  1. Change View
  2. Шифрование

То есть про вещи 5 и 10 летней давности. Поправьте меня, если я ошибаюсь.

Change View, когда он появился, меня немного зацепил и я даже начал думать как его прикрутить к IBProvider. Как обычно, сразу наступил на грабли. А потом понял, что они этой хренью сломали АПИ. Ну и … с ними. Бестолочи.

В конце рассказали про future.

Обещают новые ADO.NET провайдеры (почему-то во множественном лице) и интеграцию с Visual Studio. Реально заинтреговали.

До упора не досидел и ушел — устал.

Потом долго думал про стюардессу и технологический предел каждой цивилизации.

Вести с полей

Процесс разработки провайдера для EFCore потихоньку движется вперед.

Протоптал одну из самых мутных частей реализации.

Едем дальше.

UPD. Чтобы два раза не вставать, хочу сказать СПАСИБО всем, кто не ждёт 🙂

Сравнение вещественных чисел

В связи с текущей возней с EFCore пришлось «освежить» понимание множества базовых вещей.

Одна из этих вещей — вещественные числа.

Задача

1. Добавляем запись с FLOAT колонкой.
2. Выбираем эту запись и сравниваем значение FLOAT колонки с ожидаемым значением. Ожидаемое float-значение передается в запросе в виде текста.

Выглядит это как-то так:

 const string c_valueSource="-3.40282347E+38";
 const float c_valueTarget=float.MinValue; //-3.40282347E+38

 System.Int64? testID=Helper__InsertRow(db,c_valueSource,c_valueTarget);

 var recs=db.testTable.Where(r => (float)(object)c_valueSource==r.COL_TARGET && r.TEST_ID==testID);

В конечном итоге, на сервер уезжает запрос вида:

SELECT "t"."TEST_ID", "t"."COL_VARCHAR_128", "t"."COL2_FLOAT"
FROM "TEST_MODIFY_ROW2" AS "t"
WHERE (-3.40282347E+38 = "t"."COL2_FLOAT") AND ("t"."TEST_ID" = CAST(:__testID_0 AS BIGINT))

То есть, вроде все путем. Но сервер возвращает 0 записей.

Почему, Карл? (далее…)

Улыбнуло

Обнаружил на хабре статью

… Были запуски под много чем от MySQL до покойного, наверное, Firebird

USUS (c) моё.

PS. Статью прочитал. Да, тяжко…

FB3. Округление преобразования строки в число

Привет всем.

Открыл для себя, что в FB3 пара запросов:

select cast('1.5' as integer) from dual
select cast(cast('1.5' as numeric(3,1)) as integer) from dual

возвращает двойку.

Точнее, про второй я как бы это знал и учитывал. А вот про первый нет …

Если мне не изменяет память, лет пятнадцать (а то и больше) вместо округления было обрезание.

IBProvider в первом случае округляет и, помню, мне говорили что я пру против сервера …


В общем, меня это настолько удивило, что я проверил на IB5.6.

Фух, память мне не изменяет.

«cast(‘1.5’ as integer)» возвращает 1.

«cast(cast(‘1.5’ as numeric(3,1)) as integer)» возвращает 2.

PS. Вот жеж …

Вести с полей

Привет всем.

С момента (ре)старта проекта по поддержке Entity Framework Core прошло четыре месяца. Нужно обновить текущее состояние.

В целом, фундамент сформирован процентов на … 70 и пока вроде все получается сделать так, как хочется. Ну, то есть, правильно 🙂

IBProvider v5.22

В личные кабинетах пользователей доступен новый релиз IBProvider — v5.22.

Изменения

  1. В схемах метаданных TABLES_INFO и INDEXES заполняется колонка CARDINALITY, которая позволяет оценить количество (уникальных) записей таблицы/индекса.
  2. В инсталляторах сборок vc16 (VS2019) обновлен VS CRT до версии 14.28.29334. Эта версия несовместима с Windows XP SP2. После недолгих размышлений было принято решение — «ну и ладно».

«Официальный» релиз на сайте будет опубликован попозже — решил по второму кругу прогнать тесты.

Вести с полей

Всех с последним днем января 🙂

Третий или четвертый день тупо смотрю на арифметику первого диалекта FB3.

Чудная она.

select 1+12345678 from dual

Сервер говорит, что колонка имеет тип INTEGER.

select cast(1+12345678 as varchar(64)) from dual

Сервер возвращает строку «12345679.00000000»

select BIN_AND(1+12345678,1) from dual

Сервер возвращает ошибку:

expression evaluation not supported
Arguments for BIN_AND must be integral types or NUMERIC/DECIMAL without scale


UPD. Ну и, наверное, чтобы не расслаблялся:

select cast(cast(1 as NUMERIC(1,0)) +cast(1 as NUMERIC(1,0)) as VARCHAR(64))  from dual

Сервер возвращает строку «2»

select cast(cast(1 as DECIMAL(1,0)) +cast(1 as DECIMAL(1,0)) as VARCHAR(64))  from dual

Сервер возвращает строку «2.000000000000000»

🙂

Вести с полей

Привет всем.

1. Вчера закончилось большое тестирование IBProvider v5.21.1. Ожидаемого чуда, в виде радикального ускорения работы, не случилось.

Даже получилось немного медленней, чем в прошлый раз. Потому что на этом компьютере достаточно активно работали работу.

Ну хоть не упало, уже хорошо 🙂

Process ID: 31684

[TEST HEAP] Initialize ... OK

[18.11.2020 13:21:59] [ExecuteTests] CommandLine:

target\ibp_oledb_test_vc16_x64_Release.exe  /thread_count 10 /log_file_prefix fb30-fb.direct-ram_w64_d3 /log_dir ..\_log\all\ /new_db_location "inet4://localhost/d:\database\ram\" /cn_str "provider=LCPI.IBProvider.5.Private.vc16.release;location=inet4://localhost/d:\database\ram\ibp_test_fb30_d3_all.gdb;user id=GAMER;password=vermut;ctype=win1251;temp_file_dir=d:\database\ram\temp;dbclient_type=fb.direct;icu_library=icuuc52.dll;wchars_in_utf8_symbol=2;sql_cache__scope=db" /oledb_svc_cmp "LCPI.OleDbServices.DataInitManager.Local.1.Private.vc16.release" /test *

[18.11.2020 13:21:59] [ExecuteTests] Test Mask  : [*]

[18.11.2020 13:21:59] [info] Provider DLL    :lcpi.ibprovider-v5_vc16_w64_prof_i.dll
[18.11.2020 13:21:59] [info] Provider Version:5.21.1.36328
[18.11.2020 13:21:59] [info] Server Name     :Firebird
[18.11.2020 13:21:59] [info] Server Version  :3.0.7.33388
[18.11.2020 13:21:59] [info] Client Name     :LCPI.IBProvider.RemoteFB
[18.11.2020 13:21:59] [info] Client Version  :5.21.1.36328
[18.11.2020 13:21:59] [info] Database ODS    :12.0
[18.11.2020 13:21:59] [info] Database Dialect:3
[18.11.2020 13:21:59] [info] ConnectionString:

provider=LCPI.IBProvider.5.Private.vc16.release;location=inet4://localhost/d:\database\ram\ibp_test_fb30_d3_all.gdb;user id=GAMER;password=vermut;ctype=win1251;temp_file_dir=d:\database\ram\temp;dbclient_type=fb.direct;icu_library=icuuc52.dll;wchars_in_utf8_symbol=2;sql_cache__scope=db

[18.11.2020 13:21:59] [ExecuteTests] 
[18.11.2020 13:21:59] [ExecuteTests] Enter [cancel] for interrupt execution
[18.11.2020 13:21:59] [ExecuteTests] 
[18.11.2020 13:21:59] Creation 10 thread(s)...
.......
[23.12.2020 17:55:44] [summary] ------------------------------------------- [SUMMARY INFORMATION]
[23.12.2020 17:55:44] [summary] [TESTS]
[23.12.2020 17:55:44] [summary] EXECUTED      : 7055997
[23.12.2020 17:55:44] [summary] SUCCEEDED     : 7055933
[23.12.2020 17:55:44] [summary] FAILED        : 0
[23.12.2020 17:55:44] [summary] WITH WARNINGS : 64 [ 92 warning(s) ]
[23.12.2020 17:55:44] [summary] 
[23.12.2020 17:55:44] [summary] - - - - - - - - - - - - - - - - - - - - - -
[23.12.2020 17:55:44] [summary] [TEST TIMES]
[23.12.2020 17:55:44] [summary] REAL          : 303948587548855 [351 day(s)19:00:58.7548855]
[23.12.2020 17:55:44] [summary] USER          : 42100834062500 [48 day(s)17:28:03.4062500]
[23.12.2020 17:55:44] [summary] KERNEL        : 36739262187500 [42 day(s)12:32:06.2187500]
[23.12.2020 17:55:44] [summary] TOTAL         : 78840096250000 [91 day(s)06:00:09.6250000]
[23.12.2020 17:55:45] 
[23.12.2020 17:55:45] [TEST HEAP] Test heap is empty
[23.12.2020 17:55:45] [TEST HEAP] Validate ... OK
[23.12.2020 17:55:45] [TEST HEAP] Destroy ... OK
[23.12.2020 17:55:45] 
[23.12.2020 17:55:45] [summary] ------------------------------------------- [PROCESS INFORMATION]
[23.12.2020 17:55:45] [summary] [VIRTUAL MEMORY]
[23.12.2020 17:55:45] [summary] 
[23.12.2020 17:55:45] [summary] PRIVATE BYTES      : 22500 KB       [21MB 996KB]
[23.12.2020 17:55:45] [summary] PEAK PRIVATE BYTES : 13081912 KB    [12GB 487MB 312KB]
[23.12.2020 17:55:45] [summary] VIRTUAL SIZE       : 4620360 KB     [4GB 416MB 72KB]
[23.12.2020 17:55:45] [summary] PAGE FAULT COUNT   : 1612880775
[23.12.2020 17:55:45] [summary] 
[23.12.2020 17:55:45] [summary] - - - - - - - - - - - - - - - - - - - - - -
[23.12.2020 17:55:45] [summary] [HANDLES]
[23.12.2020 17:55:45] [summary] 
[23.12.2020 17:55:45] [summary] HANDLES            : 176
[23.12.2020 17:55:45] [summary] 
[23.12.2020 17:55:45] [summary] - - - - - - - - - - - - - - - - - - - - - -
[23.12.2020 17:55:45] [summary] TOTAL ERRORS  : 0
[23.12.2020 17:55:45] [summary] TOTAL WARNINGS: 92
[23.12.2020 17:55:45] [summary] FULL PASSES   : 1
[23.12.2020 17:55:45] [summary] GEN TESTS     : 8292754

2. Проект для поддержки EntityFrameworkCore пока все еще находится в неопределенном состоянии. Хотя сейчас больше положительных результатов, чем отрицательных 🙂