Subject: [pgjdbc/pgjdbc] PR #3396: SQLData Support

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Sat, 05 Oct 2024 20:24:43 +0000

### All Submissions:

* [x ] Have you followed the guidelines in our [Contributing](https://github.com/pgjdbc/pgjdbc/blob/master/CONTRIBUTING.md) document?
* [ x] Have you checked to ensure there aren't other open [Pull Requests](../../pulls) for the same update/change?

### New Feature Submissions:

1. [ x] Does your submission pass tests? (But tests need to be written for it)
2. [ x] Does `./gradlew styleCheck` pass ?
3. [ ] Have you added your new test classes to an existing test suite in alphabetical order? (I have yet to write tests)

Here is the start of my proposal for handling classes that implement java.sql.SQLData. I have not written any tests yet because I wanted to make sure this was even of interest to the comunity. I have been using the impossibl driver for some time now because I've been quite heavily using SQLData. But development on that driver has essentially terminated, so I was determined to get SQLData implemented here.

This implementation also currently ignores things like Blob's and Clob's because it would take a little more refactoring/reuse of PgResultSet to get those working. But it handles all the other basic types and, in fact, handles all the needs I have of it at present. i.e. pretty fully functional. I wanted to show my solution with as much minimal change to the existing code as I could get and you can see I did that with basically just a couple lines added to PgResultSet. I envision PgResultSet and PgSQLInput extending the same abstract class that allows them to extract values Integer, SQLData, Blob, etc. from the same parent class. The former using the bytes[] as it currently does, and the latter using the string value.toBytes[].

So being new to this community, I don't exactly know where to start on this and since it feels like a pretty big addition, I thought I would just present what I have and start the discussion before putting more work in.

Cheers

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sat, 05 Oct 2024 23:52:46 +0000

have you looked at https://github.com/pgjdbc/pgjdbc/pull/3306

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sun, 06 Oct 2024 12:39:00 +0000

To confirm, it is of interest.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sun, 06 Oct 2024 12:39:38 +0000

(on pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java)

2024

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 07 Oct 2024 16:24:43 +0000

I just copied the header from PgResultSet.java.  :)

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 07 Oct 2024 16:30:59 +0000

So the protocol here is to copyright it the year the file was created I guess?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 07 Oct 2024 16:33:38 +0000

> have you looked at #3306

Yes, of course because I've commented on it.  :) But I didn't look too carefully at it yet, and I had already built this code in my own work for Happywhale. I'll see what I can do to compare and merge these 2 ideas.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Mon, 07 Oct 2024 19:00:39 +0000

> Yes, of course because I've commented on it. :) But I didn't look too carefully at it yet, and I had already built this code in my own work for Happywhale. I'll see what I can do to compare and mer…

Excellent, thanks!

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 09 Oct 2024 18:54:01 +0000

> > Yes, of course because I've commented on it. :) But I didn't look too carefully at it yet, and I had already built this code in my own work for Happywhale. I'll see what I can do to compare and m…

OK, as I thought, these are independent from one another. That pull request deals with supporting java.sql.Struct and I'm dealing with supporting java.sql.SQLData.
So I believe these to be completely separate.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 09 Oct 2024 20:26:45 +0000

The AppVeyor build keeps failing. How do we get that to succeed?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 09 Oct 2024 21:35:18 +0000

OK, I think this is my actual proposal and just need to add tests. I am not implementing anything that the PgResultSet itself does not implement. In addition, I did not implement readBlob(), readClob(), and readArray() as the PgResultSet implementations of this all rely on the oid of the column which doesn't apply here and so that code would have to be reviewed to figure out how to create these objects without relying on that param. But otherwise I think this is a go.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 09 Oct 2024 22:22:13 +0000

How do I get tests to run locally? I get a ton of errors if I try to run tests. So not sure how to write a test to submit until I can run what is there successfully.  Can anyone help me?

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Wed, 09 Oct 2024 23:11:09 +0000

see https://github.com/pgjdbc/pgjdbc/blob/master/CONTRIBUTING.md
`./gradlew test --tests org.postgresql.test.ssl.SslTest # execute test by class`

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Wed, 09 Oct 2024 23:14:14 +0000

Do we know how well this plays with Graalvm native ?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 09 Oct 2024 23:41:29 +0000

I don't.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Thu, 10 Oct 2024 18:41:47 +0000

You can run checker framework locally too.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 10 Oct 2024 19:00:56 +0000

