2. Fix a bug about UTF8 handling.
3. Wait a ReadyForQuery Message after errors correctly.
                    if (!QR_fetch_tuples(res, self, cursor))
                    {
                        CC_set_error(self, CONNECTION_COULD_NOT_RECEIVE, QR_get_message(res), func);
-                       ReadyToReturn = TRUE;
                        if (PORES_FATAL_ERROR == QR_get_rstatus(res))
                            retres = cmdres;
                        else
                            retres = NULL;
-                       break;
+                       aborted = TRUE;
                    }
                    query_completed = TRUE;
                }
 
 
    SC_no_fetchcursor(stmt);
    SC_no_pre_executable(stmt);
-   if (stmt->statement_type == STMT_TYPE_SELECT)
+   if (SC_returns_rows(stmt))
        SC_set_pre_executable(stmt);
    qb = &query_crt;
    qb->query_statement = NULL;
    new_statement = qb->query_statement;
 
    /* For selects, prepend a declare cursor to the statement */
-   if (stmt->statement_type == STMT_TYPE_SELECT && !stmt->internal)
+   if (SC_returns_rows(stmt) && !stmt->internal)
    {
        const char *opt_scroll = NULL_STRING, *opt_hold = NULL_STRING;
 
 
            ret = PARSE_REQ_FOR_INFO;
        else if (PROTOCOL_74(ci))
        {
-           if (STMT_TYPE_SELECT == stmt->statement_type)
+           if (SC_returns_rows(stmt))
            {
                if (ci->drivers.use_declarefetch)
                    return PARSE_REQ_FOR_INFO;
        }
        else
        {
-           if (STMT_TYPE_SELECT == stmt->statement_type &&
+           if (SC_returns_rows(stmt) &&
                (SQL_CURSOR_FORWARD_ONLY != stmt->options.cursor_type ||
                ci->drivers.use_declarefetch))
                ret = PREPARE_BY_THE_DRIVER;
 
                    else if (character >= 0xc0)
                        stat = 2;
                }
-               else if (stat > 2 &&
+               else if (stat >= 2 &&
                    character > 0x7f)
                    stat--;
                else
 
    BOOL    haskeyset = QR_haskeyset(self);
    SQLULEN num_total_rows = QR_get_num_total_tuples(self);
 
-inolog("QR_get_tupledata num_fields=%d\n", self->num_fields);
+inolog("QR_get_tupledata %p->num_fields=%d\n", self, self->num_fields);
    if (!QR_get_cursor(self))
    {
  
                mylog("ERROR from backend in next_tuple: '%s'\n", msgbuffer);
                qlog("ERROR from backend in next_tuple: '%s'\n", msgbuffer);
 
-               rcvend = TRUE;
+               if (!internally_invoked ||
+                   PG_VERSION_LE(conn, 6.3))
+                   rcvend = TRUE;
                ret = FALSE;
                break;
 
 
    fi = NULL;
    if (icol < irdflds->nfields && irdflds->fi)
        fi = irdflds->fi[icol];
-   if (!FI_is_applicable(fi) && !stmt->catalog_result && SC_is_parse_forced(stmt) && STMT_TYPE_SELECT == stmt->statement_type)
+   if (!FI_is_applicable(fi) && !stmt->catalog_result && SC_is_parse_forced(stmt) && SC_returns_rows(stmt))
    {
        if (SC_parsed_status(stmt) == STMT_PARSE_NONE)
        {
 
    if (opts->bindings == NULL)
    {
-       if (stmt->statement_type != STMT_TYPE_SELECT)
+       if (!SC_returns_rows(stmt))
            return SQL_NO_DATA_FOUND;
        /* just to avoid a crash if the user insists on calling this */
        /* function even if SQL_ExecDirect has reported an Error */
 
    if (opts->bindings == NULL)
    {
-       if (stmt->statement_type != STMT_TYPE_SELECT)
+       if (!SC_returns_rows(stmt))
            return SQL_NO_DATA_FOUND;
        /* just to avoid a crash if the user insists on calling this */
        /* function even if SQL_ExecDirect has reported an Error */
 
    ,{
        STMT_TYPE_SPECIAL, "CHECKPOINT"
    }
+   ,{
+       STMT_TYPE_WITH, "WITH"
+   }
    ,{
        0, NULL
    }
        mylog("              preprocess: status = READY\n");
 
        self->miscinfo = 0;
-       if (self->statement_type == STMT_TYPE_SELECT)
+       if (SC_returns_rows(self))
        {
            char        old_pre_executing = self->pre_executing;
 
 
    ,STMT_TYPE_INSERT
    ,STMT_TYPE_UPDATE
    ,STMT_TYPE_DELETE
+   ,STMT_TYPE_WITH
    ,STMT_TYPE_CREATE
    ,STMT_TYPE_ALTER
    ,STMT_TYPE_DROP
 #define SC_unref_CC_error(a)   ((a->ref_CC_error) = FALSE)
 #define SC_ref_CC_error(a) ((a->ref_CC_error) = TRUE)
 #define SC_forget_unnamed(a)   (PREPARED_TEMPORARILY == (a)->prepared ? SC_set_prepared(a, ONCE_DESCRIBED) : (void) 0)
+#define SC_returns_rows(a) (STMT_TYPE_SELECT == (a)->statement_type || STMT_TYPE_WITH == (a)->statement_type)
 
 
 /* For Multi-thread */
 
 #define POSTGRESDRIVERVERSION      "08.04.0101"
 #define POSTGRES_RESOURCE_VERSION  "08.04.0101\0"
 #define PG_DRVFILE_VERSION     8,4,01,01
-#define PG_BUILD_VERSION       "200908270001"
+#define PG_BUILD_VERSION       "200910250001"
 
 #endif