diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c index da3542559fdb9..373c903aa5888 100755 --- a/ext/pdo_oci/oci_statement.c +++ b/ext/pdo_oci/oci_statement.c @@ -529,7 +529,7 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{ */ (param, OCI_DTYPE_PARAM, &colname, &namelen, OCI_ATTR_NAME, S->err)); col->precision = scale; - col->maxlen = data_size; + col->maxlen = ( data_size + 1 ) * sizeof(utext); col->namelen = namelen; col->name = estrndup((char *)colname, namelen); diff --git a/ext/pdo_oci/tests/bug54379.phpt b/ext/pdo_oci/tests/bug54379.phpt new file mode 100644 index 0000000000000..692a48da5259a --- /dev/null +++ b/ext/pdo_oci/tests/bug54379.phpt @@ -0,0 +1,48 @@ +--TEST-- +Bug #54379 (PDO_OCI: UTF-8 output gets truncated) +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + +try { + $db->exec("DROP TABLE test_utf8_trunc"); +} catch (Exception $e) { +} + + +$db->exec("CREATE TABLE test_utf8_trunc (col1 NVARCHAR2(20))"); +$db->exec("INSERT INTO test_utf8_trunc VALUES('12345678901234567890')"); +$db->exec("INSERT INTO test_utf8_trunc VALUES('あいうえおかきくけこさしすせそたちつてと')"); + +$stmt = $db->prepare("SELECT * FROM test_utf8_trunc"); + +$stmt->execute(); +var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); + +$db->exec("DROP TABLE test_utf8_trunc"); + +?> +--EXPECTF-- +array(2) { + [0]=> + array(1) { + ["COL1"]=> + string(20) "12345678901234567890" + } + [1]=> + array(1) { + ["COL1"]=> + string(40) "あいうえおかきくけこさしすせそたちつてと" + } +}