SQLishParser.spec.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import {SQLishParser} from 'sentry/views/starfish/utils/sqlish/SQLishParser';
  2. describe('SQLishParser', function () {
  3. describe('SQLishParser()', () => {
  4. const parser = new SQLishParser();
  5. it.each([
  6. 'SELECT;',
  7. 'SELECT hello;',
  8. 'SELECT *;', // Wildcards
  9. 'WHERE age = 10;', // Equality
  10. 'WHERE age != 10;', // Inequality
  11. 'total / time', // Division
  12. 'sum(age)::numeric(0, 5)', // Type casting
  13. 'WHERE age > 10 AND age < 20;', // Comparison
  14. "WHERE$1 ILIKE ' % ' || 'text'", // Conditionals
  15. 'SELECT id, name;', // Column lists
  16. 'columns AS `tags[column]`', // ClickHouse backtics
  17. 'SELECT id, nam*', // Truncation
  18. 'AND created >= :c1', // PHP-Style I
  19. 'LIMIT $2', // PHP-style II
  20. 'created >= %s', // Python-style
  21. 'created >= $1', // Rails-style
  22. ])('Parses %s', sql => {
  23. expect(() => {
  24. parser.parse(sql);
  25. }).not.toThrow();
  26. });
  27. });
  28. describe('SQLishParser.parse', () => {
  29. const parser = new SQLishParser();
  30. it('Detects collapsed columns', () => {
  31. expect(parser.parse('select ..')).toEqual([
  32. {
  33. type: 'Keyword',
  34. content: 'select',
  35. },
  36. {
  37. type: 'Whitespace',
  38. content: ' ',
  39. },
  40. {
  41. type: 'CollapsedColumns',
  42. content: '..',
  43. },
  44. ]);
  45. });
  46. it('Detects whitespace between generic tokens and JOIN commands', () => {
  47. expect(parser.parse('sentry_users INNER JOIN sentry_messages')).toEqual([
  48. {
  49. type: 'GenericToken',
  50. content: 'sentry_users',
  51. },
  52. {type: 'Whitespace', content: ' '},
  53. {type: 'Keyword', content: 'INNER'},
  54. {type: 'Whitespace', content: ' '},
  55. {type: 'Keyword', content: 'JOIN'},
  56. {type: 'Whitespace', content: ' '},
  57. {
  58. type: 'GenericToken',
  59. content: 'sentry_messages',
  60. },
  61. ]);
  62. });
  63. });
  64. });