diff --git a/sqlx-core/src/sqlite/connection/explain.rs b/sqlx-core/src/sqlite/connection/explain.rs index b2d9227a..3797a3d0 100644 --- a/sqlx-core/src/sqlite/connection/explain.rs +++ b/sqlx-core/src/sqlite/connection/explain.rs @@ -89,6 +89,7 @@ pub(super) async fn explain( let mut program_i = 0; let program_size = program.len(); + let mut visited = vec![false; program_size]; let mut output = Vec::new(); let mut nullable = Vec::new(); @@ -96,17 +97,23 @@ pub(super) async fn explain( let mut result = None; while program_i < program_size { + if visited[program_i] { + program_i += 1; + continue; + } let (_, ref opcode, p1, p2, p3, ref p4) = program[program_i]; match &**opcode { OP_INIT => { // start at + visited[program_i] = true; program_i = p2 as usize; continue; } OP_GOTO => { // goto + visited[program_i] = true; program_i = p2 as usize; continue; } @@ -239,6 +246,7 @@ pub(super) async fn explain( } } + visited[program_i] = true; program_i += 1; }