123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- import {SQLishParser} from 'sentry/views/starfish/utils/sqlish/SQLishParser';
- describe('SQLishParser', function () {
- describe('SQLishParser()', () => {
- const parser = new SQLishParser();
- it.each([
- 'SELECT;',
- 'SELECT hello;',
- 'SELECT *;',
- 'WHERE age = 10;',
- 'WHERE age != 10;',
- 'total / time',
- 'sum(age)::numeric(0, 5)',
- 'WHERE age > 10 AND age < 20;',
- "WHERE$1 ILIKE ' % ' || 'text'",
- 'SELECT id, name;',
- 'columns AS `tags[column]`',
- 'SELECT * FROM #temp',
- '# Fetches',
- '\r\n',
- '✌🏻',
- 'ă',
- 'SELECT id, nam*',
- 'AND created >= :c1',
- 'LIMIT $2',
- 'created >= %s',
- 'created >= $1',
- '@@ to_tsquery',
- 'flags & %s)',
- 'flags | %s)',
- 'flags ^ %s)',
- 'flags ~ %s)',
- 'FROM temp{%s}',
- '+ %s as count',
- '- %s as count',
- "ILIKE '\\_')",
- ])('Parses %s', sql => {
- expect(() => {
- parser.parse(sql);
- }).not.toThrow();
- });
- });
- describe('SQLishParser.parse', () => {
- const parser = new SQLishParser();
- it('Distinguishes between real keywords and interpolated words', () => {
- expect(parser.parse('SELECT country')).toEqual([
- {
- type: 'Keyword',
- content: 'SELECT',
- },
- {
- type: 'Whitespace',
- content: ' ',
- },
- {
- type: 'GenericToken',
- content: 'country',
- },
- ]);
- expect(parser.parse('SELECT discount')).toEqual([
- {
- type: 'Keyword',
- content: 'SELECT',
- },
- {
- type: 'Whitespace',
- content: ' ',
- },
- {
- type: 'GenericToken',
- content: 'discount',
- },
- ]);
- });
- it('Detects collapsed columns', () => {
- expect(parser.parse('select ..')).toEqual([
- {
- type: 'Keyword',
- content: 'SELECT',
- },
- {
- type: 'Whitespace',
- content: ' ',
- },
- {
- type: 'CollapsedColumns',
- content: '..',
- },
- ]);
- });
- it('Detects whitespace between generic tokens and JOIN commands', () => {
- expect(parser.parse('sentry_users INNER JOIN sentry_messages')).toEqual([
- {
- type: 'GenericToken',
- content: 'sentry_users',
- },
- {type: 'Whitespace', content: ' '},
- {type: 'Keyword', content: 'INNER'},
- {type: 'Whitespace', content: ' '},
- {type: 'Keyword', content: 'JOIN'},
- {type: 'Whitespace', content: ' '},
- {
- type: 'GenericToken',
- content: 'sentry_messages',
- },
- ]);
- });
- });
- });
|