is it true I cannot do `SET ROLE anon;` on Postgre...
# squarelibraries
c
is it true I cannot do
SET ROLE anon;
on Postgres, through SQLDelight?
same question for
SELECT set_config();
trying to get sqldelight to play nice with supabase 😉
I've come to a point where I'd really like to do this:
Copy code
fun Database.setAnonRole(): QueryResult<Long> =
  this.driver.execute(0, "SET ROLE anon;", 0)
  { check(this is JdbcPreparedStatement) }
but
this.driver
is protected in
abstract class BaseTransacterImpl(protected val driver: SqlDriver)
and
DatabaseImpl
is private
i could set the role with JDBC, but I want to make sure it's scoped to a session or transaction...
e
Do you get an error?
c
image.png
e
What happens if you do
Copy code
setRole {
SET ROLE anon;
}
c
image.png
image.png
image.png
e
Looks like there needs to be support added for
SET ROLE
here Best to file an issue. Not sure how functions are setup for Postgres, but probably needs an issue filed for
set_config
as well.
c
If no other replies come in here, I'll file an issue: thanks for having a look at it!
e
Yes, but if you look at the line I linked, there is no support for
SET ROLE
c
(oops missed the link)
Looking there in the PG grammar spec, it seems I should be able to do:
SET LOCAL role = "anon";
But that give the same
'{' expected, got ':'
error screenshotted before.
I'm a bit further in that I no find that the
generateMainDatabaseInterface
task completes w/o errors on (notice the squiggly red underline below the
:
is there in IntelliJ):
But
generateMainDatabaseInterface
fails on the code below with:
Copy code
java.lang.StringIndexOutOfBoundsException: begin 0, end 6, length 1
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4606)
	at java.base/java.lang.String.substring(String.java:2709)
	at java.base/java.lang.String.subSequence(String.java:2747)
	at kotlin.text.StringsKt__StringsKt.subSequence(Strings.kt:410)
	at app.cash.sqldelight.core.SqlDelightEnvironment.detailText(SqlDelightEnvironment.kt:237)
	at app.cash.sqldelight.core.SqlDelightEnvironment.errorMessage(SqlDelightEnvironment.kt:221)
	at app.cash.sqldelight.core.SqlDelightEnvironment.generateSqlDelightFiles$lambda$6(SqlDelightEnvironment.kt:141)
	at com.alecstrong.sql.psi.core.SqlCoreEnvironment.annotate$lambda$1$lambda$0(SqlCoreEnvironment.kt:139)
	at com.alecstrong.sql.psi.core.SqlCoreEnvironment.annotate(SqlCoreEnvironment.kt:150)
	at app.cash.sqldelight.core.SqlDelightEnvironment.generateSqlDelightFiles(SqlDelightEnvironment.kt:136)
	at app.cash.sqldelight.gradle.SqlDelightTask$GenerateInterfaces.execute(SqlDelightTask.kt:98)
	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
	at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
	at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
	at org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
	at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
	at org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
	at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:107)
	at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:76)
	at org.gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:176)
	at org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
	at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$1(WorkerAction.java:173)
	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
	at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:165)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)

Compiling with dialect app.cash.sqldelight.dialects.postgresql.PostgreSqlDialect

/home/cies/Repos/private/http4k-example/supabase-with-sql-and-jwt-ssr-example/src/main/sqldelight/com/example/organization/Organization.sq:14:6 '{' expected, got ':'
(the literal
'anon'
became a variable
:roleName
, that's all -- maybe that's a know/by-design limitation of SQLDelight though)
When changing the key from
role
to
request.jwt.claims
the task
generateMainDatabaseInterface
always errors, both with a literal value and with a variable value. Strange...
(tested some more, it seems to be related to the dots in the
request.jwt.claims
key, as keys w/o dots do not have this problem.