A work-in-progress SQL parser written in TypeScript
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* tslint:disable:no-unused-expression */
  2. import { expect } from "chai";
  3. import * as AST from "../src/ast";
  4. import { isError } from "../src/error";
  5. import Lexer from "../src/lexer";
  6. import Parser from "../src/parser";
  7. const parse = (source: string): AST.Statement[] => {
  8. const tokens = new Lexer(source).scan();
  9. if (isError(tokens)) {
  10. throw tokens.message;
  11. } else {
  12. const tree = new Parser(tokens).parse();
  13. if (isError(tree)) {
  14. throw tree.message;
  15. }
  16. return tree;
  17. }
  18. };
  19. describe("Parser", () => {
  20. it("should parse a number selection", () => {
  21. const tree = parse("select 5");
  22. expect(tree).to.deep.equal([
  23. new AST.SelectStatement({
  24. arguments: [new AST.Number(5)],
  25. }),
  26. ]);
  27. });
  28. it("should parse a multiple number selection", () => {
  29. const tree = parse("select 5, 6");
  30. expect(tree).to.deep.equal([
  31. new AST.SelectStatement({
  32. arguments: [new AST.Number(5), new AST.Number(6)],
  33. }),
  34. ]);
  35. });
  36. it("should parse a selection of identifiers", () => {
  37. const tree = parse("select a, b");
  38. expect(tree).to.deep.equal([
  39. new AST.SelectStatement({
  40. arguments: [new AST.Identifier("a"), new AST.Identifier("b")],
  41. }),
  42. ]);
  43. });
  44. it("should parse a selection of identifiers and numbers", () => {
  45. const tree = parse("select a, 5");
  46. expect(tree).to.deep.equal([
  47. new AST.SelectStatement({
  48. arguments: [new AST.Identifier("a"), new AST.Number(5)],
  49. }),
  50. ]);
  51. });
  52. it("should parse the from of a selection", () => {
  53. const tree = parse("select a from t");
  54. expect(tree).to.deep.equal([
  55. new AST.SelectStatement({
  56. arguments: [new AST.Identifier("a")],
  57. from: new AST.Identifier("t"),
  58. }),
  59. ]);
  60. });
  61. it("should parse aliases", () => {
  62. const tree = parse("select a as b");
  63. expect(tree).to.deep.equal([
  64. new AST.SelectStatement({
  65. arguments: [
  66. new AST.Alias(new AST.Identifier("a"), new AST.Identifier("b")),
  67. ],
  68. }),
  69. ]);
  70. });
  71. it("should parse aliases as from targets", () => {
  72. const tree = parse("select a from t as u");
  73. expect(tree).to.deep.equal([
  74. new AST.SelectStatement({
  75. arguments: [new AST.Identifier("a")],
  76. from: new AST.Alias(new AST.Identifier("t"), new AST.Identifier("u")),
  77. }),
  78. ]);
  79. });
  80. });