The way things are handled right now, this is very problematic.

IsArbitraryLength tells the DataReader whether this type handler expects the buffer to contain the entire value, or whether the type handler will actually handle reading from the socket (via Ensure). You can see this in GetValue() and other places. Handlers such as bytea and string invoke methods on NpgsqlBuffer which can read data into the buffer, but for all other handlers GetValue() does one big ensure before invoking the handler.

So turning this feature on for PathHandler means it has to start calling Ensure() internally, which probably isn't worth the work - better to treat as a "small" value and have it read into the entire buffer.

I know the name IsArbitraryLength isn't very good, it should be something like ManagesBuffer or something.