diff --git a/core/schema.rs b/core/schema.rs index 72a16e4c7..a30d59dcf 100644 --- a/core/schema.rs +++ b/core/schema.rs @@ -14,6 +14,9 @@ use std::rc::Rc; use std::sync::Arc; use tracing::trace; +const SCHEMA_TABLE_NAME: &str = "sqlite_schema"; +const SCHEMA_TABLE_NAME_ALT: &str = "sqlite_master"; + pub struct Schema { pub tables: HashMap>, // table_name to list of indexes for the table @@ -26,7 +29,7 @@ impl Schema { let indexes: HashMap>> = HashMap::new(); #[allow(clippy::arc_with_non_send_sync)] tables.insert( - "sqlite_schema".to_string(), + SCHEMA_TABLE_NAME.to_string(), Arc::new(Table::BTree(sqlite_schema_table().into())), ); Self { tables, indexes } @@ -51,7 +54,12 @@ impl Schema { pub fn get_table(&self, name: &str) -> Option> { let name = normalize_ident(name); - self.tables.get(&name).cloned() + let name = if name.eq_ignore_ascii_case(&SCHEMA_TABLE_NAME_ALT) { + SCHEMA_TABLE_NAME + } else { + &name + }; + self.tables.get(name).cloned() } pub fn remove_table(&mut self, table_name: &str) { diff --git a/testing/pragma.test b/testing/pragma.test index dbe7b00eb..ff42424bf 100755 --- a/testing/pragma.test +++ b/testing/pragma.test @@ -47,6 +47,33 @@ do_execsql_test pragma-table-info-call-syntax { 4|sql|TEXT|0||0 } +do_execsql_test pragma-table-info-alt-name-equal-syntax { + PRAGMA table_info=sqlite_master +} {0|type|TEXT|0||0 +1|name|TEXT|0||0 +2|tbl_name|TEXT|0||0 +3|rootpage|INT|0||0 +4|sql|TEXT|0||0 +} + +do_execsql_test pragma-table-info-alt-name-call-syntax { + PRAGMA table_info(sqlite_master) +} {0|type|TEXT|0||0 +1|name|TEXT|0||0 +2|tbl_name|TEXT|0||0 +3|rootpage|INT|0||0 +4|sql|TEXT|0||0 +} + +do_execsql_test pragma-function-table-info-alt-name { + SELECT * FROM pragma_table_info('sqlite_master') +} {0|type|TEXT|0||0 +1|name|TEXT|0||0 +2|tbl_name|TEXT|0||0 +3|rootpage|INT|0||0 +4|sql|TEXT|0||0 +} + do_execsql_test pragma-function-table-info { SELECT * FROM pragma_table_info('sqlite_schema') } {0|type|TEXT|0||0