Search code examples
surrealdbsurrealdb-rpc

Sending a `create` RPC message to SurrealDB returns a "There was a problem with the database: The table does not exist" error


I'm debugging some tests for the .NET SurrealDB library. I can open connections to the database just fine but when I send a create RPC message to the db (docker container) it returns an error that reads "There was a problem with the database: The table does not exist"

TRACE tungstenite::protocol Received message {"id":"02B70C1AFE5D","async":true,"method":"create","params":["users",{"username":"john","password":"test123"}]}
...
16 13:46:45] DEBUG surrealdb::dbs Executing: CREATE $what CONTENT $data RETURN AFTER

surreal_1  | [2022-09-16 13:46:45] TRACE surrealdb::dbs Iterating: CREATE $what CONTENT $data RETURN AFTER

code: -32000, message: "There was a problem with the database: The table does not exist"

Any idea why that would happen? The table, of course, doesn't exist since I'm trying to create it. Would there be another reason in the Surreal code that such an error would be returned?


Solution

  • The error message was a red herring. The actual issue was that the client had an error that didn't allow it to sign in correctly so it wasn't authorized to make changes to the database.

    Offending code:

                // The table doesn't exist
                Err(Error::TbNotFound) => match opt.auth.check(Level::Db) {
                    // We can create the table automatically
                    true => {
                        run.add_and_cache_ns(opt.ns(), opt.strict).await?;
                        run.add_and_cache_db(opt.ns(), opt.db(), opt.strict).await?;
                        run.add_and_cache_tb(opt.ns(), opt.db(), &rid.tb, opt.strict).await
                    }
                    // We can't create the table so error
                    false => Err(Error::TbNotFound), // Wrong Error Message
                },
    

    This has since been fixed and should now return a query permission error if the client is unauthorized.