Thread

  1. Re: [INTERFACES] Re: ODBC drive strange behavior

    Jose Soares <jose@sferacarta.com> — 2000-01-24T15:26:44Z

    Byron Nikolaidis wrote:
    
    > Jose Soares wrote:
    > >
    > > Sorry I forgot to send the attachement  :)
    > >
    > > Jose Soares wrote:
    > >
    > > > Please help!
    > > >
    > > > The PSQLODBC aborts a transaction with a strange error while execute a
    > > > legal query.
    > > > The message is:
    > > >
    > > > "Could not begin a transaction; unexpected protocol character from
    > > > backend (sen_query) (#1)"
    > > >
    > > > I tried the same query with psql client and it works with no problems.
    > > >
    > > > Does anyone know what this message means ?
    > > >
    > > > My configuration:
    > > >
    > > > Data base server: PostgreSQL v6.5.2
    > > > OS server: Linux 2.0.37 (Debian)
    > > > Win Client: M$_Access95
    > > > PsqlODBC v6.40.0006
    > > > log file attached.
    > > >
    > > > Any help would be very apreciated.
    > > >
    > > > José
    > >
    > >   ------------------------------------------------------------------------
    > >                     Name: LOG_ERROR.log
    > >    LOG_ERROR.log    Type: Text Document (application/x-unknown-content-type-txtfile)
    > >                 Encoding: base64
    >
    > The error means the driver didn't receive the expected response
    > character from the backend.  For queries, the expected response would be
    > something like:
    >
    > 'T': results are coming (this one is the most likely expected)
    > 'C': no tuples produced
    > 'Z': ready for new query (in >= postgres 6.4 only).
    > 'I': empty query produces this response
    > 'N': notice
    > 'E': error
    >
    > In your case, the query begins:  (SELECT "figure"."azienda"
    >
    > It might be the extra parenthesis around the query ?  Try removing
    > them.  If that's not it, try making the query really short, just as an
    > experiment.  Also, using the wrong protocol with the backend can make
    > this happen.
    >
    > Byron
    
    * About parenthesis around select this is the way M$-access translates
    queries with UNIONs and I can't do nothing to change this behavior.
    Thanks to developers, PostgreSQL now recognizes this syntax, in fact if I execute this
    query on psql
    it works.
    
    * Just for an experiment I did the following change:
    
    * The original query in M$-access was:
    (
    SELECT figure.azienda ,figure.codice_figura ,utenti.ragione_sociale ,utenti.istat
    ,utenti.cap,
        utenti.indirizzo ,utenti.civico ,figure.tipo ,utenti.codice_fiscale
    ,utenti.partita_iva ,
        figure.fine_attivita ,figure.data_esportazione ,figure.data_aggiornamento
    ,utenti.distretto,
        figure.gruppo ,figure.data_esportazione ,utenti.data_esportazione
    FROM figure INNER JOIN utenti ON (figure.codice_figura = utenti.azienda)
    WHERE (figure.tipo IN ('D' ,'DB' ,'DO' ,'DS' ) )
     )
    UNION ALL
    (
    SELECT figure.azienda ,figure.codice_figura ,utenti.ragione_sociale ,utenti.istat ,
        utenti.cap ,utenti.indirizzo,utenti.civico,figure.tipo,utenti.codice_fiscale,
        utenti.partita_iva ,figure.fine_attivita ,figure.data_esportazione,
        figure.data_aggiornamento,utenti.distretto,figure.gruppo,figure.data_esportazione,
        utenti.data_esportazione
    FROM figure INNER JOIN utenti ON (figure.codice_figura = utenti.azienda)
    WHERE (figure.tipo IN ('P' ,'PB' ,'PO' ,'PS' ,'A' ) )
    )
    
    and it was translated to PostgreSQL as:
    
    (SELECT "figure"."azienda" ,"figure"."codice_figura" ,"utenti"."ragione_sociale"
    ,"utenti"."istat" ,"utenti"."cap" ,"utenti"."indirizzo" ,"utenti"."civico"
    ,"figure"."tipo" ,"utenti"."codice_fiscale" ,"utenti"."partita_iva"
    ,"figure"."fine_attivita" ,"figure"."data_esportazione" ,"figure"."data_aggiornamento"
    ,"utenti"."distretto" ,"figure"."gruppo" ,"figure"."data_esportazione"
    ,"utenti"."data_esportazione"
    FROM "figure","utenti"
    WHERE (("figure"."tipo" IN ('D' ,'DB' ,'DO' ,'DS' ) )
    AND ("figure"."codice_figura" = "utenti"."azienda" ) )
    )
    UNION ALL
    (
    SELECT "figure"."azienda" ,"figure"."codice_figura" ,"utenti"."ragione_sociale"
    ,"utenti"."istat" ,"utenti"."cap" ,"utenti"."indirizzo" ,"utenti"."civico"
    ,"figure"."tipo" ,"utenti"."codice_fiscale" ,"utenti"."partita_iva"
    ,"figure"."fine_attivita" ,"figure"."data_esportazione" ,"figure"."data_aggiornamento"
    ,"utenti"."distretto" ,"figure"."gruppo" ,"figure"."data_esportazione"
    ,"utenti"."data_esportazione"
    FROM "figure","utenti"
    WHERE (("figure"."tipo" IN ('P' ,'PB' ,'PO' ,'PS' ,'A' ) )
    AND ("figure"."codice_figura" = "utenti"."azienda" ) )
    )
    
    I replaced the keyword INNER with LEFT and now it works but I can't realize why.
    
    Any ideas Byron ?
    
    Thanks,
    José