You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by Peter Borissow <pe...@yahoo.com.INVALID> on 2018/11/20 17:06:30 UTC

JdbcColumnMeta

Dear Devs,    I would like to help expand the jdbc resultset metadata available when querying a table. Consider the following example:


CREATE TABLE ARTICLE (
    ID BIGINT,
    BODY text,
    LAST_MODIFIED TIMESTAMP with time zone,
        CONSTRAINT PK_ ARTICLE PRIMARY KEY (ID)
 );
After creating the table, I can query the column metadata using the java.sql.ResultSetMetaData. Example:

 java.sql.ResultSet rs = stmt.executeQuery("select * from article);
java.sql.ResultSetMetaData rsmd = rs.getMetaData();

However, the resultset /column metadata will return the following types:

- id: long- body: object- last_modified: object
Note that the body and last_modified fields are identified as generic objects instead of their formal java types. This is not consistent with other jdbc drivers (e.g. postgresql, h2, etc). 

 After a little digging, I found the JdbcColumnMeta(GridQueryFieldMetadata info) constructor which calls the JdbcThinUtils class. However, at this point the GridQueryFieldMetadata is already mapped to a generic "object" so it is impossible to return the correct type from the JdbcThinUtils class.

Next, I decided to see how tables are created in the first place. Specifically, the GridSqlQueryParser.parseCreateTable() method. In there, I can see the correct column metadata. For example, if I add the following code in the parseCreateTable method...
for (Column col : data.columns){
    System.out.println(col.getName() + " (" + col.getType() + ")");
} 

...it will print the following:
ID (5)
BODY (16)
LAST_MODIFIED (24)

I would like to preserve this metadata so that I can see it when using the jdbc resultset metadata object. Any suggestions?

Note that the ID column type (5) is preserved. I suspect the other types identified in the JdbcThinUtils class are preserved as well.


Thanks in advance,Peter








Re: JdbcColumnMeta

Posted by Vladimir Ozerov <vo...@gridgain.com>.
Hi Peter,

I am not aware of such ticket.

On Wed, Nov 21, 2018 at 2:23 PM Peter Borissow
<pe...@yahoo.com.invalid> wrote:

>  Hello Vladimir,    Is there a ticket for the issue I described in JIRA or
> should we create one and mark it blocked pending #6173?
>
> Thanks,Peter
>
>     On Wednesday, November 21, 2018, 3:30:21 AM EST, Vladimir Ozerov <
> vozerov@gridgain.com> wrote:
>
>  Hi Peter,
>
> We will be able to fix this in consistent way for both "thin" and "thick"
> JDBC drivers once IGNITE-6173 [1] is merged. In this ticket we ensure that
> metadata for all schema objects are present on all nodes, so that we can
> simply delegate metadata request to underlying H2 table.
>
> [1] https://issues.apache.org/jira/browse/IGNITE-6173
>
> On Tue, Nov 20, 2018 at 8:06 PM Peter Borissow
> <pe...@yahoo.com.invalid> wrote:
>
> > Dear Devs,    I would like to help expand the jdbc resultset metadata
> > available when querying a table. Consider the following example:
> >
> >
> > CREATE TABLE ARTICLE (
> >    ID BIGINT,
> >    BODY text,
> >    LAST_MODIFIED TIMESTAMP with time zone,
> >        CONSTRAINT PK_ ARTICLE PRIMARY KEY (ID)
> >  );
> > After creating the table, I can query the column metadata using the
> > java.sql.ResultSetMetaData. Example:
> >
> >  java.sql.ResultSet rs = stmt.executeQuery("select * from article);
> > java.sql.ResultSetMetaData rsmd = rs.getMetaData();
> >
> > However, the resultset /column metadata will return the following types:
> >
> > - id: long- body: object- last_modified: object
> > Note that the body and last_modified fields are identified as generic
> > objects instead of their formal java types. This is not consistent with
> > other jdbc drivers (e.g. postgresql, h2, etc).
> >
> >  After a little digging, I found the
> JdbcColumnMeta(GridQueryFieldMetadata
> > info) constructor which calls the JdbcThinUtils class. However, at this
> > point the GridQueryFieldMetadata is already mapped to a generic "object"
> so
> > it is impossible to return the correct type from the JdbcThinUtils class.
> >
> > Next, I decided to see how tables are created in the first place.
> > Specifically, the GridSqlQueryParser.parseCreateTable() method. In
> there, I
> > can see the correct column metadata. For example, if I add the following
> > code in the parseCreateTable method...
> > for (Column col : data.columns){
> >    System.out.println(col.getName() + " (" + col.getType() + ")");
> > }
> >
> > ...it will print the following:
> > ID (5)
> > BODY (16)
> > LAST_MODIFIED (24)
> >
> > I would like to preserve this metadata so that I can see it when using
> the
> > jdbc resultset metadata object. Any suggestions?
> >
> > Note that the ID column type (5) is preserved. I suspect the other types
> > identified in the JdbcThinUtils class are preserved as well.
> >
> >
> > Thanks in advance,Peter
> >
> >
> >
> >
> >
> >
> >
> >
>

Re: JdbcColumnMeta

Posted by Peter Borissow <pe...@yahoo.com.INVALID>.
 Hello Vladimir,    Is there a ticket for the issue I described in JIRA or should we create one and mark it blocked pending #6173?

Thanks,Peter

    On Wednesday, November 21, 2018, 3:30:21 AM EST, Vladimir Ozerov <vo...@gridgain.com> wrote:  
 
 Hi Peter,

We will be able to fix this in consistent way for both "thin" and "thick"
JDBC drivers once IGNITE-6173 [1] is merged. In this ticket we ensure that
metadata for all schema objects are present on all nodes, so that we can
simply delegate metadata request to underlying H2 table.

[1] https://issues.apache.org/jira/browse/IGNITE-6173

On Tue, Nov 20, 2018 at 8:06 PM Peter Borissow
<pe...@yahoo.com.invalid> wrote:

> Dear Devs,    I would like to help expand the jdbc resultset metadata
> available when querying a table. Consider the following example:
>
>
> CREATE TABLE ARTICLE (
>    ID BIGINT,
>    BODY text,
>    LAST_MODIFIED TIMESTAMP with time zone,
>        CONSTRAINT PK_ ARTICLE PRIMARY KEY (ID)
>  );
> After creating the table, I can query the column metadata using the
> java.sql.ResultSetMetaData. Example:
>
>  java.sql.ResultSet rs = stmt.executeQuery("select * from article);
> java.sql.ResultSetMetaData rsmd = rs.getMetaData();
>
> However, the resultset /column metadata will return the following types:
>
> - id: long- body: object- last_modified: object
> Note that the body and last_modified fields are identified as generic
> objects instead of their formal java types. This is not consistent with
> other jdbc drivers (e.g. postgresql, h2, etc).
>
>  After a little digging, I found the JdbcColumnMeta(GridQueryFieldMetadata
> info) constructor which calls the JdbcThinUtils class. However, at this
> point the GridQueryFieldMetadata is already mapped to a generic "object" so
> it is impossible to return the correct type from the JdbcThinUtils class.
>
> Next, I decided to see how tables are created in the first place.
> Specifically, the GridSqlQueryParser.parseCreateTable() method. In there, I
> can see the correct column metadata. For example, if I add the following
> code in the parseCreateTable method...
> for (Column col : data.columns){
>    System.out.println(col.getName() + " (" + col.getType() + ")");
> }
>
> ...it will print the following:
> ID (5)
> BODY (16)
> LAST_MODIFIED (24)
>
> I would like to preserve this metadata so that I can see it when using the
> jdbc resultset metadata object. Any suggestions?
>
> Note that the ID column type (5) is preserved. I suspect the other types
> identified in the JdbcThinUtils class are preserved as well.
>
>
> Thanks in advance,Peter
>
>
>
>
>
>
>
>
  

Re: JdbcColumnMeta

Posted by Vladimir Ozerov <vo...@gridgain.com>.
Hi Peter,

We will be able to fix this in consistent way for both "thin" and "thick"
JDBC drivers once IGNITE-6173 [1] is merged. In this ticket we ensure that
metadata for all schema objects are present on all nodes, so that we can
simply delegate metadata request to underlying H2 table.

[1] https://issues.apache.org/jira/browse/IGNITE-6173

On Tue, Nov 20, 2018 at 8:06 PM Peter Borissow
<pe...@yahoo.com.invalid> wrote:

> Dear Devs,    I would like to help expand the jdbc resultset metadata
> available when querying a table. Consider the following example:
>
>
> CREATE TABLE ARTICLE (
>     ID BIGINT,
>     BODY text,
>     LAST_MODIFIED TIMESTAMP with time zone,
>         CONSTRAINT PK_ ARTICLE PRIMARY KEY (ID)
>  );
> After creating the table, I can query the column metadata using the
> java.sql.ResultSetMetaData. Example:
>
>  java.sql.ResultSet rs = stmt.executeQuery("select * from article);
> java.sql.ResultSetMetaData rsmd = rs.getMetaData();
>
> However, the resultset /column metadata will return the following types:
>
> - id: long- body: object- last_modified: object
> Note that the body and last_modified fields are identified as generic
> objects instead of their formal java types. This is not consistent with
> other jdbc drivers (e.g. postgresql, h2, etc).
>
>  After a little digging, I found the JdbcColumnMeta(GridQueryFieldMetadata
> info) constructor which calls the JdbcThinUtils class. However, at this
> point the GridQueryFieldMetadata is already mapped to a generic "object" so
> it is impossible to return the correct type from the JdbcThinUtils class.
>
> Next, I decided to see how tables are created in the first place.
> Specifically, the GridSqlQueryParser.parseCreateTable() method. In there, I
> can see the correct column metadata. For example, if I add the following
> code in the parseCreateTable method...
> for (Column col : data.columns){
>     System.out.println(col.getName() + " (" + col.getType() + ")");
> }
>
> ...it will print the following:
> ID (5)
> BODY (16)
> LAST_MODIFIED (24)
>
> I would like to preserve this metadata so that I can see it when using the
> jdbc resultset metadata object. Any suggestions?
>
> Note that the ID column type (5) is preserved. I suspect the other types
> identified in the JdbcThinUtils class are preserved as well.
>
>
> Thanks in advance,Peter
>
>
>
>
>
>
>
>