Skip to content

Commit

Permalink
use binary trick for tolower, optimize switch, added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
davecramer committed Apr 15, 2016
1 parent 4ddb693 commit 2200a4d
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 41 deletions.
80 changes: 43 additions & 37 deletions pgjdbc/src/main/java/org/postgresql/core/Parser.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -145,13 +145,15 @@ public static List<NativeQuery> parseJdbcSql(String query, boolean standardConfo
} }
break; break;


case 'd':
case 'D': case 'D':
if (Parser.parseDeleteKeyword(aChars, i)) { if (Parser.parseDeleteKeyword(aChars, i)) {
current = DMLCommandType.DELETE; current = DMLCommandType.DELETE;
i += 5; i += 5;
} }
break; break;


case 'i':
case 'I': case 'I':
if (Parser.parseInsertKeyword(aChars, i)) { if (Parser.parseInsertKeyword(aChars, i)) {
if ( !isInsertPresent && (nativeQueries == null ? true : nativeQueries.size() == 0)) { if ( !isInsertPresent && (nativeQueries == null ? true : nativeQueries.size() == 0)) {
Expand All @@ -165,13 +167,15 @@ public static List<NativeQuery> parseJdbcSql(String query, boolean standardConfo
} }
break; break;


case 'm':
case 'M': case 'M':
if (Parser.parseMoveKeyword(aChars, i)) { if (Parser.parseMoveKeyword(aChars, i)) {
current = DMLCommandType.MOVE; current = DMLCommandType.MOVE;
i += 3; i += 3;
} }
break; break;


case 'r':
case 'R': case 'R':
// exclude re-write of insert statements with RETURNING keyword // exclude re-write of insert statements with RETURNING keyword
isReturningPresent = Parser.parseReturningKeyword(aChars, i); isReturningPresent = Parser.parseReturningKeyword(aChars, i);
Expand All @@ -180,13 +184,15 @@ public static List<NativeQuery> parseJdbcSql(String query, boolean standardConfo
} }
break; break;


case 'u':
case 'U': case 'U':
if (Parser.parseUpdateKeyword(aChars, i)) { if (Parser.parseUpdateKeyword(aChars, i)) {
current = DMLCommandType.UPDATE; current = DMLCommandType.UPDATE;
i += 5; i += 5;
} }
break; break;


case 'v':
case 'V': case 'V':
if (Parser.parseValuesKeyword(aChars, i)) { if (Parser.parseValuesKeyword(aChars, i)) {
afterValuesParens = 0 ; afterValuesParens = 0 ;
Expand Down Expand Up @@ -421,12 +427,12 @@ public static boolean parseDeleteKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset + 1]) == 'D' return Character.toUpperCase(query[offset + 1]) == 'd'
&& Character.toUpperCase(query[offset + 1]) == 'E' && Character.toUpperCase(query[offset + 1]) == 'e'
&& Character.toUpperCase(query[offset + 2]) == 'L' && Character.toUpperCase(query[offset + 2]) == 'l'
&& Character.toUpperCase(query[offset + 3]) == 'E' && Character.toUpperCase(query[offset + 3]) == 'e'
&& Character.toUpperCase(query[offset + 4]) == 'T' && Character.toUpperCase(query[offset + 4]) == 't'
&& Character.toUpperCase(query[offset + 5]) == 'E'; && Character.toUpperCase(query[offset + 5]) == 'e';
} }


