SystemOrganization addCategory: #'PetitSQL-Core'! SystemOrganization addCategory: #'PetitSQL-Tests'! !Character methodsFor: '*petitsql-converting' stamp: 'lr 8/18/2010 20:14'! sqlToken ^ self asParser caseInsensitive token trim! ! PPCompositeParser subclass: #PPSqlGrammar instanceVariableNames: 'command number condition createCommand deleteCommand insertCommand selectCommand updateCommand expression sequence whereClause limitClause operator comparison logic identifier string' classVariableNames: '' poolDictionaries: '' category: 'PetitSQL-Core'! !PPSqlGrammar commentStamp: 'lr 6/30/2009 11:29' prior: 0! command ::= define_data | modify_data | system_command define_data ::= create_command modify_data ::= select_command | insert_command | update_command | delete_command system_command ::= | describe_command | open_command | close_command | save_command | list_command | clear_command | dump_command | help_command create_command ::= ( "CREATE" | "create" ) (character_set)+ "("((character_set)+,)+")" ("WITH"|"with") ("VALUES"|"values") "("((character_set)+,)+")" select_command ::= ("SELECT"|"select") ("*"|(character_set)+) ("FROM"|"from") (character_set)+ [("WHERE"|"where") condition] [("LIMIT"|"limit") (numeric)+] insert_command ::= ( "INSERT" | "insert" ) ("INTO"|"into") (character_set)+ "("((character_set)+,)+")" ("VALUES"|"values") "("((character_set)+,)+")" update_command ::= ("UPDATE"|update") (character_set)+ ("SET"|"set") (character_set)+ "=" (character_set)+ [("WHERE"|"where") condition] delete_command ::= ("DELETE"|"delete") ("FROM"|"from") (character_set)+ [("WHERE"|"where") condition] open_command ::= ("OPEN"|"open") (character_set)+ close_command ::= ("CLOSE"|"close") (character_set)+ save_command ::= ("SAVE"|"save") | ("SAVE"|"save") ("AS"|"as") (character_set)+ list ::= ("LS"|"ls"|"DIR"|"dir") | ("LS"|"ls"|"DIR"|"dir") (character_set)+ clear ::= ("CLEAR"|"clear"|"CLS"|"cls") dump ::= ("DUMP"|"dump") help ::= ("help"|"HELP"|"/HELP"|"/help"|"/?") condition ::= (character_set)+ (["<"|">"|"!!"]=|["<"|">"|"="]) (character_set)+ [(("AND"|"and")|("OR"|"or")) (character_set)+ (["<"|">"|"!!"]=|["<"|">"|"="]) (character_set)+] character_set ::= "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m" "n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z" |"A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M" |"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z" |"0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" |"-"|"_"|"("|")"|"."|","|"""|"/"|"\"|"@"|"#"|"~"|"|" |"*"|"&"|"%"|"$"|"¦Ç¬£"|"!!"|"+"|"?"|">"|"<"|"=" numeric ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 19:40'! command ^ createCommand / deleteCommand / insertCommand / selectCommand / updateCommand! ! !PPSqlGrammar methodsFor: 'operators' stamp: 'lr 8/18/2010 19:42'! comparison ^ expression , operator , expression! ! !PPSqlGrammar methodsFor: 'operators' stamp: 'lr 8/18/2010 19:42'! condition ^ comparison separatedBy: logic! ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 20:17'! createCommand ^ 'CREATE' sqlToken , expression , $( sqlToken , sequence , $) sqlToken , 'WITH' sqlToken , 'VALUES' sqlToken , $( sqlToken , sequence , $) sqlToken! ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 19:41'! deleteCommand ^ 'DELETE' sqlToken , 'FROM' sqlToken , expression , whereClause optional! ! !PPSqlGrammar methodsFor: 'operators' stamp: 'lr 8/18/2010 19:43'! expression ^ identifier / number / string! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 19:48'! identifier ^ #letter asParser plus token trim! ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 20:18'! insertCommand ^ 'INSERT' sqlToken , 'INTO' sqlToken , expression , $( sqlToken , sequence , $) sqlToken , 'VALUES' sqlToken , $( sqlToken , sequence , $) sqlToken! ! !PPSqlGrammar methodsFor: 'clauses' stamp: 'lr 8/18/2010 19:39'! limitClause ^ 'LIMIT' sqlToken , number! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 19:43'! logic ^ 'AND' sqlToken / 'OR' sqlToken! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 19:48'! number ^ #digit asParser plus token trim! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 19:45'! operator ^ ('<=' asParser / '>=' asParser / '!!=' asParser / $< asParser / $> asParser / $= asParser) token trim! ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 20:18'! selectCommand ^ 'SELECT' sqlToken , ($* sqlToken / sequence) , 'FROM' sqlToken , sequence , whereClause optional , limitClause optional! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 20:19'! sequence ^ expression separatedBy: $, sqlToken! ! !PPSqlGrammar methodsFor: 'accessing' stamp: 'lr 8/18/2010 19:39'! start ^ command! ! !PPSqlGrammar methodsFor: 'tokens' stamp: 'lr 8/18/2010 19:48'! string ^ ($" asParser , $" asParser negate star , $" asParser) token trim! ! !PPSqlGrammar methodsFor: 'commands' stamp: 'lr 8/18/2010 20:18'! updateCommand ^ 'UPDATE' sqlToken , expression , 'SET' sqlToken , expression , $= sqlToken , expression , whereClause optional! ! !PPSqlGrammar methodsFor: 'clauses' stamp: 'lr 8/18/2010 19:40'! whereClause ^ 'WHERE' sqlToken , condition! ! PPCompositeParserTest subclass: #PPSqlGrammarTests instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitSQL-Tests'! !PPSqlGrammarTests methodsFor: 'accessing' stamp: 'lr 8/18/2010 19:39'! parserClass ^ PPSqlGrammar! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 8/18/2010 20:08'! testCreate1 self parse: 'CREATE foo (a) WITH VALUES (1)'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:17'! testCreate2 self parse: 'CREATE foo (a, b) WITH VALUES (1, 2)'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testCreate3 self parse: 'CREATE foo (a, b, c) WITH VALUES (1, 2, "foo bar")'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:16'! testDelete1 self parse: 'DELETE FROM foo'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testDelete2 self parse: 'DELETE FROM "ZorkCommander" WHERE a = 43'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testInsert1 self parse: 'INSERT INTO foo (a) VALUES ("This is a longer string")'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testInsert2 self parse: 'INSERT INTO foo ("a", b) VALUES (1, "2")'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:10'! testInsert3 self parse: 'INSERT INTO foo (a, b, c) VALUES (1, 2, 3)'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:00'! testSelect1 self parse: 'SELECT * FROM foo'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:01'! testSelect2 self parse: 'SELECT a, b, c FROM foo'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testSelect3 self parse: 'SELECT * FROM foo WHERE a !!= b'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:01'! testSelect4 self parse: 'SELECT * FROM foo LIMIT 13'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:24'! testSelect5 self parse: 'SELECT * FROM foo WHERE a > 12 LIMIT 13'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:38'! testUpdate1 self parse: 'UPDATE foo SET a = 12'! ! !PPSqlGrammarTests methodsFor: 'testing' stamp: 'lr 6/30/2009 12:25'! testUpdate2 self parse: 'UPDATE foo SET a = 12 WHERE b >= 13'! ! !String methodsFor: '*petitsql-converting' stamp: 'lr 8/18/2010 19:36'! sqlToken ^ self asParser caseInsensitive token trim! !