Re: More strict bind param count checking - Mailing list pgsql-odbc

From Hiroshi Inoue
Subject Re: More strict bind param count checking
Date
Msg-id 43A0EE2D.8090702@tpf.co.jp
Whole thread Raw
In response to More strict bind param count checking  (Ludek Finstrle <luf@pzkagis.cz>)
Responses Re: More strict bind param count checking
List pgsql-odbc
Hi Ludek, thanks to your recent effort to improve the psqlodbc driver.
Please let me comment on your patch a little.

Ludek Finstrle wrote:
> Hello,
>
>   I attach patch for more strict bind parameters count checking.
> It could avoid some bad behaviour (driver doesn't fail in some
> situations).
>
> Please review and comment
>
> Luf
>
>
> ------------------------------------------------------------------------
>
> diff -c psqlodbc.orig\convert.c psqlodbc\convert.c
> *** psqlodbc.orig\convert.c    Mon Dec 05 20:20:53 2005
> --- psqlodbc\convert.c    Wed Dec 14 00:58:24 2005
> ***************
> *** 1858,1866 ****
>               QB_Destructor(qb);
>               return SQL_ERROR;
>           }
> !         if (marker_count > 0)
>           {
> !             if (ipdopts && (ipdopts->allocated == marker_count))
>               {
>                   CVT_APPEND_CHAR(qb, '(');
>                   for (i = 0; i < marker_count; i++)
> --- 1858,1866 ----
>               QB_Destructor(qb);
>               return SQL_ERROR;
>           }
> !         if (ipdopts->allocated == marker_count)

Why are you using the operator '==' not '>=' ?
AFAIK there's no such limitation.

>           {
> !             if (marker_count > 0)
>               {
>                   CVT_APPEND_CHAR(qb, '(');
>                   for (i = 0; i < marker_count; i++)
> ***************
> *** 1871,1883 ****
>                   }
>                   CVT_APPEND_CHAR(qb, ')');
>               }
> !             else
> !             {
> !                 SC_set_error(stmt, STMT_COUNT_FIELD_INCORRECT, "The # of binded parameters < the # of parameter
markers");
> !                 SC_set_sqlstate(stmt, "07002");
> !                 QB_Destructor(qb);
> !                 return SQL_ERROR;
> !             }
>           }
>           CVT_APPEND_STR(qb, " as ");
>           for (qp->opos = 0; qp->opos < qp->stmt_len; qp->opos++)
> --- 1871,1884 ----
>                   }
>                   CVT_APPEND_CHAR(qb, ')');
>               }
> !         }
> !         else
> !         {
> !             CC_clear_error(stmt->hdbc);
> !             SC_set_error(stmt, STMT_COUNT_FIELD_INCORRECT, "The # of binded parameters < the # of parameter
markers");
> !             SC_set_sqlstate(stmt, "07002");
> !             QB_Destructor(qb);
> !             return SQL_ERROR;
>           }
>           CVT_APPEND_STR(qb, " as ");
>           for (qp->opos = 0; qp->opos < qp->stmt_len; qp->opos++)
> diff -c psqlodbc.orig\execute.c psqlodbc\execute.c
> *** psqlodbc.orig\execute.c    Tue Dec 06 21:53:30 2005
> --- psqlodbc\execute.c    Wed Dec 14 01:18:40 2005
> ***************
> *** 136,141 ****
> --- 136,143 ----
>       StatementClass *stmt = (StatementClass *) hstmt;
>       RETCODE        result;
>       CSTR func = "PGAPI_ExecDirect";
> +     IPDFields    *ipdopts;
> +     SWORD        marker_count;
>
>       mylog("%s: entering...\n", func);
>
> ***************
> *** 156,161 ****
> --- 158,175 ----
>
>       mylog("**** %s: hstmt=%u, statement='%s'\n", func, hstmt, stmt->statement);
>
> +     /* Check bind parameters count */
> +     if (SQL_SUCCESS != PGAPI_NumParams(stmt, &marker_count))
> +         return SQL_ERROR;
> +     ipdopts = SC_get_IPDF(stmt);
> +     if (ipdopts->allocated != marker_count)

Why are you using '!=' not '<' ?

> +     {
> +         CC_clear_error(stmt->hdbc);
> +         SC_set_error(stmt, STMT_COUNT_FIELD_INCORRECT, "The # of binded parameters < the # of parameter markers");
> +         SC_set_sqlstate(stmt, "07002");
> +         return SQL_ERROR;
> +     }
> +
>       /*
>        * If an SQLPrepare was performed prior to this, but was left in the
>        * premature state because an error occurred prior to SQLExecute then
> ***************
> *** 196,206 ****
> --- 210,234 ----
>       APDFields    *apdopts;
>       IPDFields    *ipdopts;
>       BOOL        prepare_before_exec = FALSE;
> +     SWORD        marker_count;
> +
>
>       *exec_end = FALSE;
>       conn = SC_get_conn(stmt);
>       mylog("%s: copying statement params: trans_status=%d, len=%d, stmt='%s'\n", func, conn->transact_status,
strlen(stmt->statement),stmt->statement); 
>
> +     /* Check bind parameters count */
> +     if (SQL_SUCCESS != PGAPI_NumParams(stmt, &marker_count))
> +         return SQL_ERROR;
> +     ipdopts = SC_get_IPDF(stmt);
> +     if (ipdopts->allocated != marker_count)

The same comment as the previous one.
In addtion, the check is not appropriate because Exec_with_parameter_resolved
 could be called with insufficient parameters.

> +     {
> +         CC_clear_error(stmt->hdbc);
> +         SC_set_error(stmt, STMT_COUNT_FIELD_INCORRECT, "The # of binded parameters < the # of parameter markers");
> +         SC_set_sqlstate(stmt, "07002");
> +         return SQL_ERROR;
> +     }
> +
>       /* save the cursor's info before the execution */
>       cursor_type = stmt->options.cursor_type;
>       scroll_concurrency = stmt->options.scroll_concurrency;


pgsql-odbc by date:

Previous
From: Tom Lane
Date:
Subject: Does postgresql-odbc work on 64-bit platforms?
Next
From: Ludek Finstrle
Date:
Subject: Re: More strict bind param count checking