Skip to content

Commit 55ae0c7

Browse files
committed
ext/pdo: Implement PDO::ATTR_FETCH_TABLE_NAMES in PDO itself
Previously drivers had to implement this attribute themselves, and only MySQL and Firebird did so, in spite of support being generic. Remove driver-specific logic for this as well (Firebird's was harrowing).
1 parent 2663b42 commit 55ae0c7

9 files changed

Lines changed: 27 additions & 48 deletions

File tree

‎ext/pdo/pdo_dbh.c‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,13 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value, u
849849
}
850850
return false;
851851

852+
case PDO_ATTR_FETCH_TABLE_NAMES:
853+
if (!pdo_get_bool_param(&bval, value)) {
854+
return false;
855+
}
856+
dbh->fetch_table_names = bval;
857+
return true;
858+
852859
case PDO_ATTR_ORACLE_NULLS:
853860
if (!pdo_get_long_param(&lval, value)) {
854861
return false;
@@ -1002,6 +1009,9 @@ PHP_METHOD(PDO, getAttribute)
10021009
case PDO_ATTR_CASE:
10031010
RETURN_LONG(dbh->desired_case);
10041011

1012+
case PDO_ATTR_FETCH_TABLE_NAMES:
1013+
RETURN_BOOL(dbh->fetch_table_names);
1014+
10051015
case PDO_ATTR_ORACLE_NULLS:
10061016
RETURN_LONG(dbh->oracle_nulls);
10071017

‎ext/pdo/pdo_stmt.c‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ bool pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
150150
}
151151
}
152152

153+
/* prepend the table name if the attribute is set */
154+
if (stmt->dbh->fetch_table_names && stmt->columns[col].table && ZSTR_LEN(stmt->columns[col].table)) {
155+
/* XXX: Apply case to table as well? */
156+
zend_string *table_name = stmt->columns[col].table;
157+
zend_string *orig_name = stmt->columns[col].name;
158+
stmt->columns[col].name = strpprintf(0, "%pS.%pS", table_name, orig_name);
159+
zend_string_release(orig_name);
160+
}
161+
153162
/* update the column index on named bound parameters */
154163
if (stmt->bound_columns) {
155164
struct pdo_bound_param_data *param;

‎ext/pdo/php_pdo_driver.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,9 @@ struct _pdo_dbh_t {
458458
/* when set, convert int/floats to strings */
459459
bool stringify:1;
460460

461+
/* fetch table names; prepends to returned col name */
462+
bool fetch_table_names:1;
463+
461464
/* bitmap for pdo_param_event(s) to skip in dispatch_param_event */
462465
uint8_t skip_param_evt;
463466

‎ext/pdo_firebird/firebird_driver.c‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,13 +1094,6 @@ static bool pdo_firebird_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val
10941094
}
10951095
return true;
10961096

1097-
case PDO_ATTR_FETCH_TABLE_NAMES:
1098-
if (!pdo_get_bool_param(&bval, val)) {
1099-
return false;
1100-
}
1101-
H->fetch_table_names = bval;
1102-
return true;
1103-
11041097
case PDO_FB_ATTR_DATE_FORMAT:
11051098
{
11061099
zend_string *str = zval_try_get_string(val);
@@ -1258,10 +1251,6 @@ static int pdo_firebird_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
12581251
}
12591252
return -1;
12601253

1261-
case PDO_ATTR_FETCH_TABLE_NAMES:
1262-
ZVAL_BOOL(val, H->fetch_table_names);
1263-
return 1;
1264-
12651254
case PDO_FB_ATTR_DATE_FORMAT:
12661255
ZVAL_STRING(val, H->date_format ? H->date_format : PDO_FB_DEF_DATE_FMT);
12671256
return 1;

‎ext/pdo_firebird/firebird_statement.c‎

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -304,27 +304,14 @@ static int pdo_firebird_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
304304
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
305305
struct pdo_column_data *col = &stmt->columns[colno];
306306
XSQLVAR *var = &S->out_sqlda.sqlvar[colno];
307-
int colname_len;
308-
char *cp;
309307

310308
if ((var->sqltype & ~1) == SQL_TEXT) {
311309
var->sqltype = SQL_VARYING | (var->sqltype & 1);
312310
}
313-
colname_len = (S->H->fetch_table_names && var->relname_length)
314-
? (var->aliasname_length + var->relname_length + 1)
315-
: (var->aliasname_length);
316311
col->precision = -var->sqlscale;
317312
col->maxlen = var->sqllen;
318-
col->name = zend_string_alloc(colname_len, 0);
313+
col->name = zend_string_init(var->aliasname, var->aliasname_length, 0);
319314
col->table = zend_string_init(var->relname, var->relname_length, 0);
320-
cp = ZSTR_VAL(col->name);
321-
if (colname_len > var->aliasname_length) {
322-
memmove(cp, var->relname, var->relname_length);
323-
cp += var->relname_length;
324-
*cp++ = '.';
325-
}
326-
memmove(cp, var->aliasname, var->aliasname_length);
327-
*(cp+var->aliasname_length) = '\0';
328315

329316
return 1;
330317
}

