Menu

user lacks privilege or object not found: net.ucanaccess.converters.Functions

Sproketboy
2023-06-13
2023-11-29
  • Sproketboy

    Sproketboy - 2023-06-13

    This is occurring for me when I change my HSQLDB dependency from 2.5.1 to 2.7.1 - I need to do this becuase of CVEs on the older version. Here's the error I get when I make a connection:

    java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: net.ucanaccess.converters.Functions
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
        at net.ucanaccess.converters.LoadJet.exec(LoadJet.java:1510)
        at net.ucanaccess.converters.LoadJet.access$000(LoadJet.java:74)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.createFunctions(LoadJet.java:192)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.addFunctions(LoadJet.java:162)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.loadMappedFunctions(LoadJet.java:240)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.access$3100(LoadJet.java:77)
        at net.ucanaccess.converters.LoadJet.loadDB(LoadJet.java:1578)
        at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:218)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:252)
        at net.sf.persism.TestMSAccess.setUp(TestMSAccess.java:57)
        at junit.framework.TestCase.runBare(TestCase.java:140)
        at junit.framework.TestResult$1.protect(TestResult.java:122)
        at junit.framework.TestResult.runProtected(TestResult.java:142)
        at junit.framework.TestResult.run(TestResult.java:125)
        at junit.framework.TestCase.run(TestCase.java:130)
        at junit.framework.TestSuite.runTest(TestSuite.java:241)
        at junit.framework.TestSuite.run(TestSuite.java:236)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
    Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: net.ucanaccess.converters.Functions
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.Routine.getMethods(Unknown Source)
        at org.hsqldb.Routine.getMethod(Unknown Source)
        at org.hsqldb.Routine.resolveReferences(Unknown Source)
        at org.hsqldb.Routine.resolve(Unknown Source)
        at org.hsqldb.ParserRoutine.readCreateProcedureOrFunction(Unknown Source)
        at org.hsqldb.ParserRoutine.compileCreateProcedureOrFunction(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
        at org.hsqldb.ParserCommand.compilePart(Unknown Source)
        at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
        at org.hsqldb.Session.executeDirectStatement(Unknown Source)
        at org.hsqldb.Session.execute(Unknown Source)
        ... 28 more
    WARNING:Function already added: CREATE FUNCTION SLN(par0 DOUBLE,par1 DOUBLE,par2 DOUBLE) RETURNS DOUBLE  LANGUAGE JAVA DETERMINISTIC NO SQL  EXTERNAL NAME 'CLASSPATH:net.ucanaccess.converters.Functions.sln'
    java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: net.ucanaccess.converters.Functions
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
        at net.ucanaccess.converters.LoadJet.exec(LoadJet.java:1510)
        at net.ucanaccess.converters.LoadJet.access$000(LoadJet.java:74)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.createFunctions(LoadJet.java:192)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.addFunctions(LoadJet.java:162)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.loadMappedFunctions(LoadJet.java:240)
        at net.ucanaccess.converters.LoadJet$FunctionsLoader.access$3100(LoadJet.java:77)
        at net.ucanaccess.converters.LoadJet.loadDB(LoadJet.java:1578)
        at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:218)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:252)
        at net.sf.persism.TestMSAccess.setUp(TestMSAccess.java:57)
        at junit.framework.TestCase.runBare(TestCase.java:140)
        at junit.framework.TestResult$1.protect(TestResult.java:122)
        at junit.framework.TestResult.runProtected(TestResult.java:142)
        at junit.framework.TestResult.run(TestResult.java:125)
        at junit.framework.TestCase.run(TestCase.java:130)
        at junit.framework.TestSuite.runTest(TestSuite.java:241)
        at junit.framework.TestSuite.run(TestSuite.java:236)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
    Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: net.ucanaccess.converters.Functions
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.Routine.getMethods(Unknown Source)
        at org.hsqldb.Routine.getMethod(Unknown Source)
        at org.hsqldb.Routine.resolveReferences(Unknown Source)
        at org.hsqldb.Routine.resolve(Unknown Source)
        at org.hsqldb.ParserRoutine.readCreateProcedureOrFunction(Unknown Source)
        at org.hsqldb.ParserRoutine.compileCreateProcedureOrFunction(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
        at org.hsqldb.ParserCommand.compilePart(Unknown Source)
        at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
        at org.hsqldb.Session.executeDirectStatement(Unknown Source)
        at org.hsqldb.Session.execute(Unknown Source)
        ... 28 more
    
     
  • RavenAtSafe

    RavenAtSafe - 2023-07-19

    We have run into this as well; is it likely that a new UCanAccess release will be issued to address this?

     
  • Alexander Maas

    Alexander Maas - 2023-11-20

    I also updated my HSQLDB library to v2.7.1 due to CVE-2022-41853.
    However, when the HsqlException occurs, you can solve that issue by setting the following system property (before establishing the database connection):

    System.setProperty("hsqldb.method_class_names", "net.ucanaccess.converters.*"); // see http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_jrt_access_control
    

    Hope, this helps :-)

     
  • hchenAtSafe

    hchenAtSafe - 2023-11-28

    Thanks @Alexander. This does fix the user privilege issue.

    We've encountered what seems like a more underlying issue when sending UPDATE or DELETE statements to net.ucanaccess.jdbc.UcanaccessStatement.executeBatch():

    java.lang.NullPointerException: Cannot invoke "jdbc.ucanaccess.shaded.org.hsqldb.Statement.getTableNamesForRead()" because "<parameter1>.sessionContext.currentStatement" is null
        at jdbc.ucanaccess.shaded.org.hsqldb.TransactionManagerCommon.endActionTPL(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.TransactionManager2PL.completeActions(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.Session.endAction(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.Session.executeCompiledStatement(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.Session.executeCompiledBatchStatement(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.Session.execute(Unknown Source)
        at jdbc.ucanaccess.shaded.org.hsqldb.jdbc.JDBCPreparedStatement.executeBatch(Unknown Source)
        at net.ucanaccess.jdbc.ExecuteUpdate.executeWrapped(ExecuteUpdate.java:61)
        at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:264)
        at net.ucanaccess.jdbc.ExecuteUpdate.executeBatch(ExecuteUpdate.java:53)
        at net.ucanaccess.jdbc.UcanaccessStatement.executeBatch(UcanaccessStatement.java:203)
    

    We've updated HSQLDB to 2.7.2, and this did not occur in 2.5.0.

     
  • Alexander Maas

    Alexander Maas - 2023-11-29

    I'm glad it fixed your problem partially 😊

    But regarding your NullPointerException I am not able to reproduce that error (everything works fine).

    When I walk with the debugger into the HSQLDB TransactionManager class, I get the following stack trace:

        at java.base/java.lang.Thread.dumpStack(Thread.java:2209)
        at java.base/java.util.concurrent.atomic.AtomicLong.get(AtomicLong.java:104)
        at org.hsqldb.TransactionManager2PL.getSystemChangeNumber(Unknown Source)
        at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
        at org.hsqldb.Session.executeCompiledBatchStatement(Unknown Source)
        at org.hsqldb.Session.execute(Unknown Source)
        at org.hsqldb.jdbc.JDBCPreparedStatement.executeBatch(Unknown Source)
        at net.ucanaccess.jdbc.ExecuteUpdate.executeWrapped(ExecuteUpdate.java:61)
        at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:264)
        at net.ucanaccess.jdbc.ExecuteUpdate.executeBatch(ExecuteUpdate.java:53)
        at net.ucanaccess.jdbc.UcanaccessStatement.executeBatch(UcanaccessStatement.java:203)
        at [...] MyTests.TestUCanAccessBatch(MyTests.java:1337)
    

    We can see that in your configuration the HSQLDB class is a shaded one: jdbc.ucanaccess.shaded.org.hsqldb.TransactionManagerCommon.

    Obviously that might be the root cause of your NullPointerException. I'd recommend to check your classpath for libraries which interfere with your UCanAccess and HSQLDB driver.

     

Log in to post a comment.