pub async fn table_columns(table: &str) -> Result<Vec<ColumnInfo>, AppError>Expand description
table’s columns, in declaration order. Callers MUST have already
validated table against list_tables - SQLite’s PRAGMA can’t
take a bind parameter for the table name, so it’s interpolated
directly, safe only because it’s guaranteed to be a real, existing
table name by the time this runs, never raw user input.