| 1 | #include <Parsers/ASTLiteral.h> | 
|---|
| 2 | #include <Parsers/ASTIdentifier.h> | 
|---|
| 3 | #include <Parsers/ASTShowTablesQuery.h> | 
|---|
| 4 |  | 
|---|
| 5 | #include <Parsers/CommonParsers.h> | 
|---|
| 6 | #include <Parsers/ParserShowTablesQuery.h> | 
|---|
| 7 | #include <Parsers/ExpressionElementParsers.h> | 
|---|
| 8 | #include <Parsers/ExpressionListParsers.h> | 
|---|
| 9 |  | 
|---|
| 10 | #include <Common/typeid_cast.h> | 
|---|
| 11 |  | 
|---|
| 12 |  | 
|---|
| 13 | namespace DB | 
|---|
| 14 | { | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 | bool ParserShowTablesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) | 
|---|
| 18 | { | 
|---|
| 19 | ParserKeyword s_show( "SHOW"); | 
|---|
| 20 | ParserKeyword s_temporary( "TEMPORARY"); | 
|---|
| 21 | ParserKeyword s_tables( "TABLES"); | 
|---|
| 22 | ParserKeyword s_databases( "DATABASES"); | 
|---|
| 23 | ParserKeyword s_dictionaries( "DICTIONARIES"); | 
|---|
| 24 | ParserKeyword s_from( "FROM"); | 
|---|
| 25 | ParserKeyword s_not( "NOT"); | 
|---|
| 26 | ParserKeyword s_like( "LIKE"); | 
|---|
| 27 | ParserKeyword s_limit( "LIMIT"); | 
|---|
| 28 | ParserStringLiteral like_p; | 
|---|
| 29 | ParserIdentifier name_p; | 
|---|
| 30 | ParserExpressionWithOptionalAlias limit_p(false); | 
|---|
| 31 |  | 
|---|
| 32 | ASTPtr like; | 
|---|
| 33 | ASTPtr database; | 
|---|
| 34 |  | 
|---|
| 35 | auto query = std::make_shared<ASTShowTablesQuery>(); | 
|---|
| 36 |  | 
|---|
| 37 | if (!s_show.ignore(pos, expected)) | 
|---|
| 38 | return false; | 
|---|
| 39 |  | 
|---|
| 40 | if (s_databases.ignore(pos)) | 
|---|
| 41 | { | 
|---|
| 42 | query->databases = true; | 
|---|
| 43 | } | 
|---|
| 44 | else | 
|---|
| 45 | { | 
|---|
| 46 | if (s_temporary.ignore(pos)) | 
|---|
| 47 | query->temporary = true; | 
|---|
| 48 |  | 
|---|
| 49 | if (!s_tables.ignore(pos, expected)) | 
|---|
| 50 | { | 
|---|
| 51 | if (s_dictionaries.ignore(pos, expected)) | 
|---|
| 52 | query->dictionaries = true; | 
|---|
| 53 | else | 
|---|
| 54 | return false; | 
|---|
| 55 | } | 
|---|
| 56 |  | 
|---|
| 57 | if (s_from.ignore(pos, expected)) | 
|---|
| 58 | { | 
|---|
| 59 | if (!name_p.parse(pos, database, expected)) | 
|---|
| 60 | return false; | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|
| 63 | if (s_not.ignore(pos, expected)) | 
|---|
| 64 | query->not_like = true; | 
|---|
| 65 |  | 
|---|
| 66 | if (s_like.ignore(pos, expected)) | 
|---|
| 67 | { | 
|---|
| 68 | if (!like_p.parse(pos, like, expected)) | 
|---|
| 69 | return false; | 
|---|
| 70 | } | 
|---|
| 71 | else if (query->not_like) | 
|---|
| 72 | return false; | 
|---|
| 73 |  | 
|---|
| 74 | if (s_limit.ignore(pos, expected)) | 
|---|
| 75 | { | 
|---|
| 76 | if (!limit_p.parse(pos, query->limit_length, expected)) | 
|---|
| 77 | return false; | 
|---|
| 78 | } | 
|---|
| 79 | } | 
|---|
| 80 |  | 
|---|
| 81 | tryGetIdentifierNameInto(database, query->from); | 
|---|
| 82 | if (like) | 
|---|
| 83 | query->like = safeGet<const String &>(like->as<ASTLiteral &>().value); | 
|---|
| 84 |  | 
|---|
| 85 | node = query; | 
|---|
| 86 |  | 
|---|
| 87 | return true; | 
|---|
| 88 | } | 
|---|
| 89 |  | 
|---|
| 90 |  | 
|---|
| 91 | } | 
|---|
| 92 |  | 
|---|