/** /**
Expand All @@ -440,12 +446,12 @@ public static boolean parseInsertKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset]) == 'I' return (query[offset] | 32) == 'i'
&& Character.toUpperCase(query[offset + 1]) == 'N' && (query[offset + 1] | 32) == 'n'
&& Character.toUpperCase(query[offset + 2]) == 'S' && (query[offset + 2] | 32) == 's'
&& Character.toUpperCase(query[offset + 3]) == 'E' && (query[offset + 3] | 32) == 'e'
&& Character.toUpperCase(query[offset + 4]) == 'R' && (query[offset + 4] | 32) == 'r'
&& Character.toUpperCase(query[offset + 5]) == 'T'; && (query[offset + 5] | 32) == 't';
} }


/** /**
Expand All @@ -459,10 +465,10 @@ public static boolean parseMoveKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset + 1]) == 'M' return Character.toUpperCase(query[offset + 1]) == 'm'
&& Character.toUpperCase(query[offset + 1]) == 'O' && Character.toUpperCase(query[offset + 1]) == 'o'
&& Character.toUpperCase(query[offset + 2]) == 'V' && Character.toUpperCase(query[offset + 2]) == 'v'
&& Character.toUpperCase(query[offset + 3]) == 'E'; && Character.toUpperCase(query[offset + 3]) == 'e';
} }


/** /**
Expand All @@ -476,15 +482,15 @@ public static boolean parseReturningKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset]) == 'R' return (query[offset] | 32) == 'r'
&& Character.toUpperCase(query[offset + 1]) == 'E' && (query[offset + 1] | 32) == 'e'
&& Character.toUpperCase(query[offset + 2]) == 'T' && (query[offset + 2] | 32) == 't'
&& Character.toUpperCase(query[offset + 3]) == 'U' && (query[offset + 3] | 32) == 'u'
&& Character.toUpperCase(query[offset + 4]) == 'R' && (query[offset + 4] | 32) == 'r'
&& Character.toUpperCase(query[offset + 5]) == 'N' && (query[offset + 5] | 32) == 'n'
&& Character.toUpperCase(query[offset + 6]) == 'I' && (query[offset + 6] | 32) == 'i'
&& Character.toUpperCase(query[offset + 7]) == 'N' && (query[offset + 7] | 32) == 'n'
&& Character.toUpperCase(query[offset + 8]) == 'G'; && (query[offset + 8] | 32) == 'g';
} }


/** /**
Expand All @@ -498,12 +504,12 @@ public static boolean parseUpdateKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset + 1]) == 'U' return Character.toUpperCase(query[offset + 1]) == 'u'
&& Character.toUpperCase(query[offset + 1]) == 'P' && Character.toUpperCase(query[offset + 1]) == 'p'
&& Character.toUpperCase(query[offset + 2]) == 'D' && Character.toUpperCase(query[offset + 2]) == 'd'
&& Character.toUpperCase(query[offset + 3]) == 'A' && Character.toUpperCase(query[offset + 3]) == 'a'
&& Character.toUpperCase(query[offset + 4]) == 'T' && Character.toUpperCase(query[offset + 4]) == 't'
&& Character.toUpperCase(query[offset + 5]) == 'E'; && Character.toUpperCase(query[offset + 5]) == 'e';
} }


/** /**
Expand All @@ -517,12 +523,12 @@ public static boolean parseValuesKeyword(final char[] query, int offset) {
return false; return false;
} }


return Character.toUpperCase(query[offset]) == 'V' return (query[offset] | 32) == 'v'
&& Character.toUpperCase(query[offset + 1]) == 'A' && (query[offset + 1] | 32) == 'a'
&& Character.toUpperCase(query[offset + 2]) == 'L' && (query[offset + 2] | 32) == 'l'
&& Character.toUpperCase(query[offset + 3]) == 'U' && (query[offset + 3] | 32) == 'u'
&& Character.toUpperCase(query[offset + 4]) == 'E' && (query[offset + 4] | 32) == 'e'
&& Character.toUpperCase(query[offset + 5]) == 'S'; && (query[offset + 5] | 32) == 's';
} }


/** /**
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -84,24 +84,26 @@ public void testHasReturning() {


queries = Parser.parseJdbcSql("select 1 as returning", true, true, false, true, true); queries = Parser.parseJdbcSql("select 1 as returning", true, true, false, true, true);
query = queries.get(0); query = queries.get(0);
assertFalse("This is not an insert command", query.command.getType()== DMLCommandType.INSERT); assertFalse("This is not an insert command", query.command.getType() == DMLCommandType.INSERT);
assertTrue("Returning is OK here as it is not an insert command ", query.command.isReturningKeywordPresent()); assertTrue("Returning is OK here as it is not an insert command ", query.command.isReturningKeywordPresent());


} }

public void testIsInsert() { public void testIsInsert() {


List<NativeQuery> queries = Parser.parseJdbcSql("insert into foo (a,b,c) values (?,?,?) returning a", true, true, false, true, true); List<NativeQuery> queries = Parser.parseJdbcSql("insert into foo (a,b,c) values (?,?,?) returning a", true, true, false, true, true);
NativeQuery query = queries.get(0); NativeQuery query = queries.get(0);
assertTrue("This is an insert command", query.command.getType()== DMLCommandType.INSERT); assertTrue("This is an insert command", query.command.getType() == DMLCommandType.INSERT);


queries = Parser.parseJdbcSql("update foo set (a=?,b=?,c=?)", true, true, false, true, true); queries = Parser.parseJdbcSql("update foo set (a=?,b=?,c=?)", true, true, false, true, true);
query = queries.get(0); query = queries.get(0);
assertFalse("This is an insert command", query.command.getType()== DMLCommandType.INSERT); assertFalse("This is an insert command", query.command.getType() == DMLCommandType.INSERT);


queries = Parser.parseJdbcSql("select 1 as insert", true, true, false, true, true); queries = Parser.parseJdbcSql("select 1 as insert", true, true, false, true, true);
query = queries.get(0); query = queries.get(0);
assertFalse("This is not insert command", query.command.getType()== DMLCommandType.INSERT); assertFalse("This is not insert command", query.command.getType() == DMLCommandType.INSERT);
} }

public void testMultipleEmptyQueries() { public void testMultipleEmptyQueries() {
assertEquals("select 1;/*cut*/\n" + "select 2", assertEquals("select 1;/*cut*/\n" + "select 2",
reparse("select 1; ;\t;select 2", true, false, true)); reparse("select 1; ;\t;select 2", true, false, true));
Expand Down

0 comments on commit 2200a4d

Please sign in to comment.