ipdopts->parameters[ipar].decimal_digits = ibScale;
ipdopts->parameters[ipar].precision = 0;
ipdopts->parameters[ipar].scale = 0;
- if (0 == ipdopts->parameters[ipar].PGType)
- ipdopts->parameters[ipar].PGType = sqltype_to_pgtype(stmt, fSqlType);
#if (ODBCVER >= 0x0300)
switch (fCType)
{
SC_recycle_statement(stmt);
mylog("%s: ipar=%d, paramType=%d, fCType=%d, fSqlType=%d, cbColDef=%d, ibScale=%d,", func, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale);
- mylog("rgbValue=%p, pcbValue=%p\n", rgbValue, pcbValue);
+ mylog("rgbValue=%p(%d), pcbValue=%p\n", rgbValue, cbValueMax, pcbValue);
return SQL_SUCCESS;
}
IPDFields *ipdopts;
RETCODE ret = SQL_SUCCESS;
int num_params;
+ OID pgtype;
mylog("%s: entering...%d\n", func, ipar);
}
ipar--;
+ pgtype = PIC_get_pgtype(ipdopts->parameters[ipar]);
/*
* This implementation is not very good, since it is supposed to
* describe
/* parameter markers, not bound parameters. */
if (pfSqlType)
{
-inolog("[%d].SQLType=%d .PGType=%d\n", ipar, ipdopts->parameters[ipar].SQLType,
-ipdopts->parameters[ipar].PGType);
+inolog("[%d].SQLType=%d .PGType=%d\n", ipar, ipdopts->parameters[ipar].SQLType, pgtype);
if (ipdopts->parameters[ipar].SQLType)
*pfSqlType = ipdopts->parameters[ipar].SQLType;
- else if (ipdopts->parameters[ipar].PGType)
- *pfSqlType = pgtype_to_concise_type(stmt, ipdopts->parameters[ipar].PGType, PG_STATIC);
+ else if (pgtype)
+ *pfSqlType = pgtype_to_concise_type(stmt, pgtype, PG_STATIC);
else
{
ret = SQL_ERROR;
*pcbParamDef = 0;
if (ipdopts->parameters[ipar].SQLType)
*pcbParamDef = ipdopts->parameters[ipar].column_size;
- if (0 == *pcbParamDef && ipdopts->parameters[ipar].PGType)
- *pcbParamDef = pgtype_column_size(stmt, ipdopts->parameters[ipar].PGType, PG_STATIC, PG_STATIC);
+ if (0 == *pcbParamDef && pgtype)
+ *pcbParamDef = pgtype_column_size(stmt, pgtype, PG_STATIC, PG_STATIC);
}
if (pibScale)
*pibScale = 0;
if (ipdopts->parameters[ipar].SQLType)
*pibScale = ipdopts->parameters[ipar].decimal_digits;
- else if (ipdopts->parameters[ipar].PGType)
- *pibScale = pgtype_scale(stmt, ipdopts->parameters[ipar].PGType, -1);
+ else if (pgtype)
+ *pibScale = pgtype_scale(stmt, pgtype, -1);
}
if (pfNullable)
self->parameters[ipar].decimal_digits = 0;
self->parameters[ipar].precision = 0;
self->parameters[ipar].scale = 0;
- self->parameters[ipar].PGType = 0;
+ PIC_set_pgtype(self->parameters[ipar], 0);
}
int
#include "pgapifunc.h"
+/* Helper macro */
+#define getEffectiveOid(conn, fi) pg_true_type((conn), (fi)->columntype, FI_type(fi))
RETCODE SQL_API
}
if (FI_is_applicable(fi))
{
- fieldtype = pg_true_type(conn, fi->columntype, FI_type(fi));
+ fieldtype = getEffectiveOid(conn, fi);
if (NAME_IS_VALID(fi->column_alias))
col_name = GET_NAME(fi->column_alias);
else
return SQL_INVALID_HANDLE;
}
stmt_updatable = SC_is_updatable(stmt)
- /* The folllowing doesn't seem appropriate for client side cursors
+ /* The following doesn't seem appropriate for client side cursors
&& stmt->options.scroll_concurrency != SQL_CONCUR_READ_ONLY
*/
;
if (col_idx < irdflds->nfields && irdflds->fi)
fi = irdflds->fi[col_idx];
if (FI_is_applicable(fi))
- field_type = pg_true_type(conn, fi->columntype, FI_type(fi));
+ field_type = getEffectiveOid(conn, fi);
else
{
BOOL build_fi = FALSE;
if (FI_is_applicable(fi))
{
ti = fi->ti;
- field_type = pg_true_type(conn, fi->columntype, FI_type(fi));
+ field_type = getEffectiveOid(conn, fi);
}
mylog("colAttr: col %d field_type=%d fi,ti=%p,%p\n", col_idx, field_type, fi, ti);
int j;
ConnInfo *ci = &(conn->connInfo);
APDFields *apdopts;
+ IPDFields *ipdopts;
OID fieldtype = 0;
const char *bestitem = GET_NAME(ti->bestitem);
const char *bestqual = GET_NAME(ti->bestqual);
apdopts = SC_get_APDF(s.qstmt);
apdopts->param_bind_type = opts->bind_size;
apdopts->param_offset_ptr = opts->row_offset_ptr;
+ ipdopts = SC_get_IPDF(s.qstmt);
SC_set_delegate(s.stmt, s.qstmt);
+ extend_iparameter_bindings(ipdopts, num_cols);
for (i = j = 0; i < num_cols; i++)
{
if (used = bindings[i].used, used != NULL)
mylog("%d used=%d\n", i, *used);
if (*used != SQL_IGNORE && fi[i]->updatable)
{
- fieldtype = QR_get_field_type(s.res, i);
+ /* fieldtype = QR_get_field_type(s.res, i); */
+ fieldtype = getEffectiveOid(conn, fi[i]);
+ PIC_set_pgtype(ipdopts->parameters[j], fieldtype);
PGAPI_BindParameter(hstmt,
(SQLUSMALLINT) ++j,
SQL_PARAM_INPUT,
ConnInfo *ci;
ARDFields *opts = SC_get_ARDF(stmt);
APDFields *apdopts;
+ IPDFields *ipdopts;
BindInfoClass *bindings = opts->bindings;
FIELD_INFO **fi = SC_get_IRDF(stmt)->fi;
char addstr[4096];
apdopts = SC_get_APDF(s.qstmt);
apdopts->param_bind_type = opts->bind_size;
apdopts->param_offset_ptr = opts->row_offset_ptr;
+ ipdopts = SC_get_IPDF(s.qstmt);
SC_set_delegate(s.stmt, s.qstmt);
ci = &(conn->connInfo);
+ extend_iparameter_bindings(ipdopts, num_cols);
for (i = add_cols = 0; i < num_cols; i++)
{
if (used = bindings[i].used, used != NULL)
mylog("%d used=%d\n", i, *used);
if (*used != SQL_IGNORE && fi[i]->updatable)
{
- fieldtype = QR_get_field_type(s.res, i);
+ /* fieldtype = QR_get_field_type(s.res, i); */
+ fieldtype = getEffectiveOid(conn, fi[i]);
if (add_cols)
sprintf(addstr, "%s, \"%s\"", addstr, GET_NAME(fi[i]->column_name));
else
sprintf(addstr, "%s\"%s\"", addstr, GET_NAME(fi[i]->column_name));
+ PIC_set_pgtype(ipdopts->parameters[add_cols], fieldtype);
PGAPI_BindParameter(hstmt,
(SQLUSMALLINT) ++add_cols,
SQL_PARAM_INPUT,