}
}
+static zend_always_inline zend_string *zend_string_separate(zend_string *s, bool persistent)
+{
+ if (ZSTR_IS_INTERNED(s) || GC_REFCOUNT(s) > 1) {
+ if (!ZSTR_IS_INTERNED(s)) {
+ GC_DELREF(s);
+ }
+ return zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent);
+ }
+
+ zend_string_forget_hash_val(s);
+ return s;
+}
+
static zend_always_inline zend_string *zend_string_realloc(zend_string *s, size_t len, bool persistent)
{
zend_string *ret;
/* if we are applying case conversions on column names, do so now */
if (stmt->dbh->native_case != stmt->dbh->desired_case && stmt->dbh->desired_case != PDO_CASE_NATURAL) {
- char *s = ZSTR_VAL(stmt->columns[col].name);
-
+ zend_string *orig_name = stmt->columns[col].name;
switch (stmt->dbh->desired_case) {
- case PDO_CASE_UPPER:
- while (*s != '\0') {
- *s = toupper(*s);
- s++;
- }
- break;
case PDO_CASE_LOWER:
+ stmt->columns[col].name = zend_string_tolower(orig_name);
+ zend_string_release(orig_name);
+ break;
+ case PDO_CASE_UPPER: {
+ stmt->columns[col].name = zend_string_separate(orig_name, 0);
+ char *s = ZSTR_VAL(stmt->columns[col].name);
while (*s != '\0') {
- *s = tolower(*s);
+ *s = toupper(*s);
s++;
}
break;
- default:
- ;
+ }
+ EMPTY_SWITCH_DEFAULT_CASE()
}
}
if (S->H->fetch_table_names) {
cols[i].name = strpprintf(0, "%s.%s", S->fields[i].table, S->fields[i].name);
} else {
+#ifdef PDO_USE_MYSQLND
+ cols[i].name = zend_string_copy(S->fields[i].sname);
+#else
cols[i].name = zend_string_init(S->fields[i].name, S->fields[i].name_length, 0);
+#endif
}
cols[i].precision = S->fields[i].decimals;