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