implement pragma pragma_list

List all available pragmas (Except pragma_list)
This commit is contained in:
Glauber Costa
2025-01-30 21:05:31 -05:00
parent 62efbde661
commit a7cc367c1f
4 changed files with 64 additions and 1 deletions

View File

@@ -138,7 +138,7 @@ The current status of Limbo is:
| PRAGMA page_count | No | |
| PRAGMA page_size | No | |
| PRAGMA parser_trace | No | |
| PRAGMA pragma_list | No | |
| PRAGMA pragma_list | Yes | |
| PRAGMA query_only | No | |
| PRAGMA quick_check | No | |
| PRAGMA read_uncommitted | No | |

25
Cargo.lock generated
View File

@@ -1588,6 +1588,7 @@ dependencies = [
"serde",
"sieve-cache",
"sqlite3-parser",
"strum",
"tempfile",
"thiserror 1.0.69",
]
@@ -2704,6 +2705,8 @@ dependencies = [
"phf",
"phf_codegen",
"phf_shared",
"strum",
"strum_macros",
"uncased",
]
@@ -2731,6 +2734,28 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "strum"
version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
dependencies = [
"heck",
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.96",
]
[[package]]
name = "supports-color"
version = "3.0.2"

View File

@@ -66,6 +66,7 @@ limbo_vector = { path = "../extensions/vector", optional = true, features = ["st
limbo_regexp = { path = "../extensions/regexp", optional = true, features = ["static"] }
limbo_percentile = { path = "../extensions/percentile", optional = true, features = ["static"] }
miette = "7.4.0"
strum = "0.26"
[build-dependencies]
chrono = "0.4.38"

View File

@@ -29,6 +29,7 @@ use crate::storage::wal::CheckpointMode;
use crate::translate::delete::translate_delete;
use crate::util::{normalize_ident, PRIMARY_KEY_AUTOMATIC_INDEX_NAME_PREFIX};
use crate::vdbe::builder::CursorType;
use crate::vdbe::BranchOffset;
use crate::vdbe::{builder::ProgramBuilder, insn::Insn, Program};
use crate::{bail_parse_error, Connection, LimboError, Result, SymbolTable};
use insert::translate_insert;
@@ -38,6 +39,7 @@ use std::cell::RefCell;
use std::fmt::Display;
use std::rc::{Rc, Weak};
use std::str::FromStr;
use strum::IntoEnumIterator;
/// Translate SQL statement into bytecode program.
pub fn translate(
@@ -531,6 +533,36 @@ enum PrimaryKeyDefinitionType<'a> {
Composite,
}
fn list_pragmas(
program: &mut ProgramBuilder,
init_label: BranchOffset,
start_offset: BranchOffset,
) {
let mut pragma_strings: Vec<String> = PragmaName::iter().map(|x| x.to_string()).collect();
pragma_strings.sort();
let register = program.alloc_register();
for pragma in &pragma_strings {
program.emit_insn(Insn::String8 {
value: pragma.to_string(),
dest: register,
});
program.emit_insn(Insn::ResultRow {
start_reg: register,
count: 1,
});
}
program.emit_insn(Insn::Halt {
err_code: 0,
description: String::new(),
});
program.resolve_label(init_label, program.offset());
program.emit_constant_insns();
program.emit_insn(Insn::Goto {
target_pc: start_offset,
});
}
fn translate_pragma(
program: &mut ProgramBuilder,
schema: &Schema,
@@ -546,6 +578,11 @@ fn translate_pragma(
let start_offset = program.offset();
let mut write = false;
if name.name.0.to_lowercase() == "pragma_list" {
list_pragmas(program, init_label, start_offset);
return Ok(());
}
let pragma = match PragmaName::from_str(&name.name.0) {
Ok(pragma) => pragma,
Err(_) => bail_parse_error!("Not a valid pragma name"),