// statement <- COLUMN COMPARE VALUE // | COLUMN IS NULL private static void parseStatement(Lexer lexer) { // both possibilities start with COLUMN if (lexer.currentToken() != Lexer.TOKEN_COLUMN) { throw new IllegalArgumentException("syntax error, expected column name"); } lexer.advance(); // statement <- COLUMN COMPARE VALUE if (lexer.currentToken() == Lexer.TOKEN_COMPARE) { lexer.advance(); if (lexer.currentToken() != Lexer.TOKEN_VALUE) { throw new IllegalArgumentException("syntax error, expected quoted string"); } lexer.advance(); return; } // statement <- COLUMN IS NULL if (lexer.currentToken() == Lexer.TOKEN_IS) { lexer.advance(); if (lexer.currentToken() != Lexer.TOKEN_NULL) { throw new IllegalArgumentException("syntax error, expected NULL"); } lexer.advance(); return; } // didn't get anything good after COLUMN throw new IllegalArgumentException("syntax error after column name"); }
// expression <- ( expression ) | statement [AND_OR ( expression ) | // statement] * // | statement [AND_OR expression]* private static void parseExpression(Lexer lexer) { for (; ; ) { // ( expression ) if (lexer.currentToken() == Lexer.TOKEN_OPEN_PAREN) { lexer.advance(); parseExpression(lexer); if (lexer.currentToken() != Lexer.TOKEN_CLOSE_PAREN) { throw new IllegalArgumentException("syntax error, unmatched parenthese"); } lexer.advance(); } else { // statement parseStatement(lexer); } if (lexer.currentToken() != Lexer.TOKEN_AND_OR) { break; } lexer.advance(); } }
/** Checks whether this looks like a legitimate selection parameter */ public static void validateSelection(String selection, Set<String> allowedColumns) { try { if (selection == null || selection.length() == 0) { return; } Lexer lexer = new Lexer(selection, allowedColumns); parseExpression(lexer); if (lexer.currentToken() != Lexer.TOKEN_END) { throw new IllegalArgumentException("syntax error"); } } catch (RuntimeException ex) { if (Constants.LOGV) { Log.d(Constants.TAG, "invalid selection [" + selection + "] triggered " + ex); } else if (Config.LOGD) { Log.d(Constants.TAG, "invalid selection triggered " + ex); } throw ex; } }