1use std::fmt::{self, Display, Formatter, Write};
3
4use crate::ast::*;
5use crate::dialect::TokenType::*;
6
7struct FmtTokenStream<'a, 'b> {
8 f: &'a mut Formatter<'b>,
9 spaced: bool,
10}
11
12impl TokenStream for FmtTokenStream<'_, '_> {
13 type Error = fmt::Error;
14
15 fn append(&mut self, ty: TokenType, value: Option<&str>) -> fmt::Result {
16 if !self.spaced {
17 match ty {
18 TK_COMMA | TK_SEMI | TK_RP | TK_DOT => {}
19 _ => {
20 self.f.write_char(' ')?;
21 self.spaced = true;
22 }
23 };
24 }
25 if ty == TK_BLOB {
26 self.f.write_char('X')?;
27 self.f.write_char('\'')?;
28 if let Some(str) = value {
29 self.f.write_str(str)?;
30 }
31 return self.f.write_char('\'');
32 } else if let Some(str) = ty.as_str() {
33 self.f.write_str(str)?;
34 self.spaced = ty == TK_LP || ty == TK_DOT; }
36 if let Some(str) = value {
37 self.spaced = str.bytes().all(|b| b.is_ascii_whitespace());
39 self.f.write_str(str)
43 } else {
44 Ok(())
45 }
46 }
47}
48
49pub trait TokenStream {
51 type Error;
53 fn append(&mut self, ty: TokenType, value: Option<&str>) -> Result<(), Self::Error>;
55}
56
57pub trait ToTokens {
59 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error>;
61 fn to_fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
63 let mut s = FmtTokenStream { f, spaced: true };
64 self.to_tokens(&mut s)
65 }
66}
67
68impl<T: ?Sized + ToTokens> ToTokens for &T {
69 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
70 ToTokens::to_tokens(&**self, s)
71 }
72}
73
74impl ToTokens for String {
75 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
76 s.append(TK_ANY, Some(self.as_ref()))
77 }
78}
79impl ToTokens for Box<str> {
80 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
81 s.append(TK_ANY, Some(self.as_ref()))
82 }
83}
84
85impl ToTokens for Cmd {
98 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
99 match self {
100 Self::Explain(stmt) => {
101 s.append(TK_EXPLAIN, None)?;
102 stmt.to_tokens(s)?;
103 }
104 Self::ExplainQueryPlan(stmt) => {
105 s.append(TK_EXPLAIN, None)?;
106 s.append(TK_QUERY, None)?;
107 s.append(TK_PLAN, None)?;
108 stmt.to_tokens(s)?;
109 }
110 Self::Stmt(stmt) => {
111 stmt.to_tokens(s)?;
112 }
113 }
114 s.append(TK_SEMI, None)
115 }
116}
117
118impl Display for Cmd {
119 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
120 self.to_fmt(f)
121 }
122}
123
124impl ToTokens for Stmt {
125 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
126 match self {
127 Self::AlterTable(tbl_name, body) => {
128 s.append(TK_ALTER, None)?;
129 s.append(TK_TABLE, None)?;
130 tbl_name.to_tokens(s)?;
131 body.to_tokens(s)
132 }
133 Self::Analyze(obj_name) => {
134 s.append(TK_ANALYZE, None)?;
135 if let Some(obj_name) = obj_name {
136 obj_name.to_tokens(s)?;
137 }
138 Ok(())
139 }
140 Self::Attach { expr, db_name, key } => {
141 s.append(TK_ATTACH, None)?;
142 expr.to_tokens(s)?;
143 s.append(TK_AS, None)?;
144 db_name.to_tokens(s)?;
145 if let Some(key) = key {
146 s.append(TK_KEY, None)?;
147 key.to_tokens(s)?;
148 }
149 Ok(())
150 }
151 Self::Begin(tx_type, tx_name) => {
152 s.append(TK_BEGIN, None)?;
153 if let Some(tx_type) = tx_type {
154 tx_type.to_tokens(s)?;
155 }
156 if let Some(tx_name) = tx_name {
157 s.append(TK_TRANSACTION, None)?;
158 tx_name.to_tokens(s)?;
159 }
160 Ok(())
161 }
162 Self::Commit(tx_name) => {
163 s.append(TK_COMMIT, None)?;
164 if let Some(tx_name) = tx_name {
165 s.append(TK_TRANSACTION, None)?;
166 tx_name.to_tokens(s)?;
167 }
168 Ok(())
169 }
170 Self::CreateIndex {
171 unique,
172 if_not_exists,
173 idx_name,
174 tbl_name,
175 columns,
176 where_clause,
177 } => {
178 s.append(TK_CREATE, None)?;
179 if *unique {
180 s.append(TK_UNIQUE, None)?;
181 }
182 s.append(TK_INDEX, None)?;
183 if *if_not_exists {
184 s.append(TK_IF, None)?;
185 s.append(TK_NOT, None)?;
186 s.append(TK_EXISTS, None)?;
187 }
188 idx_name.to_tokens(s)?;
189 s.append(TK_ON, None)?;
190 tbl_name.to_tokens(s)?;
191 s.append(TK_LP, None)?;
192 comma(columns, s)?;
193 s.append(TK_RP, None)?;
194 if let Some(where_clause) = where_clause {
195 s.append(TK_WHERE, None)?;
196 where_clause.to_tokens(s)?;
197 }
198 Ok(())
199 }
200 Self::CreateTable {
201 temporary,
202 if_not_exists,
203 tbl_name,
204 body,
205 } => {
206 s.append(TK_CREATE, None)?;
207 if *temporary {
208 s.append(TK_TEMP, None)?;
209 }
210 s.append(TK_TABLE, None)?;
211 if *if_not_exists {
212 s.append(TK_IF, None)?;
213 s.append(TK_NOT, None)?;
214 s.append(TK_EXISTS, None)?;
215 }
216 tbl_name.to_tokens(s)?;
217 body.to_tokens(s)
218 }
219 Self::CreateTrigger {
220 temporary,
221 if_not_exists,
222 trigger_name,
223 time,
224 event,
225 tbl_name,
226 for_each_row,
227 when_clause,
228 commands,
229 } => {
230 s.append(TK_CREATE, None)?;
231 if *temporary {
232 s.append(TK_TEMP, None)?;
233 }
234 s.append(TK_TRIGGER, None)?;
235 if *if_not_exists {
236 s.append(TK_IF, None)?;
237 s.append(TK_NOT, None)?;
238 s.append(TK_EXISTS, None)?;
239 }
240 trigger_name.to_tokens(s)?;
241 if let Some(time) = time {
242 time.to_tokens(s)?;
243 }
244 event.to_tokens(s)?;
245 s.append(TK_ON, None)?;
246 tbl_name.to_tokens(s)?;
247 if *for_each_row {
248 s.append(TK_FOR, None)?;
249 s.append(TK_EACH, None)?;
250 s.append(TK_ROW, None)?;
251 }
252 if let Some(when_clause) = when_clause {
253 s.append(TK_WHEN, None)?;
254 when_clause.to_tokens(s)?;
255 }
256 s.append(TK_BEGIN, Some("\n"))?;
257 for command in commands {
258 command.to_tokens(s)?;
259 s.append(TK_SEMI, Some("\n"))?;
260 }
261 s.append(TK_END, None)
262 }
263 Self::CreateView {
264 temporary,
265 if_not_exists,
266 view_name,
267 columns,
268 select,
269 } => {
270 s.append(TK_CREATE, None)?;
271 if *temporary {
272 s.append(TK_TEMP, None)?;
273 }
274 s.append(TK_VIEW, None)?;
275 if *if_not_exists {
276 s.append(TK_IF, None)?;
277 s.append(TK_NOT, None)?;
278 s.append(TK_EXISTS, None)?;
279 }
280 view_name.to_tokens(s)?;
281 if let Some(columns) = columns {
282 s.append(TK_LP, None)?;
283 comma(columns, s)?;
284 s.append(TK_RP, None)?;
285 }
286 s.append(TK_AS, None)?;
287 select.to_tokens(s)
288 }
289 Self::CreateVirtualTable {
290 if_not_exists,
291 tbl_name,
292 module_name,
293 args,
294 } => {
295 s.append(TK_CREATE, None)?;
296 s.append(TK_VIRTUAL, None)?;
297 s.append(TK_TABLE, None)?;
298 if *if_not_exists {
299 s.append(TK_IF, None)?;
300 s.append(TK_NOT, None)?;
301 s.append(TK_EXISTS, None)?;
302 }
303 tbl_name.to_tokens(s)?;
304 s.append(TK_USING, None)?;
305 module_name.to_tokens(s)?;
306 s.append(TK_LP, None)?;
307 if let Some(args) = args {
308 comma(args, s)?;
309 }
310 s.append(TK_RP, None)
311 }
312 Self::Delete {
313 with,
314 tbl_name,
315 indexed,
316 where_clause,
317 returning,
318 order_by,
319 limit,
320 } => {
321 if let Some(with) = with {
322 with.to_tokens(s)?;
323 }
324 s.append(TK_DELETE, None)?;
325 s.append(TK_FROM, None)?;
326 tbl_name.to_tokens(s)?;
327 if let Some(indexed) = indexed {
328 indexed.to_tokens(s)?;
329 }
330 if let Some(where_clause) = where_clause {
331 s.append(TK_WHERE, None)?;
332 where_clause.to_tokens(s)?;
333 }
334 if let Some(returning) = returning {
335 s.append(TK_RETURNING, None)?;
336 comma(returning, s)?;
337 }
338 if let Some(order_by) = order_by {
339 s.append(TK_ORDER, None)?;
340 s.append(TK_BY, None)?;
341 comma(order_by, s)?;
342 }
343 if let Some(limit) = limit {
344 limit.to_tokens(s)?;
345 }
346 Ok(())
347 }
348 Self::Detach(expr) => {
349 s.append(TK_DETACH, None)?;
350 expr.to_tokens(s)
351 }
352 Self::DropIndex {
353 if_exists,
354 idx_name,
355 } => {
356 s.append(TK_DROP, None)?;
357 s.append(TK_INDEX, None)?;
358 if *if_exists {
359 s.append(TK_IF, None)?;
360 s.append(TK_EXISTS, None)?;
361 }
362 idx_name.to_tokens(s)
363 }
364 Self::DropTable {
365 if_exists,
366 tbl_name,
367 } => {
368 s.append(TK_DROP, None)?;
369 s.append(TK_TABLE, None)?;
370 if *if_exists {
371 s.append(TK_IF, None)?;
372 s.append(TK_EXISTS, None)?;
373 }
374 tbl_name.to_tokens(s)
375 }
376 Self::DropTrigger {
377 if_exists,
378 trigger_name,
379 } => {
380 s.append(TK_DROP, None)?;
381 s.append(TK_TRIGGER, None)?;
382 if *if_exists {
383 s.append(TK_IF, None)?;
384 s.append(TK_EXISTS, None)?;
385 }
386 trigger_name.to_tokens(s)
387 }
388 Self::DropView {
389 if_exists,
390 view_name,
391 } => {
392 s.append(TK_DROP, None)?;
393 s.append(TK_VIEW, None)?;
394 if *if_exists {
395 s.append(TK_IF, None)?;
396 s.append(TK_EXISTS, None)?;
397 }
398 view_name.to_tokens(s)
399 }
400 Self::Insert {
401 with,
402 or_conflict,
403 tbl_name,
404 columns,
405 body,
406 returning,
407 } => {
408 if let Some(with) = with {
409 with.to_tokens(s)?;
410 }
411 if let Some(ResolveType::Replace) = or_conflict {
412 s.append(TK_REPLACE, None)?;
413 } else {
414 s.append(TK_INSERT, None)?;
415 if let Some(or_conflict) = or_conflict {
416 s.append(TK_OR, None)?;
417 or_conflict.to_tokens(s)?;
418 }
419 }
420 s.append(TK_INTO, None)?;
421 tbl_name.to_tokens(s)?;
422 if let Some(columns) = columns {
423 s.append(TK_LP, None)?;
424 comma(columns.deref(), s)?;
425 s.append(TK_RP, None)?;
426 }
427 body.to_tokens(s)?;
428 if let Some(returning) = returning {
429 s.append(TK_RETURNING, None)?;
430 comma(returning, s)?;
431 }
432 Ok(())
433 }
434 Self::Pragma(name, value) => {
435 s.append(TK_PRAGMA, None)?;
436 name.to_tokens(s)?;
437 if let Some(value) = value {
438 value.to_tokens(s)?;
439 }
440 Ok(())
441 }
442 Self::Reindex { obj_name } => {
443 s.append(TK_REINDEX, None)?;
444 if let Some(obj_name) = obj_name {
445 obj_name.to_tokens(s)?;
446 }
447 Ok(())
448 }
449 Self::Release(name) => {
450 s.append(TK_RELEASE, None)?;
451 name.to_tokens(s)
452 }
453 Self::Rollback {
454 tx_name,
455 savepoint_name,
456 } => {
457 s.append(TK_ROLLBACK, None)?;
458 if let Some(tx_name) = tx_name {
459 s.append(TK_TRANSACTION, None)?;
460 tx_name.to_tokens(s)?;
461 }
462 if let Some(savepoint_name) = savepoint_name {
463 s.append(TK_TO, None)?;
464 savepoint_name.to_tokens(s)?;
465 }
466 Ok(())
467 }
468 Self::Savepoint(name) => {
469 s.append(TK_SAVEPOINT, None)?;
470 name.to_tokens(s)
471 }
472 Self::Select(select) => select.to_tokens(s),
473 Self::Update {
474 with,
475 or_conflict,
476 tbl_name,
477 indexed,
478 sets,
479 from,
480 where_clause,
481 returning,
482 order_by,
483 limit,
484 } => {
485 if let Some(with) = with {
486 with.to_tokens(s)?;
487 }
488 s.append(TK_UPDATE, None)?;
489 if let Some(or_conflict) = or_conflict {
490 s.append(TK_OR, None)?;
491 or_conflict.to_tokens(s)?;
492 }
493 tbl_name.to_tokens(s)?;
494 if let Some(indexed) = indexed {
495 indexed.to_tokens(s)?;
496 }
497 s.append(TK_SET, None)?;
498 comma(sets, s)?;
499 if let Some(from) = from {
500 s.append(TK_FROM, None)?;
501 from.to_tokens(s)?;
502 }
503 if let Some(where_clause) = where_clause {
504 s.append(TK_WHERE, None)?;
505 where_clause.to_tokens(s)?;
506 }
507 if let Some(returning) = returning {
508 s.append(TK_RETURNING, None)?;
509 comma(returning, s)?;
510 }
511 if let Some(order_by) = order_by {
512 s.append(TK_ORDER, None)?;
513 s.append(TK_BY, None)?;
514 comma(order_by, s)?;
515 }
516 if let Some(limit) = limit {
517 limit.to_tokens(s)?;
518 }
519 Ok(())
520 }
521 Self::Vacuum(name, expr) => {
522 s.append(TK_VACUUM, None)?;
523 if let Some(ref name) = name {
524 name.to_tokens(s)?;
525 }
526 if let Some(ref expr) = expr {
527 s.append(TK_INTO, None)?;
528 expr.to_tokens(s)?;
529 }
530 Ok(())
531 }
532 }
533 }
534}
535
536impl ToTokens for Expr {
537 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
538 match self {
539 Self::Between {
540 lhs,
541 not,
542 start,
543 end,
544 } => {
545 lhs.to_tokens(s)?;
546 if *not {
547 s.append(TK_NOT, None)?;
548 }
549 s.append(TK_BETWEEN, None)?;
550 start.to_tokens(s)?;
551 s.append(TK_AND, None)?;
552 end.to_tokens(s)
553 }
554 Self::Binary(lhs, op, rhs) => {
555 lhs.to_tokens(s)?;
556 op.to_tokens(s)?;
557 rhs.to_tokens(s)
558 }
559 Self::Case {
560 base,
561 when_then_pairs,
562 else_expr,
563 } => {
564 s.append(TK_CASE, None)?;
565 if let Some(ref base) = base {
566 base.to_tokens(s)?;
567 }
568 for (when, then) in when_then_pairs {
569 s.append(TK_WHEN, None)?;
570 when.to_tokens(s)?;
571 s.append(TK_THEN, None)?;
572 then.to_tokens(s)?;
573 }
574 if let Some(ref else_expr) = else_expr {
575 s.append(TK_ELSE, None)?;
576 else_expr.to_tokens(s)?;
577 }
578 s.append(TK_END, None)
579 }
580 Self::Cast { expr, type_name } => {
581 s.append(TK_CAST, None)?;
582 s.append(TK_LP, None)?;
583 expr.to_tokens(s)?;
584 s.append(TK_AS, None)?;
585 if let Some(ref type_name) = type_name {
586 type_name.to_tokens(s)?;
587 }
588 s.append(TK_RP, None)
589 }
590 Self::Collate(expr, collation) => {
591 expr.to_tokens(s)?;
592 s.append(TK_COLLATE, None)?;
593 double_quote(collation, s)
594 }
595 Self::DoublyQualified(db_name, tbl_name, col_name) => {
596 db_name.to_tokens(s)?;
597 s.append(TK_DOT, None)?;
598 tbl_name.to_tokens(s)?;
599 s.append(TK_DOT, None)?;
600 col_name.to_tokens(s)
601 }
602 Self::Exists(subquery) => {
603 s.append(TK_EXISTS, None)?;
604 s.append(TK_LP, None)?;
605 subquery.to_tokens(s)?;
606 s.append(TK_RP, None)
607 }
608 Self::FunctionCall {
609 name,
610 distinctness,
611 args,
612 order_by,
613 filter_over,
614 } => {
615 name.to_tokens(s)?;
616 s.append(TK_LP, None)?;
617 if let Some(distinctness) = distinctness {
618 distinctness.to_tokens(s)?;
619 }
620 if let Some(args) = args {
621 comma(args, s)?;
622 }
623 if let Some(order_by) = order_by {
624 match order_by {
625 FunctionCallOrder::SortList(order_by) => {
626 s.append(TK_ORDER, None)?;
627 s.append(TK_BY, None)?;
628 comma(order_by, s)?;
629 }
630 #[cfg(feature = "SQLITE_ENABLE_ORDERED_SET_AGGREGATES")]
631 FunctionCallOrder::WithinGroup(order_by) => {
632 s.append(TK_RP, None)?;
633 s.append(TK_WITHIN, None)?;
634 s.append(TK_GROUP, None)?;
635 s.append(TK_LP, None)?;
636 s.append(TK_ORDER, None)?;
637 s.append(TK_BY, None)?;
638 order_by.to_tokens(s)?;
639 }
640 }
641 }
642 s.append(TK_RP, None)?;
643 if let Some(filter_over) = filter_over {
644 filter_over.to_tokens(s)?;
645 }
646 Ok(())
647 }
648 Self::FunctionCallStar { name, filter_over } => {
649 name.to_tokens(s)?;
650 s.append(TK_LP, None)?;
651 s.append(TK_STAR, None)?;
652 s.append(TK_RP, None)?;
653 if let Some(filter_over) = filter_over {
654 filter_over.to_tokens(s)?;
655 }
656 Ok(())
657 }
658 Self::Id(id) => id.to_tokens(s),
659 Self::InList { lhs, not, rhs } => {
660 lhs.to_tokens(s)?;
661 if *not {
662 s.append(TK_NOT, None)?;
663 }
664 s.append(TK_IN, None)?;
665 s.append(TK_LP, None)?;
666 if let Some(rhs) = rhs {
667 comma(rhs, s)?;
668 }
669 s.append(TK_RP, None)
670 }
671 Self::InSelect { lhs, not, rhs } => {
672 lhs.to_tokens(s)?;
673 if *not {
674 s.append(TK_NOT, None)?;
675 }
676 s.append(TK_IN, None)?;
677 s.append(TK_LP, None)?;
678 rhs.to_tokens(s)?;
679 s.append(TK_RP, None)
680 }
681 Self::InTable {
682 lhs,
683 not,
684 rhs,
685 args,
686 } => {
687 lhs.to_tokens(s)?;
688 if *not {
689 s.append(TK_NOT, None)?;
690 }
691 s.append(TK_IN, None)?;
692 rhs.to_tokens(s)?;
693 if let Some(args) = args {
694 s.append(TK_LP, None)?;
695 comma(args, s)?;
696 s.append(TK_RP, None)?;
697 }
698 Ok(())
699 }
700 Self::IsNull(sub_expr) => {
701 sub_expr.to_tokens(s)?;
702 s.append(TK_ISNULL, None)
703 }
704 Self::Like {
705 lhs,
706 not,
707 op,
708 rhs,
709 escape,
710 } => {
711 lhs.to_tokens(s)?;
712 if *not {
713 s.append(TK_NOT, None)?;
714 }
715 op.to_tokens(s)?;
716 rhs.to_tokens(s)?;
717 if let Some(escape) = escape {
718 s.append(TK_ESCAPE, None)?;
719 escape.to_tokens(s)?;
720 }
721 Ok(())
722 }
723 Self::Literal(lit) => lit.to_tokens(s),
724 Self::Name(name) => name.to_tokens(s),
725 Self::NotNull(sub_expr) => {
726 sub_expr.to_tokens(s)?;
727 s.append(TK_NOTNULL, None)
728 }
729 Self::Parenthesized(exprs) => {
730 s.append(TK_LP, None)?;
731 comma(exprs, s)?;
732 s.append(TK_RP, None)
733 }
734 Self::Qualified(qualifier, qualified) => {
735 qualifier.to_tokens(s)?;
736 s.append(TK_DOT, None)?;
737 qualified.to_tokens(s)
738 }
739 Self::Raise(rt, err) => {
740 s.append(TK_RAISE, None)?;
741 s.append(TK_LP, None)?;
742 rt.to_tokens(s)?;
743 if let Some(err) = err {
744 s.append(TK_COMMA, None)?;
745 err.to_tokens(s)?;
746 }
747 s.append(TK_RP, None)
748 }
749 Self::Subquery(query) => {
750 s.append(TK_LP, None)?;
751 query.to_tokens(s)?;
752 s.append(TK_RP, None)
753 }
754 Self::Unary(op, sub_expr) => {
755 op.to_tokens(s)?;
756 sub_expr.to_tokens(s)
757 }
758 Self::Variable(var) => match var.chars().next() {
759 Some(c) if c == '$' || c == '@' || c == '#' || c == ':' => {
760 s.append(TK_VARIABLE, Some(var))
761 }
762 Some(_) => s.append(TK_VARIABLE, Some(&("?".to_owned() + var))),
763 None => s.append(TK_VARIABLE, Some("?")),
764 },
765 }
766 }
767}
768
769impl Display for Expr {
770 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
771 self.to_fmt(f)
772 }
773}
774
775impl ToTokens for Literal {
776 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
777 match self {
778 Self::Numeric(ref num) => s.append(TK_FLOAT, Some(num)), Self::String(ref str) => s.append(TK_STRING, Some(str)),
780 Self::Blob(ref blob) => s.append(TK_BLOB, Some(blob)),
781 Self::Keyword(ref str) => s.append(TK_ID, Some(str)), Self::Null => s.append(TK_NULL, None),
783 Self::CurrentDate => s.append(TK_CTIME_KW, Some("CURRENT_DATE")),
784 Self::CurrentTime => s.append(TK_CTIME_KW, Some("CURRENT_TIME")),
785 Self::CurrentTimestamp => s.append(TK_CTIME_KW, Some("CURRENT_TIMESTAMP")),
786 }
787 }
788}
789
790impl ToTokens for LikeOperator {
791 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
792 s.append(
793 TK_LIKE_KW,
794 Some(match self {
795 Self::Glob => "GLOB",
796 Self::Like => "LIKE",
797 Self::Match => "MATCH",
798 Self::Regexp => "REGEXP",
799 }),
800 )
801 }
802}
803
804impl ToTokens for Operator {
805 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
806 match self {
807 Self::Add => s.append(TK_PLUS, None),
808 Self::And => s.append(TK_AND, None),
809 Self::ArrowRight => s.append(TK_PTR, Some("->")),
810 Self::ArrowRightShift => s.append(TK_PTR, Some("->>")),
811 Self::BitwiseAnd => s.append(TK_BITAND, None),
812 Self::BitwiseOr => s.append(TK_BITOR, None),
813 Self::Concat => s.append(TK_CONCAT, None),
814 Self::Equals => s.append(TK_EQ, None),
815 Self::Divide => s.append(TK_SLASH, None),
816 Self::Greater => s.append(TK_GT, None),
817 Self::GreaterEquals => s.append(TK_GE, None),
818 Self::Is => s.append(TK_IS, None),
819 Self::IsNot => {
820 s.append(TK_IS, None)?;
821 s.append(TK_NOT, None)
822 }
823 Self::LeftShift => s.append(TK_LSHIFT, None),
824 Self::Less => s.append(TK_LT, None),
825 Self::LessEquals => s.append(TK_LE, None),
826 Self::Modulus => s.append(TK_REM, None),
827 Self::Multiply => s.append(TK_STAR, None),
828 Self::NotEquals => s.append(TK_NE, None),
829 Self::Or => s.append(TK_OR, None),
830 Self::RightShift => s.append(TK_RSHIFT, None),
831 Self::Subtract => s.append(TK_MINUS, None),
832 }
833 }
834}
835
836impl ToTokens for UnaryOperator {
837 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
838 s.append(
839 match self {
840 Self::BitwiseNot => TK_BITNOT,
841 Self::Negative => TK_MINUS,
842 Self::Not => TK_NOT,
843 Self::Positive => TK_PLUS,
844 },
845 None,
846 )
847 }
848}
849
850impl ToTokens for Select {
851 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
852 if let Some(ref with) = self.with {
853 with.to_tokens(s)?;
854 }
855 self.body.to_tokens(s)?;
856 if let Some(ref order_by) = self.order_by {
857 s.append(TK_ORDER, None)?;
858 s.append(TK_BY, None)?;
859 comma(order_by, s)?;
860 }
861 if let Some(ref limit) = self.limit {
862 limit.to_tokens(s)?;
863 }
864 Ok(())
865 }
866}
867
868impl ToTokens for SelectBody {
869 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
870 self.select.to_tokens(s)?;
871 if let Some(ref compounds) = self.compounds {
872 for compound in compounds {
873 compound.to_tokens(s)?;
874 }
875 }
876 Ok(())
877 }
878}
879
880impl ToTokens for CompoundSelect {
881 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
882 self.operator.to_tokens(s)?;
883 self.select.to_tokens(s)
884 }
885}
886
887impl ToTokens for CompoundOperator {
888 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
889 match self {
890 Self::Union => s.append(TK_UNION, None),
891 Self::UnionAll => {
892 s.append(TK_UNION, None)?;
893 s.append(TK_ALL, None)
894 }
895 Self::Except => s.append(TK_EXCEPT, None),
896 Self::Intersect => s.append(TK_INTERSECT, None),
897 }
898 }
899}
900
901impl Display for CompoundOperator {
902 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
903 self.to_fmt(f)
904 }
905}
906
907impl ToTokens for OneSelect {
908 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
909 match self {
910 Self::Select {
911 distinctness,
912 columns,
913 from,
914 where_clause,
915 group_by,
916 having,
917 window_clause,
918 } => {
919 s.append(TK_SELECT, None)?;
920 if let Some(ref distinctness) = distinctness {
921 distinctness.to_tokens(s)?;
922 }
923 comma(columns, s)?;
924 if let Some(ref from) = from {
925 s.append(TK_FROM, None)?;
926 from.to_tokens(s)?;
927 }
928 if let Some(ref where_clause) = where_clause {
929 s.append(TK_WHERE, None)?;
930 where_clause.to_tokens(s)?;
931 }
932 if let Some(ref group_by) = group_by {
933 s.append(TK_GROUP, None)?;
934 s.append(TK_BY, None)?;
935 comma(group_by, s)?;
936 }
937 if let Some(ref having) = having {
938 s.append(TK_HAVING, None)?;
939 having.to_tokens(s)?;
940 }
941 if let Some(ref window_clause) = window_clause {
942 s.append(TK_WINDOW, None)?;
943 comma(window_clause, s)?;
944 }
945 Ok(())
946 }
947 Self::Values(values) => {
948 for (i, vals) in values.iter().enumerate() {
949 if i == 0 {
950 s.append(TK_VALUES, None)?;
951 } else {
952 s.append(TK_COMMA, None)?;
953 }
954 s.append(TK_LP, None)?;
955 comma(vals, s)?;
956 s.append(TK_RP, None)?;
957 }
958 Ok(())
959 }
960 }
961 }
962}
963
964impl ToTokens for FromClause {
965 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
966 self.select.as_ref().unwrap().to_tokens(s)?;
967 if let Some(ref joins) = self.joins {
968 for join in joins {
969 join.to_tokens(s)?;
970 }
971 }
972 Ok(())
973 }
974}
975
976impl ToTokens for Distinctness {
977 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
978 s.append(
979 match self {
980 Self::Distinct => TK_DISTINCT,
981 Self::All => TK_ALL,
982 },
983 None,
984 )
985 }
986}
987
988impl ToTokens for ResultColumn {
989 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
990 match self {
991 Self::Expr(expr, alias) => {
992 expr.to_tokens(s)?;
993 if let Some(alias) = alias {
994 alias.to_tokens(s)?;
995 }
996 Ok(())
997 }
998 Self::Star => s.append(TK_STAR, None),
999 Self::TableStar(tbl_name) => {
1000 tbl_name.to_tokens(s)?;
1001 s.append(TK_DOT, None)?;
1002 s.append(TK_STAR, None)
1003 }
1004 }
1005 }
1006}
1007
1008impl ToTokens for As {
1009 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1010 match self {
1011 Self::As(ref name) => {
1012 s.append(TK_AS, None)?;
1013 name.to_tokens(s)
1014 }
1015 Self::Elided(ref name) => name.to_tokens(s),
1016 }
1017 }
1018}
1019
1020impl ToTokens for JoinedSelectTable {
1021 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1022 self.operator.to_tokens(s)?;
1023 self.table.to_tokens(s)?;
1024 if let Some(ref constraint) = self.constraint {
1025 constraint.to_tokens(s)?;
1026 }
1027 Ok(())
1028 }
1029}
1030
1031impl ToTokens for SelectTable {
1032 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1033 match self {
1034 Self::Table(name, alias, indexed) => {
1035 name.to_tokens(s)?;
1036 if let Some(alias) = alias {
1037 alias.to_tokens(s)?;
1038 }
1039 if let Some(indexed) = indexed {
1040 indexed.to_tokens(s)?;
1041 }
1042 Ok(())
1043 }
1044 Self::TableCall(name, exprs, alias) => {
1045 name.to_tokens(s)?;
1046 s.append(TK_LP, None)?;
1047 if let Some(exprs) = exprs {
1048 comma(exprs, s)?;
1049 }
1050 s.append(TK_RP, None)?;
1051 if let Some(alias) = alias {
1052 alias.to_tokens(s)?;
1053 }
1054 Ok(())
1055 }
1056 Self::Select(select, alias) => {
1057 s.append(TK_LP, None)?;
1058 select.to_tokens(s)?;
1059 s.append(TK_RP, None)?;
1060 if let Some(alias) = alias {
1061 alias.to_tokens(s)?;
1062 }
1063 Ok(())
1064 }
1065 Self::Sub(from, alias) => {
1066 s.append(TK_LP, None)?;
1067 from.to_tokens(s)?;
1068 s.append(TK_RP, None)?;
1069 if let Some(alias) = alias {
1070 alias.to_tokens(s)?;
1071 }
1072 Ok(())
1073 }
1074 }
1075 }
1076}
1077
1078impl ToTokens for JoinOperator {
1079 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1080 match self {
1081 Self::Comma => s.append(TK_COMMA, None),
1082 Self::TypedJoin(join_type) => {
1083 if let Some(ref join_type) = join_type {
1084 join_type.to_tokens(s)?;
1085 }
1086 s.append(TK_JOIN, None)
1087 }
1088 }
1089 }
1090}
1091
1092impl ToTokens for JoinType {
1093 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1094 if self.contains(Self::NATURAL) {
1095 s.append(TK_JOIN_KW, Some("NATURAL"))?;
1096 }
1097 if self.contains(Self::INNER) {
1098 if self.contains(Self::CROSS) {
1099 s.append(TK_JOIN_KW, Some("CROSS"))?;
1100 }
1101 s.append(TK_JOIN_KW, Some("INNER"))?;
1102 } else {
1103 if self.contains(Self::LEFT) {
1104 if self.contains(Self::RIGHT) {
1105 s.append(TK_JOIN_KW, Some("FULL"))?;
1106 } else {
1107 s.append(TK_JOIN_KW, Some("LEFT"))?;
1108 }
1109 } else if self.contains(Self::RIGHT) {
1110 s.append(TK_JOIN_KW, Some("RIGHT"))?;
1111 }
1112 if self.contains(Self::OUTER) {
1113 s.append(TK_JOIN_KW, Some("OUTER"))?;
1114 }
1115 }
1116 Ok(())
1117 }
1118}
1119
1120impl ToTokens for JoinConstraint {
1121 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1122 match self {
1123 Self::On(expr) => {
1124 s.append(TK_ON, None)?;
1125 expr.to_tokens(s)
1126 }
1127 Self::Using(col_names) => {
1128 s.append(TK_USING, None)?;
1129 s.append(TK_LP, None)?;
1130 comma(col_names.deref(), s)?;
1131 s.append(TK_RP, None)
1132 }
1133 }
1134 }
1135}
1136
1137impl ToTokens for Id {
1138 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1139 double_quote(&self.0, s)
1140 }
1141}
1142
1143impl ToTokens for Name {
1144 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1145 double_quote(self.0.as_ref(), s)
1146 }
1147}
1148
1149impl Display for Name {
1150 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1151 self.to_fmt(f)
1152 }
1153}
1154
1155impl ToTokens for QualifiedName {
1156 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1157 if let Some(ref db_name) = self.db_name {
1158 db_name.to_tokens(s)?;
1159 s.append(TK_DOT, None)?;
1160 }
1161 self.name.to_tokens(s)?;
1162 if let Some(ref alias) = self.alias {
1163 s.append(TK_AS, None)?;
1164 alias.to_tokens(s)?;
1165 }
1166 Ok(())
1167 }
1168}
1169
1170impl Display for QualifiedName {
1171 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1172 self.to_fmt(f)
1173 }
1174}
1175
1176impl ToTokens for AlterTableBody {
1177 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1178 match self {
1179 Self::RenameTo(name) => {
1180 s.append(TK_RENAME, None)?;
1181 s.append(TK_TO, None)?;
1182 name.to_tokens(s)
1183 }
1184 Self::AddColumn(def) => {
1185 s.append(TK_ADD, None)?;
1186 s.append(TK_COLUMNKW, None)?;
1187 def.to_tokens(s)
1188 }
1189 Self::RenameColumn { old, new } => {
1190 s.append(TK_RENAME, None)?;
1191 old.to_tokens(s)?;
1192 s.append(TK_TO, None)?;
1193 new.to_tokens(s)
1194 }
1195 Self::DropColumn(name) => {
1196 s.append(TK_DROP, None)?;
1197 s.append(TK_COLUMNKW, None)?;
1198 name.to_tokens(s)
1199 }
1200 }
1201 }
1202}
1203
1204impl ToTokens for CreateTableBody {
1205 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1206 match self {
1207 Self::ColumnsAndConstraints {
1208 columns,
1209 constraints,
1210 flags,
1211 } => {
1212 s.append(TK_LP, None)?;
1213 comma(columns.values(), s)?;
1214 if let Some(constraints) = constraints {
1215 s.append(TK_COMMA, None)?;
1216 comma(constraints, s)?;
1217 }
1218 s.append(TK_RP, None)?;
1219 if flags.contains(TabFlags::WithoutRowid) {
1220 s.append(TK_WITHOUT, None)?;
1221 s.append(TK_ID, Some("ROWID"))?;
1222 }
1223 if flags.contains(TabFlags::Strict) {
1224 s.append(TK_ID, Some("STRICT"))?;
1225 }
1226 Ok(())
1227 }
1228 Self::AsSelect(select) => {
1229 s.append(TK_AS, None)?;
1230 select.to_tokens(s)
1231 }
1232 }
1233 }
1234}
1235
1236impl ToTokens for ColumnDefinition {
1237 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1238 self.col_name.to_tokens(s)?;
1239 if let Some(ref col_type) = self.col_type {
1240 col_type.to_tokens(s)?;
1241 }
1242 for constraint in &self.constraints {
1243 constraint.to_tokens(s)?;
1244 }
1245 Ok(())
1246 }
1247}
1248
1249impl ToTokens for NamedColumnConstraint {
1250 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1251 if let Some(ref name) = self.name {
1252 s.append(TK_CONSTRAINT, None)?;
1253 name.to_tokens(s)?;
1254 }
1255 self.constraint.to_tokens(s)
1256 }
1257}
1258
1259impl ToTokens for ColumnConstraint {
1260 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1261 match self {
1262 Self::PrimaryKey {
1263 order,
1264 conflict_clause,
1265 auto_increment,
1266 } => {
1267 s.append(TK_PRIMARY, None)?;
1268 s.append(TK_KEY, None)?;
1269 if let Some(order) = order {
1270 order.to_tokens(s)?;
1271 }
1272 if let Some(conflict_clause) = conflict_clause {
1273 s.append(TK_ON, None)?;
1274 s.append(TK_CONFLICT, None)?;
1275 conflict_clause.to_tokens(s)?;
1276 }
1277 if *auto_increment {
1278 s.append(TK_AUTOINCR, None)?;
1279 }
1280 Ok(())
1281 }
1282 Self::NotNull {
1283 nullable,
1284 conflict_clause,
1285 } => {
1286 if !nullable {
1287 s.append(TK_NOT, None)?;
1288 }
1289 s.append(TK_NULL, None)?;
1290 if let Some(conflict_clause) = conflict_clause {
1291 s.append(TK_ON, None)?;
1292 s.append(TK_CONFLICT, None)?;
1293 conflict_clause.to_tokens(s)?;
1294 }
1295 Ok(())
1296 }
1297 Self::Unique(conflict_clause) => {
1298 s.append(TK_UNIQUE, None)?;
1299 if let Some(conflict_clause) = conflict_clause {
1300 s.append(TK_ON, None)?;
1301 s.append(TK_CONFLICT, None)?;
1302 conflict_clause.to_tokens(s)?;
1303 }
1304 Ok(())
1305 }
1306 Self::Check(expr) => {
1307 s.append(TK_CHECK, None)?;
1308 s.append(TK_LP, None)?;
1309 expr.to_tokens(s)?;
1310 s.append(TK_RP, None)
1311 }
1312 Self::Default(expr) => {
1313 s.append(TK_DEFAULT, None)?;
1314 expr.to_tokens(s)
1315 }
1316 Self::Defer(deref_clause) => deref_clause.to_tokens(s),
1317 Self::Collate { collation_name } => {
1318 s.append(TK_COLLATE, None)?;
1319 collation_name.to_tokens(s)
1320 }
1321 Self::ForeignKey {
1322 clause,
1323 deref_clause,
1324 } => {
1325 s.append(TK_REFERENCES, None)?;
1326 clause.to_tokens(s)?;
1327 if let Some(deref_clause) = deref_clause {
1328 deref_clause.to_tokens(s)?;
1329 }
1330 Ok(())
1331 }
1332 Self::Generated { expr, typ } => {
1333 s.append(TK_AS, None)?;
1334 s.append(TK_LP, None)?;
1335 expr.to_tokens(s)?;
1336 s.append(TK_RP, None)?;
1337 if let Some(typ) = typ {
1338 typ.to_tokens(s)?;
1339 }
1340 Ok(())
1341 }
1342 }
1343 }
1344}
1345
1346impl ToTokens for NamedTableConstraint {
1347 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1348 if let Some(ref name) = self.name {
1349 s.append(TK_CONSTRAINT, None)?;
1350 name.to_tokens(s)?;
1351 }
1352 self.constraint.to_tokens(s)
1353 }
1354}
1355
1356impl ToTokens for TableConstraint {
1357 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1358 match self {
1359 Self::PrimaryKey {
1360 columns,
1361 auto_increment,
1362 conflict_clause,
1363 } => {
1364 s.append(TK_PRIMARY, None)?;
1365 s.append(TK_KEY, None)?;
1366 s.append(TK_LP, None)?;
1367 comma(columns, s)?;
1368 if *auto_increment {
1369 s.append(TK_AUTOINCR, None)?;
1370 }
1371 s.append(TK_RP, None)?;
1372 if let Some(conflict_clause) = conflict_clause {
1373 s.append(TK_ON, None)?;
1374 s.append(TK_CONFLICT, None)?;
1375 conflict_clause.to_tokens(s)?;
1376 }
1377 Ok(())
1378 }
1379 Self::Unique {
1380 columns,
1381 conflict_clause,
1382 } => {
1383 s.append(TK_UNIQUE, None)?;
1384 s.append(TK_LP, None)?;
1385 comma(columns, s)?;
1386 s.append(TK_RP, None)?;
1387 if let Some(conflict_clause) = conflict_clause {
1388 s.append(TK_ON, None)?;
1389 s.append(TK_CONFLICT, None)?;
1390 conflict_clause.to_tokens(s)?;
1391 }
1392 Ok(())
1393 }
1394 Self::Check(expr) => {
1395 s.append(TK_CHECK, None)?;
1396 s.append(TK_LP, None)?;
1397 expr.to_tokens(s)?;
1398 s.append(TK_RP, None)
1399 }
1400 Self::ForeignKey {
1401 columns,
1402 clause,
1403 deref_clause,
1404 } => {
1405 s.append(TK_FOREIGN, None)?;
1406 s.append(TK_KEY, None)?;
1407 s.append(TK_LP, None)?;
1408 comma(columns, s)?;
1409 s.append(TK_RP, None)?;
1410 s.append(TK_REFERENCES, None)?;
1411 clause.to_tokens(s)?;
1412 if let Some(deref_clause) = deref_clause {
1413 deref_clause.to_tokens(s)?;
1414 }
1415 Ok(())
1416 }
1417 }
1418 }
1419}
1420
1421impl ToTokens for SortOrder {
1422 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1423 s.append(
1424 match self {
1425 Self::Asc => TK_ASC,
1426 Self::Desc => TK_DESC,
1427 },
1428 None,
1429 )
1430 }
1431}
1432
1433impl ToTokens for NullsOrder {
1434 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1435 s.append(TK_NULLS, None)?;
1436 s.append(
1437 match self {
1438 Self::First => TK_FIRST,
1439 Self::Last => TK_LAST,
1440 },
1441 None,
1442 )
1443 }
1444}
1445
1446impl ToTokens for ForeignKeyClause {
1447 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1448 self.tbl_name.to_tokens(s)?;
1449 if let Some(ref columns) = self.columns {
1450 s.append(TK_LP, None)?;
1451 comma(columns, s)?;
1452 s.append(TK_RP, None)?;
1453 }
1454 for arg in &self.args {
1455 arg.to_tokens(s)?;
1456 }
1457 Ok(())
1458 }
1459}
1460
1461impl ToTokens for RefArg {
1462 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1463 match self {
1464 Self::OnDelete(ref action) => {
1465 s.append(TK_ON, None)?;
1466 s.append(TK_DELETE, None)?;
1467 action.to_tokens(s)
1468 }
1469 Self::OnInsert(ref action) => {
1470 s.append(TK_ON, None)?;
1471 s.append(TK_INSERT, None)?;
1472 action.to_tokens(s)
1473 }
1474 Self::OnUpdate(ref action) => {
1475 s.append(TK_ON, None)?;
1476 s.append(TK_UPDATE, None)?;
1477 action.to_tokens(s)
1478 }
1479 Self::Match(ref name) => {
1480 s.append(TK_MATCH, None)?;
1481 name.to_tokens(s)
1482 }
1483 }
1484 }
1485}
1486
1487impl ToTokens for RefAct {
1488 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1489 match self {
1490 Self::SetNull => {
1491 s.append(TK_SET, None)?;
1492 s.append(TK_NULL, None)
1493 }
1494 Self::SetDefault => {
1495 s.append(TK_SET, None)?;
1496 s.append(TK_DEFAULT, None)
1497 }
1498 Self::Cascade => s.append(TK_CASCADE, None),
1499 Self::Restrict => s.append(TK_RESTRICT, None),
1500 Self::NoAction => {
1501 s.append(TK_NO, None)?;
1502 s.append(TK_ACTION, None)
1503 }
1504 }
1505 }
1506}
1507
1508impl ToTokens for DeferSubclause {
1509 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1510 if !self.deferrable {
1511 s.append(TK_NOT, None)?;
1512 }
1513 s.append(TK_DEFERRABLE, None)?;
1514 if let Some(init_deferred) = self.init_deferred {
1515 init_deferred.to_tokens(s)?;
1516 }
1517 Ok(())
1518 }
1519}
1520
1521impl ToTokens for InitDeferredPred {
1522 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1523 s.append(TK_INITIALLY, None)?;
1524 s.append(
1525 match self {
1526 Self::InitiallyDeferred => TK_DEFERRED,
1527 Self::InitiallyImmediate => TK_IMMEDIATE,
1528 },
1529 None,
1530 )
1531 }
1532}
1533
1534impl ToTokens for IndexedColumn {
1535 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1536 self.col_name.to_tokens(s)?;
1537 if let Some(ref collation_name) = self.collation_name {
1538 s.append(TK_COLLATE, None)?;
1539 collation_name.to_tokens(s)?;
1540 }
1541 if let Some(order) = self.order {
1542 order.to_tokens(s)?;
1543 }
1544 Ok(())
1545 }
1546}
1547
1548impl ToTokens for Indexed {
1549 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1550 match self {
1551 Self::IndexedBy(ref name) => {
1552 s.append(TK_INDEXED, None)?;
1553 s.append(TK_BY, None)?;
1554 name.to_tokens(s)
1555 }
1556 Self::NotIndexed => {
1557 s.append(TK_NOT, None)?;
1558 s.append(TK_INDEXED, None)
1559 }
1560 }
1561 }
1562}
1563
1564impl ToTokens for SortedColumn {
1565 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1566 self.expr.to_tokens(s)?;
1567 if let Some(ref order) = self.order {
1568 order.to_tokens(s)?;
1569 }
1570 if let Some(ref nulls) = self.nulls {
1571 nulls.to_tokens(s)?;
1572 }
1573 Ok(())
1574 }
1575}
1576
1577impl ToTokens for Limit {
1578 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1579 s.append(TK_LIMIT, None)?;
1580 self.expr.to_tokens(s)?;
1581 if let Some(ref offset) = self.offset {
1582 s.append(TK_OFFSET, None)?;
1583 offset.to_tokens(s)?;
1584 }
1585 Ok(())
1586 }
1587}
1588
1589impl ToTokens for InsertBody {
1590 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1591 match self {
1592 Self::Select(select, upsert) => {
1593 select.to_tokens(s)?;
1594 if let Some(upsert) = upsert {
1595 upsert.to_tokens(s)?;
1596 }
1597 Ok(())
1598 }
1599 Self::DefaultValues => {
1600 s.append(TK_DEFAULT, None)?;
1601 s.append(TK_VALUES, None)
1602 }
1603 }
1604 }
1605}
1606
1607impl ToTokens for Set {
1608 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1609 if self.col_names.len() == 1 {
1610 comma(self.col_names.deref(), s)?;
1611 } else {
1612 s.append(TK_LP, None)?;
1613 comma(self.col_names.deref(), s)?;
1614 s.append(TK_RP, None)?;
1615 }
1616 s.append(TK_EQ, None)?;
1617 self.expr.to_tokens(s)
1618 }
1619}
1620
1621impl ToTokens for PragmaBody {
1622 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1623 match self {
1624 Self::Equals(value) => {
1625 s.append(TK_EQ, None)?;
1626 value.to_tokens(s)
1627 }
1628 Self::Call(value) => {
1629 s.append(TK_LP, None)?;
1630 value.to_tokens(s)?;
1631 s.append(TK_RP, None)
1632 }
1633 }
1634 }
1635}
1636
1637impl ToTokens for TriggerTime {
1638 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1639 match self {
1640 Self::Before => s.append(TK_BEFORE, None),
1641 Self::After => s.append(TK_AFTER, None),
1642 Self::InsteadOf => {
1643 s.append(TK_INSTEAD, None)?;
1644 s.append(TK_OF, None)
1645 }
1646 }
1647 }
1648}
1649
1650impl ToTokens for TriggerEvent {
1651 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1652 match self {
1653 Self::Delete => s.append(TK_DELETE, None),
1654 Self::Insert => s.append(TK_INSERT, None),
1655 Self::Update => s.append(TK_UPDATE, None),
1656 Self::UpdateOf(ref col_names) => {
1657 s.append(TK_UPDATE, None)?;
1658 s.append(TK_OF, None)?;
1659 comma(col_names.deref(), s)
1660 }
1661 }
1662 }
1663}
1664
1665impl ToTokens for TriggerCmd {
1666 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1667 match self {
1668 Self::Update {
1669 or_conflict,
1670 tbl_name,
1671 sets,
1672 from,
1673 where_clause,
1674 } => {
1675 s.append(TK_UPDATE, None)?;
1676 if let Some(or_conflict) = or_conflict {
1677 s.append(TK_OR, None)?;
1678 or_conflict.to_tokens(s)?;
1679 }
1680 tbl_name.to_tokens(s)?;
1681 s.append(TK_SET, None)?;
1682 comma(sets, s)?;
1683 if let Some(from) = from {
1684 s.append(TK_FROM, None)?;
1685 from.to_tokens(s)?;
1686 }
1687 if let Some(where_clause) = where_clause {
1688 s.append(TK_WHERE, None)?;
1689 where_clause.to_tokens(s)?;
1690 }
1691 Ok(())
1692 }
1693 Self::Insert {
1694 or_conflict,
1695 tbl_name,
1696 col_names,
1697 select,
1698 upsert,
1699 } => {
1700 if let Some(ResolveType::Replace) = or_conflict {
1701 s.append(TK_REPLACE, None)?;
1702 } else {
1703 s.append(TK_INSERT, None)?;
1704 if let Some(or_conflict) = or_conflict {
1705 s.append(TK_OR, None)?;
1706 or_conflict.to_tokens(s)?;
1707 }
1708 }
1709 s.append(TK_INTO, None)?;
1710 tbl_name.to_tokens(s)?;
1711 if let Some(col_names) = col_names {
1712 s.append(TK_LP, None)?;
1713 comma(col_names.deref(), s)?;
1714 s.append(TK_RP, None)?;
1715 }
1716 select.to_tokens(s)?;
1717 if let Some(upsert) = upsert {
1718 upsert.to_tokens(s)?;
1719 }
1720 Ok(())
1721 }
1722 Self::Delete {
1723 tbl_name,
1724 where_clause,
1725 } => {
1726 s.append(TK_DELETE, None)?;
1727 s.append(TK_FROM, None)?;
1728 tbl_name.to_tokens(s)?;
1729 if let Some(where_clause) = where_clause {
1730 s.append(TK_WHERE, None)?;
1731 where_clause.to_tokens(s)?;
1732 }
1733 Ok(())
1734 }
1735 Self::Select(select) => select.to_tokens(s),
1736 }
1737 }
1738}
1739
1740impl ToTokens for ResolveType {
1741 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1742 s.append(
1743 match self {
1744 Self::Rollback => TK_ROLLBACK,
1745 Self::Abort => TK_ABORT,
1746 Self::Fail => TK_FAIL,
1747 Self::Ignore => TK_IGNORE,
1748 Self::Replace => TK_REPLACE,
1749 },
1750 None,
1751 )
1752 }
1753}
1754
1755impl ToTokens for With {
1756 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1757 s.append(TK_WITH, None)?;
1758 if self.recursive {
1759 s.append(TK_RECURSIVE, None)?;
1760 }
1761 comma(&self.ctes, s)
1762 }
1763}
1764
1765impl ToTokens for CommonTableExpr {
1766 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1767 self.tbl_name.to_tokens(s)?;
1768 if let Some(ref columns) = self.columns {
1769 s.append(TK_LP, None)?;
1770 comma(columns, s)?;
1771 s.append(TK_RP, None)?;
1772 }
1773 s.append(TK_AS, None)?;
1774 match self.materialized {
1775 Materialized::Any => {}
1776 Materialized::Yes => {
1777 s.append(TK_MATERIALIZED, None)?;
1778 }
1779 Materialized::No => {
1780 s.append(TK_NOT, None)?;
1781 s.append(TK_MATERIALIZED, None)?;
1782 }
1783 };
1784 s.append(TK_LP, None)?;
1785 self.select.to_tokens(s)?;
1786 s.append(TK_RP, None)
1787 }
1788}
1789
1790impl ToTokens for Type {
1791 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1792 match self.size {
1793 None => s.append(TK_ID, Some(&self.name)),
1794 Some(ref size) => {
1795 s.append(TK_ID, Some(&self.name))?; s.append(TK_LP, None)?;
1797 size.to_tokens(s)?;
1798 s.append(TK_RP, None)
1799 }
1800 }
1801 }
1802}
1803
1804impl ToTokens for TypeSize {
1805 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1806 match self {
1807 Self::MaxSize(size) => size.to_tokens(s),
1808 Self::TypeSize(size1, size2) => {
1809 size1.to_tokens(s)?;
1810 s.append(TK_COMMA, None)?;
1811 size2.to_tokens(s)
1812 }
1813 }
1814 }
1815}
1816
1817impl ToTokens for TransactionType {
1818 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1819 s.append(
1820 match self {
1821 Self::Deferred => TK_DEFERRED,
1822 Self::Immediate => TK_IMMEDIATE,
1823 Self::Exclusive => TK_EXCLUSIVE,
1824 },
1825 None,
1826 )
1827 }
1828}
1829
1830impl ToTokens for Upsert {
1831 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1832 s.append(TK_ON, None)?;
1833 s.append(TK_CONFLICT, None)?;
1834 if let Some(ref index) = self.index {
1835 index.to_tokens(s)?;
1836 }
1837 self.do_clause.to_tokens(s)?;
1838 if let Some(ref next) = self.next {
1839 next.to_tokens(s)?;
1840 }
1841 Ok(())
1842 }
1843}
1844
1845impl ToTokens for UpsertIndex {
1846 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1847 s.append(TK_LP, None)?;
1848 comma(&self.targets, s)?;
1849 s.append(TK_RP, None)?;
1850 if let Some(ref where_clause) = self.where_clause {
1851 s.append(TK_WHERE, None)?;
1852 where_clause.to_tokens(s)?;
1853 }
1854 Ok(())
1855 }
1856}
1857
1858impl ToTokens for UpsertDo {
1859 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1860 match self {
1861 Self::Set { sets, where_clause } => {
1862 s.append(TK_DO, None)?;
1863 s.append(TK_UPDATE, None)?;
1864 s.append(TK_SET, None)?;
1865 comma(sets, s)?;
1866 if let Some(where_clause) = where_clause {
1867 s.append(TK_WHERE, None)?;
1868 where_clause.to_tokens(s)?;
1869 }
1870 Ok(())
1871 }
1872 Self::Nothing => {
1873 s.append(TK_DO, None)?;
1874 s.append(TK_NOTHING, None)
1875 }
1876 }
1877 }
1878}
1879
1880impl ToTokens for FunctionTail {
1881 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1882 if let Some(ref filter_clause) = self.filter_clause {
1883 s.append(TK_FILTER, None)?;
1884 s.append(TK_LP, None)?;
1885 s.append(TK_WHERE, None)?;
1886 filter_clause.to_tokens(s)?;
1887 s.append(TK_RP, None)?;
1888 }
1889 if let Some(ref over_clause) = self.over_clause {
1890 s.append(TK_OVER, None)?;
1891 over_clause.to_tokens(s)?;
1892 }
1893 Ok(())
1894 }
1895}
1896
1897impl ToTokens for Over {
1898 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1899 match self {
1900 Self::Window(ref window) => window.to_tokens(s),
1901 Self::Name(ref name) => name.to_tokens(s),
1902 }
1903 }
1904}
1905
1906impl ToTokens for WindowDef {
1907 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1908 self.name.to_tokens(s)?;
1909 s.append(TK_AS, None)?;
1910 self.window.to_tokens(s)
1911 }
1912}
1913
1914impl ToTokens for Window {
1915 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1916 s.append(TK_LP, None)?;
1917 if let Some(ref base) = self.base {
1918 base.to_tokens(s)?;
1919 }
1920 if let Some(ref partition_by) = self.partition_by {
1921 s.append(TK_PARTITION, None)?;
1922 s.append(TK_BY, None)?;
1923 comma(partition_by, s)?;
1924 }
1925 if let Some(ref order_by) = self.order_by {
1926 s.append(TK_ORDER, None)?;
1927 s.append(TK_BY, None)?;
1928 comma(order_by, s)?;
1929 }
1930 if let Some(ref frame_clause) = self.frame_clause {
1931 frame_clause.to_tokens(s)?;
1932 }
1933 s.append(TK_RP, None)
1934 }
1935}
1936
1937impl ToTokens for FrameClause {
1938 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1939 self.mode.to_tokens(s)?;
1940 if let Some(ref end) = self.end {
1941 s.append(TK_BETWEEN, None)?;
1942 self.start.to_tokens(s)?;
1943 s.append(TK_AND, None)?;
1944 end.to_tokens(s)?;
1945 } else {
1946 self.start.to_tokens(s)?;
1947 }
1948 if let Some(ref exclude) = self.exclude {
1949 s.append(TK_EXCLUDE, None)?;
1950 exclude.to_tokens(s)?;
1951 }
1952 Ok(())
1953 }
1954}
1955
1956impl ToTokens for FrameMode {
1957 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1958 s.append(
1959 match self {
1960 Self::Groups => TK_GROUPS,
1961 Self::Range => TK_RANGE,
1962 Self::Rows => TK_ROWS,
1963 },
1964 None,
1965 )
1966 }
1967}
1968
1969impl ToTokens for FrameBound {
1970 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1971 match self {
1972 Self::CurrentRow => {
1973 s.append(TK_CURRENT, None)?;
1974 s.append(TK_ROW, None)
1975 }
1976 Self::Following(value) => {
1977 value.to_tokens(s)?;
1978 s.append(TK_FOLLOWING, None)
1979 }
1980 Self::Preceding(value) => {
1981 value.to_tokens(s)?;
1982 s.append(TK_PRECEDING, None)
1983 }
1984 Self::UnboundedFollowing => {
1985 s.append(TK_UNBOUNDED, None)?;
1986 s.append(TK_FOLLOWING, None)
1987 }
1988 Self::UnboundedPreceding => {
1989 s.append(TK_UNBOUNDED, None)?;
1990 s.append(TK_PRECEDING, None)
1991 }
1992 }
1993 }
1994}
1995
1996impl ToTokens for FrameExclude {
1997 fn to_tokens<S: TokenStream>(&self, s: &mut S) -> Result<(), S::Error> {
1998 match self {
1999 Self::NoOthers => {
2000 s.append(TK_NO, None)?;
2001 s.append(TK_OTHERS, None)
2002 }
2003 Self::CurrentRow => {
2004 s.append(TK_CURRENT, None)?;
2005 s.append(TK_ROW, None)
2006 }
2007 Self::Group => s.append(TK_GROUP, None),
2008 Self::Ties => s.append(TK_TIES, None),
2009 }
2010 }
2011}
2012
2013fn comma<I, S: TokenStream>(items: I, s: &mut S) -> Result<(), S::Error>
2014where
2015 I: IntoIterator,
2016 I::Item: ToTokens,
2017{
2018 let iter = items.into_iter();
2019 for (i, item) in iter.enumerate() {
2020 if i != 0 {
2021 s.append(TK_COMMA, None)?;
2022 }
2023 item.to_tokens(s)?;
2024 }
2025 Ok(())
2026}
2027
2028fn double_quote<S: TokenStream>(name: &str, s: &mut S) -> Result<(), S::Error> {
2030 if name.is_empty() {
2031 return s.append(TK_ID, Some("\"\""));
2032 }
2033 if is_identifier(name) {
2034 return s.append(TK_ID, Some(name));
2041 }
2042 s.append(TK_ID, Some(name))
2051}