Re: jdbc bug/feature? - Mailing list pgsql-jdbc

From Marko Štrukelj
Subject Re: jdbc bug/feature?
Date
Msg-id EE047BABDB69D6119C6200508B8B7F5E093C71@triglav.parsek.net
Whole thread Raw
In response to jdbc bug/feature?  (Marko Štrukelj <strukelj@parsek.net>)
List pgsql-jdbc

I think the code is still buggy. Specifically:

The following lines do not restore state:

            //restore state of statement
                    String[] m_sqlFragments = l_origSqlFragments;
                        Object[] m_binds = l_origBinds;
                        String[] m_bindTypes = l_origBindTypes;

You are allocating new local variables here and you are setting them instead of inherited variables. I'm sure it's a copy-paste typo :)  Should be like this:

                    this.m_sqlFragments = l_origSqlFragments;
                        this.m_binds = l_origBinds;
                        this.m_bindTypes = l_origBindTypes;

regards,

-Marko

> -----Original Message-----
> From: Barry Lind [mailto:blind@xythos.com]
> Sent: Wednesday, November 20, 2002 9:08 AM
> To: Marko Štrukelj
> Cc: 'pgsql-jdbc@postgresql.org'
> Subject: Re: [JDBC] jdbc bug/feature?
>
>
> Marko,
>
> I checked in a fix for this problem.  It should appear in 7.3RC2 this
> weekend.
>
> thanks,
> --Barry
>
>
> Marko Štrukelj wrote:
> >
> > Hello,
> >
> > There is a bug (I say) or a lack of proper functionality in
> JDBC driver
> > regarding batch updates.
> >
> > The following code is expected to work by some library that
> I use and it
> > does work with inet tds driver for M$ SQL server. It
> however does not
> > work with the latest jdbc from cvs or anything older than
> that either.
> >
> >
> > PreparedStatements st = c.prepareStatement("insert into my_table
> > (field1, field2) values (?, ?)");
> >
> > // we have say 30 inserts to do
> > Iterator it = inserts.iterator();
> > int i=0;
> > while(it.hasNext()) {
> >
> >         // there is a maximum batch size of 15, so we must
> periodically
> > execute it
> >         if(i==batchMax) {
> >                 st.executeBatch();
> >                 i=0;
> >
> >                 // the problem - after this call a
> PreparedStatement is
> > empty and consequtive binds fail
> >         }
> >
> >         Object [] binds = (Object [])it.next();
> >         st.setString(binds[0]);
> >         st.setString(binds[1]);
> >         st.addBatch();
> >         i++;
> > }
> >
> >
> >
> > Upon some research I discovered the problem and found a very simple
> > solution:
> >
> > In org.postgresql.jdbc2.AbstractJdbc2Statement:
> >
> >         public int[] executeBatch() throws SQLException
> >         {
> > System.out.println("### executeBatch");
> >                 if (batch == null)
> >                         batch = new Vector();
> >                 int size = batch.size();
> >                 int[] result = new int[size];
> >                 int i = 0;
> >
> > // >>> added
> >                 // save m_binds and m_sqlFragments because
> > executeUpdate(String) will destroy them
> >                 String [] oldFrags = m_sqlFragments;
> >                 Object [] oldMBinds = m_binds;
> > // <<
> >
> >                 try
> >                 {                     
> >                         for (i = 0;i < size;i++)
> >                                 result[i] =
> > this.executeUpdate((String)batch.elementAt(i));
> >
> >                 }
> >                 catch (SQLException e)
> >                 {
> >                         int[] resultSucceeded = new int[i];
> >                         System.arraycopy(result, 0,
> resultSucceeded, 0, i);
> >
> >                         PBatchUpdateException updex =
> >                                 new
> > PBatchUpdateException("postgresql.stat.batch.error",
> >                                                            
>            
> >           new Integer(i), batch.elementAt(i), resultSucceeded);
> >
> >                         updex.setNextException(e);
> >
> >                         throw updex;
> >                 }
> >                 finally
> >                 {
> >                         batch.removeAllElements();
> > // >> added                   
> >                         // restore m_binds and m_sqlFragments
> >                         m_sqlFragments = oldFrags;
> >                         m_binds = oldMBinds;
> > // <<
> >                 }
> >                 return result;
> >         }
> >
> >
> >
> >
> > Please consider this as a bug, and patch it in cvs. I did
> not test this
> > very well, so the described patch may possibly cause some
> incosistencies
> > somewhere - the people who wrote that class will know best.
> It does work
> > for my case though.
> >
> >
> > And thanks for PostgreSQL, I've just started using it and I love it.
> >
> >
> >
> > - Marko
> >
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

pgsql-jdbc by date:

Previous
From: Barry Lind
Date:
Subject: Re: jdbc1 AbstractJdbc1Statement setObject() does not work
Next
From: Felipe Schnack
Date:
Subject: Re: default values