Re: Can't update rows in tables qualified with schema names - Mailing list pgsql-jdbc

From Kris Jurka
Subject Re: Can't update rows in tables qualified with schema names
Date
Msg-id Pine.LNX.4.33.0302281249570.30602-100000@leary.csoft.net
Whole thread Raw
In response to Re: Can't update rows in tables qualified with schema names  ("Paul Sorenson" <pauls@classware.com.au>)
List pgsql-jdbc
It is also possibly to have a quote within a quoted name.  The quote is
escaped by another quote, for example

"schema""name"."tablename"

Kris Jurka

On Fri, 28 Feb 2003, Paul Sorenson wrote:

>
> ----- Original Message -----
> From: "Barry Lind" <blind@xythos.com>
> To: "Rich Cullingford" <rculling@sysd.com>
> Cc: "pgsql-jdbc" <pgsql-jdbc@postgresql.org>
> Sent: Friday, February 28, 2003 3:59 AM
> Subject: Re: [JDBC] Can't update rows in tables qualified with schema names
>
>
> > Rich,
> >
> > Yes this is a bug.  It should be simple to fix.  It is a little bit more
> > work than just parsing on the period.  The logic needs to handle the
> > following cases:
> >
> > schema.table
> > "Schema"."Table"
> > "Schema.name"."Table.name"
> >
> > basically you need to account for the fact that the names could be
> > quoted or not and if quoted they could contain the period character.
> >
> >
> > The code below from org.postgresql.jdbc2.AbstractJdbc2ResultSet.java
> > would need to be fixed up.
> >
> > String quotelessTableName;
> > if (tableName.startsWith("\"") && tableName.endsWith("\"")) {
> > quotelessTableName = tableName.substring(1,tableName.length()-1);
> > } else {
> > quotelessTableName = tableName.toLowerCase();
> > }
> > java.sql.ResultSet rs = ((java.sql.Connection)
> > connection).getMetaData().getPrimaryKeys("", "", quotelessTableName);
> >
> >
> > Do you, or someone else on the list want to take a stab at fixing this up?
>
> Here is my crack at it:
> Index: AbstractJdbc2ResultSet.java
> ===================================================================
> RCS file:
> /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/Abst
> ractJdbc2ResultSet.java,v
> retrieving revision 1.14
> diff -c -r1.14 AbstractJdbc2ResultSet.java
> *** AbstractJdbc2ResultSet.java 2003/02/27 05:56:27 1.14
> --- AbstractJdbc2ResultSet.java 2003/02/28 10:25:25
> ***************
> *** 1321,1332 ****
>      // if the user has supplied a quoted table name
>      // remove the quotes, but preserve the case.
>      // otherwise fold to lower case.
> !    String quotelessTableName;
> !    if (tableName.startsWith("\"") && tableName.endsWith("\"")) {
> !     quotelessTableName = tableName.substring(1,tableName.length()-1);
> !    } else {
> !     quotelessTableName = tableName.toLowerCase();
> !    }
>      java.sql.ResultSet rs = ((java.sql.Connection)
> connection).getMetaData().getPrimaryKeys("", "", quotelessTableName);
>
>
> --- 1321,1327 ----
>      // if the user has supplied a quoted table name
>      // remove the quotes, but preserve the case.
>      // otherwise fold to lower case.
> !    String quotelessTableName = quotelessTableName(tableName);
>      java.sql.ResultSet rs = ((java.sql.Connection)
> connection).getMetaData().getPrimaryKeys("", "", quotelessTableName);
>
>
> ***************
> *** 1361,1368 ****
>
>     return updateable;
>    }
> -
>
>    public void parseQuery()
>    {
>     String[] l_sqlFragments =
> ((AbstractJdbc2Statement)statement).getSqlFragments();
> --- 1356,1392 ----
>
>     return updateable;
>    }
>
> +     /**
> +      * Returns unquoted table name, stripped of optional schema qualifier.
> +      * If it was unquoted then the name is folded to lowercase. Test
> cases:<br>
> +      * Table: table<br>
> +      * "Table": Table<br>
> +      * Schema.Table: table<br>
> +      * "Schema"."Table": Table<br>
> +      * "Schema"."Dot.Table": Dot.Table
> +      */
> +     private static String quotelessTableName(String fullname) {
> +         String result = null;
> +         if (fullname.startsWith("\"") && fullname.endsWith("\"")) {
> +             StringBuffer buf = new StringBuffer(fullname);
> +             buf.deleteCharAt(buf.length() - 1);     // delete trailing
> quote
> +             // No need to test result of lastIndexOf() due to enclosing
> if.
> +             result = buf.substring(buf.lastIndexOf("\"") + 1);
> +         }
> +         else {
> +             int dot = fullname.lastIndexOf(".");
> +             if (dot >= 0) {
> +                 result = fullname.substring(dot + 1);
> +             }
> +             else {
> +                 result = fullname;
> +             }
> +             result = result.toLowerCase();
> +         }
> +         return result;
> +     }
> +
>    public void parseQuery()
>    {
>     String[] l_sqlFragments =
> ((AbstractJdbc2Statement)statement).getSqlFragments();
>
>


pgsql-jdbc by date:

Previous
From: "Dirk Bromberg"
Date:
Subject: Connection Pool
Next
From: "Takeo Shibata"
Date:
Subject: Re: SSL for JDBC