> You can run checker framework locally too.

I found that in the docs now. Cheers!

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 10 Oct 2024 22:25:15 +0000

I am super struggling with CheckerFramework.  Would love some help with that. I seem to be doing everything as it is done elsewhere but having to suppress warnings that I don't think I should repress. And I can't get the byte[] result to play nice.  :(

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Thu, 10 Oct 2024 23:04:30 +0000

Yes, year it was created

---

From: "binoverfl0w (@binoverfl0w)" <[email-masked]>
Date: Sun, 13 Oct 2024 14:45:39 +0000

I remember running into this as well. Set **enableCheckerframework** build parameter to **true** as it is false by default. https://github.com/pgjdbc/pgjdbc/blob/fcc13e70e6b6bb64b848df4b4ba6b3566b5e95a3/build-logic/build-parameters/build.gradle.kts#L50

I tried to run ```./gradlew checkstyleAll``` and it gave the same error as the one reported here.
The fixes seem trivial. From a quick look, the patch below gets rid of the failures.

A helpful note on ```@Nullable byte[]``` vs ```byte @Nullable []``` that might be of interest: http://errorprone.info/bugpattern/NullablePrimitiveArray

Since ```@SupressWarnings``` cannot be applied to statements, you may consider moving the following block
```java
          if ("NULL".equals(item)) {
            java.lang.reflect.Array.set(results, i, null);
          } else {
            java.lang.reflect.Array.set(results, i, converter.apply(item));
          }
```
in a separate function and annotate that with ```@SurpressWarnings("nullable")``` instead of annotating ```#getConverter``` with ```@SuppressWarnings({"unchecked", "nullness"})```

Anyway once you face the same errors locally you will be able to better reason about such details.

```
Subject: [PATCH] fix CheckerFramework failures
---
Index: pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java	(revision c664b7d767951d48df94f1a84084e4d86f688e91)
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgSQLInput.java	(date 1728829537425)
@@ -151,7 +151,7 @@
 
   @SuppressWarnings({"override.return", "nullness.on.primitive", "return"})
   @Override
-  public @Nullable byte[] readBytes() throws SQLException {
+  public byte @Nullable [] readBytes() throws SQLException {
     return getNextValue(bytesConv);
   }
 
@@ -187,7 +187,8 @@
 
   @Override
   public InputStream readBinaryStream() throws SQLException {
-    return new ByteArrayInputStream(readBytes());
+    byte[] bytes = readBytes();
+    return new ByteArrayInputStream(bytes == null ? new byte[0] : bytes);
   }
 
   @SuppressWarnings("override.return")
@@ -253,13 +254,13 @@
     throw Driver.notImplemented(this.getClass(), "readNString()");
   }
 
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({"unchecked", "nullness"})
   private <T> SQLFunction<String, T> getConverter(Class<T> type) throws SQLException {
     if (type.isArray()) {
       Class<?> itemType = type.getComponentType();
       SQLFunction<String, ?> converter = getConverter(itemType);
       return (value) -> {
-        List<String> items = new SQLDataReader().parseArray(value);
+        List<@Nullable String> items = new SQLDataReader().parseArray(value);
         Object results = java.lang.reflect.Array.newInstance(itemType, items.size());
         for (int i = 0; i < items.size(); i++) {
           String item = items.get(i);
```

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Wed, 23 Oct 2024 02:06:00 +0000

Thanks @binoverfl0w ! I've started implementing your suggestions while also trying to figure out a better solution for the array issue. Which has lead me to include code on trying to solve the issue where we want to read directly an array of objects implementing SQLData. But again I'm getting super frustrated with the enableCheckerframework. I honestly can't understand what it's trying to tell me or complain about.  :(

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Wed, 23 Oct 2024 05:51:01 +0000

@vlsi can you help out with checkerframework issues ?

---

From: "vlsi (@vlsi)" <[email-masked]>
Date: Wed, 23 Oct 2024 08:19:33 +0000

(on pgjdbc/src/main/java/org/postgresql/jdbc/PgArray.java)

This fails because `array` is declared as an array holding non-nullable, so the checker forbids assigning `null` there.

If you need nullable array of nullable objects, then you need to declare it as `@Nullable Object @Nullable [] array`

---

Here's a quick tip: https://github.com/pgjdbc/pgjdbc/blob/master/CONTRIBUTING.md#null-safety

```java
  // array and elements: non-nullable
  String[] x;

  // array: nullable, elements: non-nullable
  String @Nullable [] x;

  // array: non-nullable, elements: nullable
  @Nullable String[] x;

  // array: nullable, elements: nullable
  @Nullable String @Nullable [] x;
```

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 25 Oct 2024 17:47:45 +0000

Ah thanks, I had that backward. I tried it the other way, but it was late, and I think I confused the error I got after that with a problem with this line. Anyway, thanks, resolved now.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Sat, 26 Oct 2024 19:09:07 +0000

@visi @davecramer OK, Now I added in some auto-conversion of types getObject(T[]) that the impossibl driver handles. BUT I'm still having another issue with CheckerFramework that I just can't figure out how to handle. But it is with the weird java.lang.reflect code that I have to use because I can't seem to figure out how to get a generic version of an Array any other way.
Also I tried to implement SQLInput.readArray() but as I guessed there is a problem with the oid so I've commented that out and made it again. Not implemented. NOTE: I don't use this in my code anywhere (I use the above getObject(T[]) instead, but I thought for completeness it would be nice. So if anyone has any ideas there.

---

From: "JavaUnchained (@JavaUnchained)" <[email-masked]>
Date: Mon, 28 Oct 2024 10:43:54 +0000

Hi. I think the problem with the array is due to the fact that the OID is specified for a simple TEXT and not TEXT_ARRAY, so TypeInfo does not return anything in response to getPGArrayElement . But this does not solve the typing problem.

If we had a buildArray map with only 1 element in it, then everything would be pretty trivial and would look something like this (below are just thoughts) :

```
private Object buildArray(ArrayDecoding.PgArrayList input, int index, int count, @Nullable Map<String, Class<?>> map) throws SQLException {
    final BaseConnection connection = getConnection();
    int elementOid = 0; // unspecified
    if (map != null && typeMap.size() == 1) {
      Optional<Map.Entry<String, Class<?>>> entryOp = typeMap.entrySet().stream().findFirst();
      if (entryOp.isPresent()) {
        Map.Entry<String, Class<?>> entry = entryOp.get();
        if (SQLData.class.isAssignableFrom(entry.getValue()) || connection.getTypeInfo().getPGType(entry.getKey()) != 0) { 
          elementOid = connection.getTypeInfo().getPGType(entry.getKey());
        }
      }
    }
    Object array = ArrayDecoding.readStringArray(index, count, elementOid , input, connection);
```
But I also doubt that someone will specify not UDT in the map, but simple types too

p.s I'm sorry for writing this here. I'm just very interested in the functionality that you've implemented.

---

From: "JavaUnchained (@JavaUnchained)" <[email-masked]>
Date: Mon, 28 Oct 2024 10:47:00 +0000

It also seems to me that if (type == Byte.class ) there is not enough primitive type checking, which is available for all types except byte.  Something like this:

```
    if (type == Byte.class || type == byte.class) {
      return (SQLFunction<String, T>) byteConv;
    }
```

In the getConverter. We are checking Array. Should we also check SQLXML there?

---

From: "JavaUnchained (@JavaUnchained)" <[email-masked]>
Date: Mon, 28 Oct 2024 15:19:48 +0000

Another way to support array, ( i made it In my own wrapper, and it works well ) . I just extended the SqlInput interface by adding new method to it:
```
readArray(Class<T> arrayElement)  
```

And in my SQLData i cast SQLInput to my SQLInputExt and  just explicitly set element type.  I make a map with simple types and compare them with java primitives and postgres primitives. And I take udt from connection.getTypeMap()

---

From: "JavaUnchained (@JavaUnchained)" <[email-masked]>
Date: Wed, 20 Nov 2024 08:51:40 +0000

Please note that this piece of code probably doesn't work the way you expect
```
        if (isWhitespace(ch)) {
          ++charIdx;
          while (charIdx < len && isWhitespace(value.charAt(charIdx))) {
            ++charIdx;
          }
          break;
        }
```

You can run the method on such a line, for example, and verify this:
```
"(   "a"    ,   "b"   ,    "c"    )"
```
This code should find the index of the next non-whitespace character and call cotninue.

And there is no need for a go-to label in this method. You can do without the label in readString too by replacing switch with if-else

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Thu, 21 Nov 2024 13:46:08 +0000

(on pgjdbc/src/main/java/org/postgresql/jdbc/SQLDataReader.java:145)

Check the comment in the conversation about this

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Tue, 26 Nov 2024 19:44:52 +0000

Sorry all, I have been swamped at my work. I will get back to this. Thank you for continuing to review this work.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Thu, 28 Nov 2024 11:14:25 +0000

@crowmagnumb work does get in the way. Thanks for working on this.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 10 Jan 2025 21:42:23 +0000

> And there is no need for a go-to label in this method. You can do without the label in readString too by replacing switch with if-else

You are absolutely right. This parsing code I more or less got from the impossibl driver since I knew that it worked. I really didn't analyze it too much because it works for what postgresql gives you. But yeah, I'll clean it up. Cheers.
I think it works just fine because postgresql doesn't give you any whitespace (no surprise there, why waste bytes on whitespace?). So tecnically we could probably just remove that check. But maybe best to have just in case? But make it work correctly.  :)

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 10 Jan 2025 22:35:14 +0000

@JavaUnchained Do you want to directly help me with this?  :) I can give you access to my fork and I'm happy for you to work on it with me.  :)

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 10 Jan 2025 23:02:33 +0000

> p.s I'm sorry for writing this here. I'm just very interested in the functionality that you've implemented.

I just added these. cheers.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 10 Jan 2025 23:08:16 +0000

> And in my SQLData i cast SQLInput to my SQLInputExt and just explicitly set element type. I make a map with simple types and compare them with java primitives and postgres primitives. And I take ud…

Ah, well I don't use readArray() either I use readObject(T[].class) and that works great. But I'm trying to support the full interface even if I won't use it.  :)

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Sat, 11 Jan 2025 01:21:54 +0000

@davecramer Looks like I finally got CheckerFramework to be happy. What's the next step?

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sat, 15 Mar 2025 20:09:51 +0000

can you use the resource lock here. see https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sat, 15 Mar 2025 20:13:39 +0000

is there a reason to keep this here ?

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sat, 15 Mar 2025 20:16:24 +0000

(on pgjdbc/src/test/java/org/postgresql/test/jdbc2/SQLDataTest.java)

is there a reason to keep this here?

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Sat, 15 Mar 2025 20:17:46 +0000

other than my most recent comments I'm OK with this

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 20 Mar 2025 23:46:12 +0000

No, was just keeping until this was all resolved. Cheers.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 20 Mar 2025 23:46:29 +0000

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 20 Mar 2025 23:46:59 +0000

Done.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 20 Mar 2025 23:47:29 +0000

> other than my most recent comments I'm OK with this

OK, took care of your last few requests.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Fri, 21 Mar 2025 12:28:58 +0000

looks like code style then we are good to go.

@vlsi can you take a look?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 21 Mar 2025 16:37:44 +0000

> @vlsi can you take a look?

Oops, yeah these were working before I merged main in. I only did that to satisfy myself that it was fine and honestly forgot that it would trigger an auto-update here. Oops. But again, these checks were working before that. I can take a look too.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 21 Mar 2025 16:43:29 +0000

> Oops, yeah these were working before I merged main in. I only did that to satisfy myself that it was fine and honestly forgot that it would trigger an auto-update here. Oops. But again, these check…

Ah no, maybe I'll leave it to you @vlsi or at least till you advise me. After adding static to the private methods it then complained about default character sets and I don't know how to proceed with that.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Fri, 21 Mar 2025 18:45:08 +0000

just use  `StandardCharset.UTF_8`

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 21 Mar 2025 19:58:20 +0000

> just use `StandardCharset.UTF_8`

OK, I think I've satisfied the new Style requirements, but now my test is suddenly failing with the following ....

FAILURE   0.0sec, org.postgresql.test.jdbc2.SQLDataTest > initializationError
    org.postgresql.util.PSQLException: FATAL: role "test" does not exist
        at app//org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2734)
        at app//org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2846)
        at app//org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:176)
        at app//org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:327)
        at app//org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
        at app//org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:274)
        at app//org.postgresql.Driver.makeConnection(Driver.java:448)
        at app//org.postgresql.Driver.connect(Driver.java:298)
        at platform/[email-masked]/java.sql.DriverManager.getConnection(DriverManager.java:681)
        at platform/[email-masked]/java.sql.DriverManager.getConnection(DriverManager.java:190)
        at app//org.postgresql.test.TestUtil.openDB(TestUtil.java:401)
        at app//org.postgresql.test.TestUtil.openDB(TestUtil.java:350)
        at app//org.postgresql.test.jdbc2.SQLDataTest.setUp(SQLDataTest.java:67)
        Suppressed: org.postgresql.util.PSQLException: FATAL: role "test" does not exist
            at app//org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2734)
            at app//org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2846)
            at app//org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:176)
            at app//org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:327)
            at app//org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
            at app//org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:274)
            at app//org.postgresql.Driver.makeConnection(Driver.java:448)
            at app//org.postgresql.Driver.connect(Driver.java:298)
            at platform/[email-masked]/java.sql.DriverManager.getConnection(DriverManager.java:681)
            at platform/[email-masked]/java.sql.DriverManager.getConnection(DriverManager.java:190)
            at app//org.postgresql.test.TestUtil.openDB(TestUtil.java:401)
            at app//org.postgresql.test.TestUtil.openDB(TestUtil.java:350)
            at app//org.postgresql.test.jdbc2.SQLDataTest.tearDown(SQLDataTest.java:117)

FAILURE   0.2sec,    1 completed,   1 failed,   0 skipped, org.postgresql.test.jdbc2.SQLDataTest
FAILURE   0.7sec,    1 completed,   1 failed,   0 skipped, Gradle Test Run :postgresql:test

1 test completed, 1 failed

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 21 Mar 2025 20:00:17 +0000

> FAILURE 0.0sec, org.postgresql.test.jdbc2.SQLDataTest > initializationError org.postgresql.util.PSQLException: FATAL: role "test" does not exist at app//org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2734) at 

I have a table called "test" in my test but I don't create a role called "test". Is there a new requirement to do so?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Fri, 21 Mar 2025 20:01:05 +0000

> I have a table called "test" in my test but I don't create a role called "test". Is there a new requirement to do so?

I run my test with ... 
```sh
./gradlew cleanTest test --tests org.postgresql.test.jdbc2.SQLDataTest
```

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Fri, 21 Mar 2025 20:27:51 +0000

seems to be fine here.
@vlsi any issues before I merge ?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 03 Apr 2025 23:43:45 +0000

> seems to be fine here. @vlsi any issues before I merge ?

Well?  :)

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Fri, 04 Apr 2025 12:32:25 +0000

> > seems to be fine here. @vlsi any issues before I merge ?

Give it a week. Conference season.
Rebasing would get rid of the one error.

Thanks,
Dave

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Mon, 28 Apr 2025 22:45:01 +0000

@crowmagnumb can you rebase to get rid of the one error ?
Thanks!

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Tue, 29 Apr 2025 02:49:27 +0000

@davecramer Ah, sorry, didn't realize you were asking me to do that. Thought that was a directive to the @vlsi. I just used the github web interface to sync that branch with the fork. Hope that was what you meant by rebasing.  :)

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Mon, 05 May 2025 21:53:05 +0000

(on pgjdbc/src/main/java/org/postgresql/jdbc/SQLDataReader.java)

Use PSQLException(GT.tr("An accessible no-arg constructor is required for type {0}", type" ... so we can have translations. State might be SYNTAX_ERROR

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Mon, 05 May 2025 21:55:33 +0000

(on pgjdbc/src/main/java/org/postgresql/jdbc/SQLDataReader.java:70)

It would be useful for future readers to have a comment here showing examples of what would potentially be parsed.

Also some comments in each step such as , found `,` moving to next item. etc.

---

From: "davecramer (@davecramer)" <[email-masked]>
Date: Mon, 05 May 2025 22:24:14 +0000

Do we have a plan to implement the writer ?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 12 May 2025 18:29:51 +0000

Done

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 12 May 2025 18:29:57 +0000

Done

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Mon, 12 May 2025 18:31:01 +0000

> Do we have a plan to implement the writer ?

I would love to do that in the future. Was hoping we could implement the reader first without it. But yes, I would be happy to have that on my TODO list.

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Tue, 27 May 2025 01:42:28 +0000

@davecramer Any other thoughts/needs?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Sun, 08 Jun 2025 18:05:11 +0000

> @davecramer Any other thoughts/needs?

poke

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 10 Jul 2025 21:59:55 +0000

@davecramer Is there anything I can do here?

---

From: "crowmagnumb (@crowmagnumb)" <[email-masked]>
Date: Thu, 25 Dec 2025 20:24:13 +0000

@davecramer @vlsi I get there is a huge backlog of pull requests to deal with, but just curious what the outlook of this is. I have to keep my personal repo up-to-date and build that to get a working jdbc driver for me. I would love to go back to getting releases from you all.  :)