Parse FETCH [ALL | FORWARD n | BACKWARD n | n] FROM cursor_name.
(upper: &str, parts: &[&str])
| 84 | |
| 85 | /// Parse FETCH [ALL | FORWARD n | BACKWARD n | n] FROM cursor_name. |
| 86 | fn parse_fetch(upper: &str, parts: &[&str]) -> PgWireResult<(FetchDirection, usize, String)> { |
| 87 | // FETCH ALL FROM cursor_name |
| 88 | if upper.contains(" ALL ") { |
| 89 | let from_idx = parts |
| 90 | .iter() |
| 91 | .position(|p| p.eq_ignore_ascii_case("FROM")) |
| 92 | .unwrap_or(parts.len() - 1); |
| 93 | let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase(); |
| 94 | return Ok((FetchDirection::All, 0, cursor_name)); |
| 95 | } |
| 96 | |
| 97 | // FETCH BACKWARD n FROM cursor_name |
| 98 | if upper.contains("BACKWARD") { |
| 99 | let bw_idx = parts |
| 100 | .iter() |
| 101 | .position(|p| p.eq_ignore_ascii_case("BACKWARD")) |
| 102 | .unwrap_or(1); |
| 103 | let count = parts |
| 104 | .get(bw_idx + 1) |
| 105 | .and_then(|s| s.parse::<usize>().ok()) |
| 106 | .unwrap_or(1); |
| 107 | let from_idx = parts |
| 108 | .iter() |
| 109 | .position(|p| p.eq_ignore_ascii_case("FROM")) |
| 110 | .unwrap_or(parts.len() - 1); |
| 111 | let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase(); |
| 112 | return Ok((FetchDirection::Backward, count, cursor_name)); |
| 113 | } |
| 114 | |
| 115 | // FETCH FORWARD n FROM cursor_name |
| 116 | if upper.contains("FORWARD") { |
| 117 | let fw_idx = parts |
| 118 | .iter() |
| 119 | .position(|p| p.eq_ignore_ascii_case("FORWARD")) |
| 120 | .unwrap_or(1); |
| 121 | let count = parts |
| 122 | .get(fw_idx + 1) |
| 123 | .and_then(|s| s.parse::<usize>().ok()) |
| 124 | .unwrap_or(1); |
| 125 | let from_idx = parts |
| 126 | .iter() |
| 127 | .position(|p| p.eq_ignore_ascii_case("FROM")) |
| 128 | .unwrap_or(parts.len() - 1); |
| 129 | let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase(); |
| 130 | return Ok((FetchDirection::Forward, count, cursor_name)); |
| 131 | } |
| 132 | |
| 133 | // FETCH n FROM cursor_name (default: forward) |
| 134 | if parts.len() >= 4 && parts[2].eq_ignore_ascii_case("FROM") { |
| 135 | let count = parts[1].parse::<usize>().unwrap_or(1); |
| 136 | let cursor_name = parts[3].to_lowercase(); |
| 137 | return Ok((FetchDirection::Forward, count, cursor_name)); |
| 138 | } |
| 139 | |
| 140 | // FETCH FROM cursor_name (1 row forward) |
| 141 | if parts.len() >= 3 && parts[1].eq_ignore_ascii_case("FROM") { |
| 142 | let cursor_name = parts[2].to_lowercase(); |
| 143 | return Ok((FetchDirection::Forward, 1, cursor_name)); |