Обсуждение: Issue with PSQL JDBC Driver Null Pointer

Поиск
Список
Период
Сортировка

Issue with PSQL JDBC Driver Null Pointer

От
Bhavesh Mistry
Дата:
Hello,

I am getting an NPE exception in the JDBC driver 42.2.23. 

When the alias is null, NPE results.  Is it possible to handle null value ? I have filled a bug against RCA https://github.com/vladmihalcea/hibernate-types/issues/335.  But, I thought that PSQL Driver can handle it more gracefully.

Caused by: java.lang.NullPointerException: null        at org.postgresql.jdbc.TypeInfoCache.getTypeForAlias(TypeInfoCache.java:675)        at org.postgresql.jdbc.TypeInfoCache.getPGArrayType(TypeInfoCache.java:519)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1375)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1399)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at com.vladmihalcea.hibernate.type.array.internal.ArraySqlTypeDescriptor$1.doBind(ArraySqlTypeDescriptor.java:36)        at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271)        at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2995)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3292)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)        at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)        at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)        ... 123 common frames omitted
public String getTypeForAlias(String alias) {    String type = typeAliases.get(alias);    if (type != null) {      return type;    }    if (alias.indexOf('"') == -1) {   // THIS LINE THROWS NPE SINCE alias is null **       type = typeAliases.get(alias.toLowerCase());      if (type != null) {        return type;      }    }    return alias;  }


--
Thanks,

Bhavesh

Re: Issue with PSQL JDBC Driver Null Pointer

От
Dave Cramer
Дата:


On Thu, 29 Jul 2021 at 11:04, Bhavesh Mistry <bhavesh.mistry13@gmail.com> wrote:
Hello,

I am getting an NPE exception in the JDBC driver 42.2.23. 

When the alias is null, NPE results.  Is it possible to handle null value ? I have filled a bug against RCA https://github.com/vladmihalcea/hibernate-types/issues/335.  But, I thought that PSQL Driver can handle it more gracefully.

Caused by: java.lang.NullPointerException: null        at org.postgresql.jdbc.TypeInfoCache.getTypeForAlias(TypeInfoCache.java:675)        at org.postgresql.jdbc.TypeInfoCache.getPGArrayType(TypeInfoCache.java:519)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1375)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1399)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at com.vladmihalcea.hibernate.type.array.internal.ArraySqlTypeDescriptor$1.doBind(ArraySqlTypeDescriptor.java:36)        at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271)        at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2995)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3292)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)        at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)        at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)        ... 123 common frames omitted
public String getTypeForAlias(String alias) {    String type = typeAliases.get(alias);    if (type != null) {      return type;    }    if (alias.indexOf('"') == -1) {   // THIS LINE THROWS NPE SINCE alias is null **       type = typeAliases.get(alias.toLowerCase());      if (type != null) {        return type;      }    }    return alias;  }

should be backpatched into 42.2.24 which should solve this problem


Thanks,
Dave 

--
Thanks,

Bhavesh

Re: Issue with PSQL JDBC Driver Null Pointer

От
Bhavesh Mistry
Дата:
Hi Dave,

It still does not address the NPE issue.  If an alias is NULL. What should be the behavior?


public String getTypeForAlias(String alias) {
String type = TYPE_ALIASES.get(alias);
if (type != null) {
return type;
}
type = TYPE_ALIASES.get(alias.toLowerCase()) // NPE STILL HERE;
if (type == null) {
type = alias;
}
//populate for future use
TYPE_ALIASES.put(alias, type);
return type;
}
 
Thanks,

Bhavesh 

On Thu, Jul 29, 2021 at 8:44 AM Dave Cramer <davecramer@postgres.rocks> wrote:


On Thu, 29 Jul 2021 at 11:04, Bhavesh Mistry <bhavesh.mistry13@gmail.com> wrote:
Hello,

I am getting an NPE exception in the JDBC driver 42.2.23. 

When the alias is null, NPE results.  Is it possible to handle null value ? I have filled a bug against RCA https://github.com/vladmihalcea/hibernate-types/issues/335.  But, I thought that PSQL Driver can handle it more gracefully.

Caused by: java.lang.NullPointerException: null        at org.postgresql.jdbc.TypeInfoCache.getTypeForAlias(TypeInfoCache.java:675)        at org.postgresql.jdbc.TypeInfoCache.getPGArrayType(TypeInfoCache.java:519)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1375)        at org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1399)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)        at com.vladmihalcea.hibernate.type.array.internal.ArraySqlTypeDescriptor$1.doBind(ArraySqlTypeDescriptor.java:36)        at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276)        at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271)        at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)        at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2995)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3292)        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)        at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)        at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)        at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)        ... 123 common frames omitted
public String getTypeForAlias(String alias) {    String type = typeAliases.get(alias);    if (type != null) {      return type;    }    if (alias.indexOf('"') == -1) {   // THIS LINE THROWS NPE SINCE alias is null **       type = typeAliases.get(alias.toLowerCase());      if (type != null) {        return type;      }    }    return alias;  }

should be backpatched into 42.2.24 which should solve this problem


Thanks,
Dave 

--
Thanks,

Bhavesh



--
Thanks,

Bhavesh

Re: Issue with PSQL JDBC Driver Null Pointer

От
Dave Cramer
Дата:


On Thu, 29 Jul 2021 at 15:44, Bhavesh Mistry <bhavesh.mistry13@gmail.com> wrote:
Hi Dave,

It still does not address the NPE issue.  If an alias is NULL. What should be the behavior?


public String getTypeForAlias(String alias) {
String type = TYPE_ALIASES.get(alias);
if (type != null) {
return type;
}
type = TYPE_ALIASES.get(alias.toLowerCase()) // NPE STILL HERE;
if (type == null) {
type = alias;
}
//populate for future use
TYPE_ALIASES.put(alias, type);
return type;
}
 

Very good question. I guess we should return null in this case.

I'll fix that

Dave

Re: Issue with PSQL JDBC Driver Null Pointer

От
Edson Carlos Ericksson Richter
Дата:
I would do


public String getTypeForAlias(String alias) {

    if (alias==null) return null; // this shall solve NPE on
alias.toLowerCase()

    String type = TYPE_ALIASES.get(alias);

    if (type != null) {

    return type;

    }

    type = TYPE_ALIASES.get(alias.toLowerCase()) *// NPE STILL HERE*;

    if (type == null) {

    type = alias;

    }

    //populate for future use

    TYPE_ALIASES.put(alias, type);

    return type;

    }




Em 29/07/2021 16:44, Bhavesh Mistry escreveu:
> Hi Dave,
>
> It still does not address the NPE issue.  If an alias is NULL. What
> should be the behavior?
>
>
> public String getTypeForAlias(String alias) {
>
>     String type = TYPE_ALIASES.get(alias);
>
>     if (type != null) {
>
>     return type;
>
>     }
>
>     type = TYPE_ALIASES.get(alias.toLowerCase()) *// NPE STILL HERE*;
>
>     if (type == null) {
>
>     type = alias;
>
>     }
>
>     //populate for future use
>
>     TYPE_ALIASES.put(alias, type);
>
>     return type;
>
>     }
>
> Thanks,
>
> Bhavesh
>
> On Thu, Jul 29, 2021 at 8:44 AM Dave Cramer
> <davecramer@postgres.rocks> wrote:
>
>
>
>     On Thu, 29 Jul 2021 at 11:04, Bhavesh Mistry
>     <bhavesh.mistry13@gmail.com <mailto:bhavesh.mistry13@gmail.com>>
>     wrote:
>
>         Hello,
>
>         I am getting an NPE exception in the JDBC driver 42.2.23.
>
>         When the alias is null, NPE results.  Is it possible to handle
>         null value ? I have filled a bug against RCA
>         https://github.com/vladmihalcea/hibernate-types/issues/335
>         <https://github.com/vladmihalcea/hibernate-types/issues/335>.
>         But, I thought that PSQL Driver can handle it more gracefully.
>
>         |Caused by: java.lang.NullPointerException: null at
>         org.postgresql.jdbc.TypeInfoCache.getTypeForAlias(TypeInfoCache.java:675)
>         at
>         org.postgresql.jdbc.TypeInfoCache.getPGArrayType(TypeInfoCache.java:519)
>         at
>         org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1375)
>         at
>         org.postgresql.jdbc.PgConnection.createArrayOf(PgConnection.java:1399)
>         at
>         org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)
>         at
>         org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)
>         at
>         org.apache.commons.dbcp2.DelegatingConnection.createArrayOf(DelegatingConnection.java:827)
>         at
>
com.vladmihalcea.hibernate.type.array.internal.ArraySqlTypeDescriptor$1.doBind(ArraySqlTypeDescriptor.java:36)
>         at
>         org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)
>         at
>         org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276)
>         at
>         org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271)
>         at
>
org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)
>         at
>         org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2995)
>         at
>         org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3292)
>         at
>         org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3828)
>         at
>         org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)
>         at
>         org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
>         at
>         org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
>         at
>         java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
>         at
>         org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
>         at
>
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)
>         at
>         org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
>         at
>
org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
>         at
>         org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
>         at
>         org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)
>         at
>         org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)
>         at
>         org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)
>         at
>
org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
>         at
>
org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
>         at
>
org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
>         at
>
org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
>         at
>         org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
>         ... 123 common frames omitted|
>
>         |public String getTypeForAlias(String alias) { String type =
>         typeAliases.get(alias); if (type != null) { return type; } if
>         (alias.indexOf('"') == -1) { *// THIS LINE THROWS NPE SINCE
>         alias is null ** * type =
>         typeAliases.get(alias.toLowerCase()); if (type != null) {
>         return type; } } return alias; }|
>
>
>     It would appear that improv: type alias handling in TypeInfoCache
>     by bokken · Pull Request #1986 · pgjdbc/pgjdbc (github.com)
>     <https://github.com/pgjdbc/pgjdbc/pull/1986>
>     should be backpatched into 42.2.24 which should solve this problem
>
>
>     Thanks,
>     Dave
>
>
>         --
>         Thanks,
>
>         Bhavesh
>
>
>
> --
> Thanks,
>
> Bhavesh
>



Re: Issue with PSQL JDBC Driver Null Pointer

От
Bhavesh Mistry
Дата:
Thanks for fixing it. 

Thanks,

Bhavesh 

On Thu, Jul 29, 2021 at 12:49 PM Dave Cramer <davecramer@postgres.rocks> wrote:


On Thu, 29 Jul 2021 at 15:44, Bhavesh Mistry <bhavesh.mistry13@gmail.com> wrote:
Hi Dave,

It still does not address the NPE issue.  If an alias is NULL. What should be the behavior?


public String getTypeForAlias(String alias) {
String type = TYPE_ALIASES.get(alias);
if (type != null) {
return type;
}
type = TYPE_ALIASES.get(alias.toLowerCase()) // NPE STILL HERE;
if (type == null) {
type = alias;
}
//populate for future use
TYPE_ALIASES.put(alias, type);
return type;
}
 

Very good question. I guess we should return null in this case.

I'll fix that

Dave


--
Thanks,

Bhavesh