Обсуждение: Issue with PSQL JDBC Driver Null Pointer
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 omittedpublic 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 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 omittedpublic 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)
should be backpatched into 42.2.24 which should solve this problem
Thanks,
Dave
--Thanks,Bhavesh
Hi Dave,
Bhavesh
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 omittedpublic 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)should be backpatched into 42.2.24 which should solve this problemThanks,Dave--Thanks,Bhavesh
Thanks,
Bhavesh 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
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
>
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 thatDave
Thanks,
Bhavesh