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

В связи с текущей возней с 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 пока все еще находится в неопределенном состоянии. Хотя сейчас больше положительных результатов, чем отрицательных 🙂

Вести с полей

Всех с последним днем осени.

Пошла восьмая неделя как откопал стюардесу DataProvider для EntityFrameworkCore.

Восстановил ранее написанный функционал и понял, что нужно все переделать.

Слабое утешение — ну хоть понял.

Вести с полей

Сегодня закончилось расширенное тестирование ранее выпущенного IBProvider v5.21 — за неделю проехало 10 проходов стандартного набора тестов.

Если не считать того, что 5 раз отвалилось подключение к FB3, вроде все нормально.

[28.10.2020 11:17:18] [summary] ------------------------------------------- [SUMMARY INFORMATION]
[28.10.2020 11:17:18] [summary] [TESTS]
[28.10.2020 11:17:18] [summary] EXECUTED      : 7028738
[28.10.2020 11:17:18] [summary] SUCCEEDED     : 7028243
[28.10.2020 11:17:18] [summary] FAILED        : 5 [ 5 error(s) ]
[28.10.2020 11:17:18] [summary] WITH WARNINGS : 490 [ 691 warning(s) ]
[28.10.2020 11:17:18] [summary] 
[28.10.2020 11:17:18] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:18] [summary] [TEST TIMES]
[28.10.2020 11:17:18] [summary] REAL          : 48583296148547 [56 day(s)05:32:09.6148547]
[28.10.2020 11:17:18] [summary] USER          : 9518832187500 [11 day(s)00:24:43.2187500]
[28.10.2020 11:17:18] [summary] KERNEL        : 3961859062500 [4 day(s)14:03:05.9062500]
[28.10.2020 11:17:18] [summary] TOTAL         : 13480691250000 [15 day(s)14:27:49.1250000]
[28.10.2020 11:17:19] 
[28.10.2020 11:17:19] [TEST HEAP] Test heap is empty
[28.10.2020 11:17:19] [TEST HEAP] Validate ... OK
[28.10.2020 11:17:19] [TEST HEAP] Destroy ... OK
[28.10.2020 11:17:19] 
[28.10.2020 11:17:19] [summary] ------------------------------------------- [PROCESS INFORMATION]
[28.10.2020 11:17:19] [summary] [VIRTUAL MEMORY]
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] PRIVATE BYTES      : 41088 KB       [40MB 128KB]
[28.10.2020 11:17:19] [summary] PEAK PRIVATE BYTES : 13167704 KB    [12GB 571MB 88KB]
[28.10.2020 11:17:19] [summary] VIRTUAL SIZE       : 4749840 KB     [4GB 542MB 528KB]
[28.10.2020 11:17:19] [summary] PAGE FAULT COUNT   : 1244261117
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:19] [summary] [HANDLES]
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] HANDLES            : 176
[28.10.2020 11:17:19] [summary] 
[28.10.2020 11:17:19] [summary] - - - - - - - - - - - - - - - - - - - - - -
[28.10.2020 11:17:19] [summary] TOTAL ERRORS  : 5
[28.10.2020 11:17:19] [summary] TOTAL WARNINGS: 691
[28.10.2020 11:17:19] [summary] FULL PASSES   : 10
[28.10.2020 11:17:19] [summary] GEN TESTS     : 82927510

В тестах использовался «глобальный» кэш SQL-запросов (sql_cache__scope=db).

Вести с полей

Привет всем.

Давным-давно, в октябре 98-го, я утром проснулся и подумал — «реляционная база данных должна быть организована по-другому». Время и несколько практических экспериментов показали, что да, идея рабочая. Более чем.

Вчера в процессе завершения новой подсистемы IBProvider, которая будет жить своей жизнью, пришлось доработать «подвал» модуля. А сегодня утром подумал — «чего я все хожу вокруг да около. По-хорошему, сервер объектов должен быть организован по-другому …».