Issue with PSQL JDBC Driver Null Pointer

Started by Bhavesh Mistryalmost 5 years ago6 messagesgeneral
Jump to latest
#1Bhavesh Mistry
bhavesh.mistry13@gmail.com

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

#2Dave Cramer
pg@fastcrypt.com
In reply to: Bhavesh Mistry (#1)
Re: Issue with PSQL JDBC Driver Null Pointer

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;
}

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&gt;
should be backpatched into 42.2.24 which should solve this problem

Thanks,
Dave

Show quoted text

--
Thanks,

Bhavesh

#3Bhavesh Mistry
bhavesh.mistry13@gmail.com
In reply to: Dave Cramer (#2)
Re: Issue with PSQL JDBC Driver Null Pointer

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;
}

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&gt;
should be backpatched into 42.2.24 which should solve this problem

Thanks,
Dave

--
Thanks,

Bhavesh

--
Thanks,

Bhavesh

#4Dave Cramer
pg@fastcrypt.com
In reply to: Bhavesh Mistry (#3)
Re: Issue with PSQL JDBC Driver Null Pointer

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

#5Edson Carlos Ericksson Richter
richter@simkorp.com.br
In reply to: Bhavesh Mistry (#3)
Re: Issue with PSQL JDBC Driver Null Pointer

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:

Show quoted text

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&gt;.
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&gt;
should be backpatched into 42.2.24 which should solve this problem

Thanks,
Dave

--
Thanks,

Bhavesh

--
Thanks,

Bhavesh

#6Bhavesh Mistry
bhavesh.mistry13@gmail.com
In reply to: Dave Cramer (#4)
Re: Issue with PSQL JDBC Driver Null Pointer

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