Skip to content

Commit 277a6e3

Browse files
committed
Bizzare case when msvc optimizer went berserk
1 parent 9f8047b commit 277a6e3

1 file changed

Lines changed: 22 additions & 17 deletions

File tree

ibase_query.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -567,20 +567,19 @@ static int _php_ibase_bind_array(zval *val, char *buf, zend_ulong buf_size, /* {
567567

568568
static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
569569
{
570-
BIND_BUF *buf = ib_query->bind_buf;
571-
XSQLDA *sqlda = ib_query->in_sqlda;
572-
570+
// BIND_BUF *buf = ib_query->bind_buf;
571+
// XSQLDA *sqlda = ib_query->in_sqlda;
573572
int i, array_cnt = 0, rv = SUCCESS;
574573

575-
for (i = 0; i < sqlda->sqld; ++i) { /* bound vars */
574+
for (i = 0; i < ib_query->in_sqlda->sqld; ++i) { /* bound vars */
576575
zval *b_var = &b_vars[i];
577-
XSQLVAR *var = &sqlda->sqlvar[i];
576+
XSQLVAR *var = &ib_query->in_sqlda->sqlvar[i];
578577

579578
// We need keep track of original type because XSQLVAR type could get modified
580579
var->sqltype = ib_query->sql_types[i];
581580

582-
var->sqlind = &buf[i].nullind;
583-
var->sqldata = (void*)&buf[i].val;
581+
var->sqlind = &ib_query->bind_buf[i].nullind;
582+
var->sqldata = (void*)&ib_query->bind_buf[i].val;
584583

585584
/* check if a NULL should be inserted */
586585
switch (Z_TYPE_P(b_var)) {
@@ -613,7 +612,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
613612
if (! force_null) break;
614613

615614
case IS_NULL:
616-
buf[i].nullind = -1;
615+
*var->sqlind = -1;
617616

618617
if (var->sqltype & SQL_ARRAY) ++array_cnt;
619618

@@ -622,7 +621,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
622621

623622
/* if we make it to this point, we must provide a value for the parameter */
624623

625-
buf[i].nullind = 0;
624+
*var->sqlind = 0;
626625

627626
switch (var->sqltype & ~1) {
628627
struct tm t;
@@ -663,14 +662,14 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
663662

664663
switch (var->sqltype & ~1) {
665664
default: /* == case SQL_TIMESTAMP */
666-
isc_encode_timestamp(&t, &buf[i].val.tsval);
665+
isc_encode_timestamp(&t, &ib_query->bind_buf[i].val.tsval);
667666
break;
668667
case SQL_TYPE_DATE:
669-
isc_encode_sql_date(&t, &buf[i].val.dtval);
668+
isc_encode_sql_date(&t, &ib_query->bind_buf[i].val.dtval);
670669
break;
671670
case SQL_TYPE_TIME:
672671
// TODO: case SQL_TIME_TZ:
673-
isc_encode_sql_time(&t, &buf[i].val.tmval);
672+
isc_encode_sql_time(&t, &ib_query->bind_buf[i].val.tmval);
674673
break;
675674
}
676675
continue;
@@ -680,7 +679,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
680679
convert_to_string(b_var);
681680

682681
if (Z_STRLEN_P(b_var) != BLOB_ID_LEN ||
683-
!_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &buf[i].val.qval)) {
682+
!_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &ib_query->bind_buf[i].val.qval)) {
684683

685684
ibase_blob ib_blob = { 0 };
686685
ib_blob.type = BLOB_INPUT;
@@ -699,7 +698,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
699698
_php_ibase_error();
700699
return FAILURE;
701700
}
702-
buf[i].val.qval = ib_blob.bl_qd;
701+
ib_query->bind_buf[i].val.qval = ib_blob.bl_qd;
703702
}
704703
continue;
705704
#ifdef SQL_BOOLEAN
@@ -743,7 +742,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
743742
break;
744743
}
745744
case IS_NULL:
746-
buf[i].nullind = -1;
745+
*var->sqlind = -1;
747746
break;
748747
default:
749748
_php_ibase_module_error("Parameter %d: must be boolean", i+1);
@@ -759,7 +758,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
759758
convert_to_string(b_var);
760759

761760
if (Z_STRLEN_P(b_var) != BLOB_ID_LEN ||
762-
!_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &buf[i].val.qval)) {
761+
!_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &ib_query->bind_buf[i].val.qval)) {
763762

764763
_php_ibase_module_error("Parameter %d: invalid array ID",i+1);
765764
rv = FAILURE;
@@ -784,7 +783,7 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
784783
efree(array_data);
785784
return FAILURE;
786785
}
787-
buf[i].val.qval = array_id;
786+
ib_query->bind_buf[i].val.qval = array_id;
788787
efree(array_data);
789788
}
790789
++array_cnt;
@@ -796,6 +795,12 @@ static int _php_ibase_bind(ibase_query *ib_query, zval *b_vars) /* {{{ */
796795
var->sqldata = Z_STRVAL_P(b_var);
797796
var->sqllen = (ISC_SHORT)Z_STRLEN_P(b_var);
798797
var->sqltype = SQL_TEXT; // Here: sqltype is modfied, can't rely on it for next calls
798+
799+
// Another way to send string w/o converting base zval
800+
// zend_string *str = zval_get_string(b_var);
801+
// var->sqldata = ZSTR_VAL(str);
802+
// var->sqllen = (ISC_SHORT)ZSTR_LEN(str);
803+
// zend_string_release(str);
799804
} /* for */
800805
return rv;
801806
}

0 commit comments

Comments
 (0)