Skip to content

Commit c2f56d0

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Add support for Interbase 1 dialect
2 parents b897d19 + 3fb42a3 commit c2f56d0

File tree

4 files changed

+76
-8
lines changed

4 files changed

+76
-8
lines changed

ext/pdo_firebird/firebird_driver.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const char *sql, size_t s
415415
}
416416

417417
/* prepare the statement */
418-
if (isc_dsql_prepare(H->isc_status, &H->tr, s, 0, new_sql, PDO_FB_DIALECT, out_sqlda)) {
418+
if (isc_dsql_prepare(H->isc_status, &H->tr, s, 0, new_sql, H->sql_dialect, out_sqlda)) {
419419
RECORD_ERROR(dbh);
420420
efree(new_sql);
421421
return 0;
@@ -622,6 +622,7 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /*
622622
{ "dbname", NULL, 0 },
623623
{ "charset", NULL, 0 },
624624
{ "role", NULL, 0 },
625+
{ "dialect", "3", 0 },
625626
{ "user", NULL, 0 },
626627
{ "password", NULL, 0 }
627628
};
@@ -630,14 +631,14 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /*
630631

631632
pdo_firebird_db_handle *H = dbh->driver_data = pecalloc(1,sizeof(*H),dbh->is_persistent);
632633

633-
php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 5);
634+
php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 6);
634635

635-
if (!dbh->username && vars[3].optval) {
636-
dbh->username = pestrdup(vars[3].optval, dbh->is_persistent);
636+
if (!dbh->username && vars[4].optval) {
637+
dbh->username = pestrdup(vars[4].optval, dbh->is_persistent);
637638
}
638639

639-
if (!dbh->password && vars[4].optval) {
640-
dbh->password = pestrdup(vars[4].optval, dbh->is_persistent);
640+
if (!dbh->password && vars[5].optval) {
641+
dbh->password = pestrdup(vars[5].optval, dbh->is_persistent);
641642
}
642643

643644
do {
@@ -658,6 +659,11 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /*
658659
}
659660
}
660661

662+
H->sql_dialect = PDO_FB_DIALECT;
663+
if (vars[3].optval) {
664+
H->sql_dialect = atoi(vars[3].optval);
665+
}
666+
661667
/* fire it up baby! */
662668
if (isc_attach_database(H->isc_status, 0, vars[0].optval, &H->db,(short)(dpb-dpb_buffer), dpb_buffer)) {
663669
break;

ext/pdo_firebird/firebird_statement.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,9 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
372372

373373
*ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
374374

375-
if (n >= 0) {
375+
if ((var->sqltype & ~1) == SQL_DOUBLE) {
376+
*len = slprintf(*ptr, CHAR_BUF_LEN, "%.*F", -var->sqlscale, *(double*)var->sqldata);
377+
} else if (n >= 0) {
376378
*len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d.%0*" LL_MASK "d",
377379
n / f, -var->sqlscale, n % f);
378380
} else if (n <= -f) {

ext/pdo_firebird/php_pdo_firebird_int.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ typedef struct {
8484
char *time_format;
8585
char *timestamp_format;
8686

87+
unsigned sql_dialect:2;
88+
8789
/* prepend table names on column names in fetch */
8890
unsigned fetch_table_names:1;
8991

90-
unsigned _reserved:31;
92+
unsigned _reserved:29;
9193

9294
} pdo_firebird_db_handle;
9395

ext/pdo_firebird/tests/dialect_1.phpt

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
--TEST--
2+
PDO_Firebird: support 1 sql dialect
3+
--SKIPIF--
4+
<?php require('skipif.inc');
5+
if (strpos(getenv('PDO_FIREBIRD_TEST_DSN'), 'dialect=1')===false) {
6+
die('skip: PDO_FIREBIRD_TEST_DSN must contain a string "dialect=1"');
7+
}
8+
?>
9+
--FILE--
10+
<?php
11+
require("testdb.inc");
12+
13+
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
14+
$dbh->setAttribute(PDO::FB_ATTR_TIMESTAMP_FORMAT, '%Y-%m-%d %H:%M:%S');
15+
16+
$sql =
17+
'SELECT
18+
1 as N,
19+
2.0 as F,
20+
cast(0.76 as numeric(15, 2)) as K,
21+
cast(\'2019-06-12\' as date) as DT
22+
FROM RDB$DATABASE';
23+
$query = $dbh->prepare($sql);
24+
$query->execute();
25+
$row = $query->fetch(\PDO::FETCH_OBJ);
26+
var_dump($row->N);
27+
var_dump($row->F);
28+
var_dump($row->K);
29+
var_dump($row->DT);
30+
31+
unset($query);
32+
33+
$dbh->exec('RECREATE TABLE test_d1(K numeric(15, 2), DT date)');
34+
$sql='INSERT INTO test_d1(K, DT) values(?, ?)';
35+
$query = $dbh->prepare($sql);
36+
$query->execute([0.76, '2019-06-12']);
37+
unset($query);
38+
39+
$sql='SELECT * FROM test_d1';
40+
$query = $dbh->prepare($sql);
41+
$query->execute();
42+
$row = $query->fetch(\PDO::FETCH_OBJ);
43+
var_dump($row->K);
44+
var_dump($row->DT);
45+
46+
unset($query);
47+
unset($dbh);
48+
echo "done\n";
49+
50+
?>
51+
--EXPECT--
52+
int(1)
53+
string(8) "2.000000"
54+
string(4) "0.76"
55+
string(19) "2019-06-12 00:00:00"
56+
string(4) "0.76"
57+
string(19) "2019-06-12 00:00:00"
58+
done

0 commit comments

Comments
 (0)