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