PDO ODBC для IBM DB2 в iSeries вызывает segfault на сервере Ubuntu

мы пытаемся подключиться из системы Unix (Ubuntu) к DB2 на iSeries с PDO ODBC. Пока все в порядке. Если мы получаем NULL-значения в результирующем массиве, это приводит к segfault.

Вот некоторый тестовый код для воспроизведения segfault:

$pdo_dsn = "odbc:DRIVER={iSeries Access ODBC DRIVER};SYSTEM=***";
$pdo_username = "***";
$pdo_password = "***";
$pdo_dbh = new PDO(
    $pdo_dsn, 
    $pdo_username, 
    $pdo_password,
    array(
        PDO::ATTR_PERSISTENT => FALSE, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);
$pdo_query = "SET SCHEMA [SCHEMANAME]";
$pdo_params = array();
$pdo_stmt = $pdo_dbh->prepare($pdo_query);
$pdo_stmt_result = $pdo_stmt->execute($pdo_params);
$pdo_query = "SELECT * FROM [FIRSTTABLE] LEFT JOIN [OTHERTABLE] ON (1=2)";
$pdo_params = array();
$pdo_stmt = $pdo_dbh->prepare($pdo_query);
$pdo_stmt_result = $pdo_stmt->execute($pdo_params);
$pdo_result = $pdo_stmt->fetchAll(PDO::FETCH_ASSOC);

Последняя строка вызывает segfault!

php5[26525]: segfault at 2035000 ip 00007f8bf21f18d3 sp 00007fff78f1d3d8 error 6 in libc-2.15.so[7f8bf20a8000+1b5000]

Что мы сделали, чтобы исправить:

  1. Adding the following PDO-Attribute with no effect:
    1. PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING
  2. Activate the unixodbc.log and checked it. Query was successfull executed:
    1. Exit:[SQL_SUCCESS]
  3. Вставьте IFNULL в оператор SQL. Это устраняет проблему, но, по нашему мнению, не является практическим решением для продуктивных сред.

На данный момент: Из любой идеи. Показанный выше код отлично работает с XAMPP в Windows XP и Windos 7 без ошибок. Это не имеет значения, если мы используем PDO::ATTR_ORACLE_NULLS. Оба возможных варианта работают нормально, и массив результатов отображается, как и ожидалось.

Есть ли решения этой проблемы? Спасибо за любую помощь и идеи.

Дополнительная информация: Мы используем Ubuntu 12.04 LTS 64bit. Возможно ли, что эта ошибка возникает из-за ошибки в libc 64bit? Кажется, что скрипт обрывается "где-то там".


person emolah    schedule 29.01.2013    source источник


Ответы (1)


Ok. После нескольких часов тестирования и настройки дополнительных сред разработки мы обнаружили, что это проблема на 64-битных системах.

Система ожидала строгую 8-байтовую длину поля в ответе (fetchAll-функция), но получила 4-байтовую длину поля. Это вызывает segfault, упомянутый выше.

Настройка почти идентичной 32-битной среды была (временным) решением. Скрипт работает сейчас. Также атрибут PDO::ATTR_ORACLE_NULLS работает как положено.

Для производственной среды это означает ограничение ОЗУ до 4 ГБ :/

person emolah    schedule 30.01.2013
comment
Аналогично: [ссылка]stackoverflow.com/questions /10927983/ - person emolah; 30.01.2013
comment
Вы имели в виду 8-байтовый и 4-байтовый? - person WarrenT; 31.01.2013
comment
То же самое на RHEL: linuxquestions.org/questions/red-hat-31/ - person emolah; 25.03.2013