-
Notifications
You must be signed in to change notification settings - Fork 13
Set temp_store_directory on Android #173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
@Test | ||
fun canCreateTemporaryTable() = runTest { | ||
database.execute("PRAGMA temp_store = 1;") // Store temporary data as files | ||
database.execute("CREATE TEMP TABLE my_tbl (content ANY) STRICT;") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's worth noting that this test passes even without the pragma, but I'm not sure why. My understanding is that SQLite should use temporary files here, but it apparently doesn't.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe SQLite always keeps it in memory first, until it reaches a certain size threshold. I can't find any docs confirming this though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've tried inserting a 1MiB randomblob
128 times, but it still seems to pass without setting the temp directory.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another thing to check is the Android version it is being tested on - I remember this potentially only affecting newer Android versions. Although I can't find where the test emulator is specified here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've just tested this manually with an SDK 35 emulator. An SDK-specific issue would surprise me though, we ship our own SQLite library along with the application. Or are you saying that some Android versions give apps their own /tmp
that would be writable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I think I'm remembering anecdotes of temporary storage issues only being present on some Android versions, but I don't think we ever confirmed that.
Either way it doesn't quite explain how these tests worked, unless the emulator uses different filesystem permission structures from actual devices?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unless the emulator uses different filesystem permission structures from actual devices?
That sounds unlikely, the emulator is a VM running a real Android system.
I think I'm remembering anecdotes of temporary storage issues only being present on some Android versions
I've asked the user reporting this to share the Android version they're using. Maybe it's not a problem on newer Android versions and that's why we didn't catch this.
SQLite tries to write some temporary data, such as large intermediate materialized views or indexes, to the file system. For this, it attempts to use paths in
/tmp
or the current working directory. Due to sandboxing, both directories are unavailable on Android though. This can cause errors that users were running into.As a workaround, this overwrites the temporary directory to point to the cache directory from the app's
Context
.