Substitute NEW.field, OLD.field, TG_OP, TG_TABLE_NAME, TG_WHEN in SQL text. Replaces: - `NEW.field_name` → SQL literal of the field value - `OLD.field_name` → SQL literal of the field value - `TG_OP` → 'INSERT' / 'UPDATE' / 'DELETE' - `TG_TABLE_NAME` → 'collection_name' - `TG_WHEN` → 'BEFORE' / 'AFTER' - `COALESCE(NEW.field, OLD.field)` handled naturally since each is replaced
(&self, sql: &str)
| 173 | /// - `TG_WHEN` → 'BEFORE' / 'AFTER' |
| 174 | /// - `COALESCE(NEW.field, OLD.field)` handled naturally since each is replaced |
| 175 | pub fn substitute(&self, sql: &str) -> String { |
| 176 | let mut result = sql.to_string(); |
| 177 | |
| 178 | // Replace NEW.field references. |
| 179 | if let Some(ref new_row) = self.new_row { |
| 180 | for (field, value) in new_row { |
| 181 | let literal = value.to_sql_literal(); |
| 182 | result = replace_qualified_field_reference(&result, "NEW", field, &literal); |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | // Replace OLD.field references. |
| 187 | if let Some(ref old_row) = self.old_row { |
| 188 | for (field, value) in old_row { |
| 189 | let literal = value.to_sql_literal(); |
| 190 | result = replace_qualified_field_reference(&result, "OLD", field, &literal); |
| 191 | } |
| 192 | } |
| 193 | |
| 194 | // Replace user-defined variables (loop vars, procedure params). |
| 195 | for (name, value) in &self.variables { |
| 196 | result = replace_case_insensitive(&result, name, value); |
| 197 | } |
| 198 | |
| 199 | // Replace statement-level variables. |
| 200 | result = replace_case_insensitive(&result, "TG_OP", &format!("'{}'", self.tg_op)); |
| 201 | result = replace_case_insensitive( |
| 202 | &result, |
| 203 | "TG_TABLE_NAME", |
| 204 | &format!("'{}'", self.tg_table_name), |
| 205 | ); |
| 206 | result = replace_case_insensitive(&result, "TG_WHEN", &format!("'{}'", self.tg_when)); |
| 207 | |
| 208 | result |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | fn replace_qualified_field_reference( |