‎ext/pdo_firebird/php_pdo_firebird_int.h‎

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,7 @@ typedef struct {
7777

7878
unsigned sql_dialect:2;
7979

80-
/* prepend table names on column names in fetch */
81-
unsigned fetch_table_names:1;
82-
83-
unsigned _reserved:29;
80+
unsigned _reserved:30;
8481

8582
pdo_firebird_error_info einfo;
8683
} pdo_firebird_db_handle;

‎ext/pdo_mysql/mysql_driver.c‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -460,13 +460,6 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
460460
((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = bval;
461461
PDO_DBG_RETURN(true);
462462

463-
case PDO_ATTR_FETCH_TABLE_NAMES:
464-
if (!pdo_get_bool_param(&bval, val)) {
465-
PDO_DBG_RETURN(false);
466-
}
467-
((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = bval;
468-
PDO_DBG_RETURN(true);
469-
470463
#ifdef PDO_USE_MYSQLND
471464
case PDO_ATTR_STRINGIFY_FETCHES:
472465
if (!pdo_get_bool_param(&bval, val)) {
@@ -583,10 +576,6 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
583576
}
584577
#endif
585578

586-
case PDO_ATTR_FETCH_TABLE_NAMES:
587-
ZVAL_BOOL(return_value, H->fetch_table_names);
588-
break;
589-
590579
default:
591580
PDO_DBG_RETURN(0);
592581
}

‎ext/pdo_mysql/mysql_statement.c‎

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -644,16 +644,12 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
644644
}
645645
for (i = 0; i < stmt->column_count; i++) {
646646

647-
if (S->H->fetch_table_names) {
648-
cols[i].name = strpprintf(0, "%s.%s", S->fields[i].table, S->fields[i].name);
649-
} else {
650647
#ifdef PDO_USE_MYSQLND
651-
cols[i].name = zend_string_copy(S->fields[i].sname);
648+
cols[i].name = zend_string_copy(S->fields[i].sname);
652649
#else
653-
cols[i].name = zend_string_init(S->fields[i].name, S->fields[i].name_length, 0);
650+
cols[i].name = zend_string_init(S->fields[i].name, S->fields[i].name_length, 0);
654651
#endif
655-
cols[i].table = zend_string_init(S->fields[i].table, S->fields[i].table_length, 0);
656-
}
652+
cols[i].table = zend_string_init(S->fields[i].table, S->fields[i].table_length, 0);
657653

658654
cols[i].precision = S->fields[i].decimals;
659655
cols[i].maxlen = S->fields[i].length;

‎ext/pdo_mysql/php_pdo_mysql_int.h‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ typedef struct {
103103
unsigned attached:1;
104104
unsigned buffered:1;
105105
unsigned emulate_prepare:1;
106-
unsigned fetch_table_names:1;
107106
unsigned local_infile:1;
108107
#ifndef PDO_USE_MYSQLND
109108
zend_ulong max_buffer_size;

0 commit comments

Comments
 (0)