Hi,
OrientDB 2.0 was released just a few week ago, but we are already working hard to the next release.
You know that two of the oldest pieces of code inside OrientDB core are the SQL parser and the query executor, and you know that both have some flaws.
After releasing 2.0 we started a new development path to have:
- strict query language definition
- strict query validation with better syntax error messages
- full support to prepared statements and parameters (also where now it fails)
- new command/query executor structure (stateless, less memory consuming)
- better query execution plans and index management
- some additional operators (suspense here ;-) you have to wait for 3.0)
This path will end with 3.0, but in 2.1 we are releasing the first step, that is the new query parser.
The new parser is based on well known JavaCC. It processes all the SQL statements and produces a tree structure that will be the future query executor. So the final query execution structure will be the following:
1. Get the SQL statement
2. look for a cached executor
3. if it exists goto 7
4. parse the statement
5. optimize the statement based on schema and indexes
6. put it in the statement cache
7. run the (new) executor with input parameters
8. send the (streamed) result to the client
At this step, the SQL parser is ready, but the query executor is too complex to be refactored in time for 2.1, so we decided to go with a hybrid solution, to let you have a taste of the new features.
Here's how the query execution changes in 2.1:
1. Get the SQL statement
2. pre-parse the statement with the new SQL parser <- this gives you strict SQL syntax and much better syntax errors
3. replace named/unnamed parameters <- this solves problems in parameter passing to subqueries, functions etc.
4. rewrite the query based on the parsed structure <- this solves problems with white spaces and so on... I know it's dirty stuff, but the old executor is too coupled with the old parser to be completely split in such a short time
5. use the old parser to parse the rewritten query and generate the old executor <- a very small fraction of old parsing problems will remain for now, sorry...
6. run the (old) executor
** AN EYE TO THE PAST **
Advantages in the short term are obvious, but you can also experience small problems in the migration, eg.
- old parser lets you write things like
SELECT FROM FOO ORDER BY A ASC ORDER BY A DESC GROUP BY A ORDER BY A DESC
or even
SELECT FROM FOO ORDER BY A ASC, , , , A ASC
with the new parser you will not be allowed to do this, now every clause has its own position in the statement (see docs)
- old parser supports some old (deprecated) operators like traverse() function (different from TRAVERSE statement)
eg. SELECT FROM Profile WHERE any() traverse(0,3) (city = 'Rome')
This syntax will not be supported anymore, so with the new parser you will get a syntax error
- in old parser IN and CONTAINS operators validation is somehow lazy, eg. you can write
SELECT FROM FOO WHERE a IN 'bar'
but it's supposed to be incorrect, because 'bar' is a string, not a collection, so the new parser will throw an exception
** AND HOW ABOUT BACKWARD COMPATIBILITY...? **
To allow a smooth transition, we decided to apply the following policy to 2.1:
- old databases will continue to work with the old parser
- databases created with 2.1 will have the new parser enabled by default
- for backward compatibility, you will be able to enable/disable the new parser (for now) setting the "strictSql" parameter to the db (ALTER DATABASE docs will be updated shortly)
In next releases we will probably drop a lot of old code, so I suggest you to get used to the new strict SQL validation ;-)
** HOW CAN I TRY IT NOW? **
All this is now in a GIT branch named "javacc_parser", but today we will merge it in "develop" branch, so you will be able to try it in next 2.1-SNAPSHOT releases.
FOR NOW the new parser is enabled only on SELECT and TRAVERSE statements, in next days we will also cover UPDATE, INSERT, DELETE, CREATE EDGE, CREATE VERTEX and so on...
If you have some time, please try it out and give us your feedback, WE NEED YOUR HELP TO MAKE IT PERFECT!!!
Thanks
Luigi
--
Luigi Dell'Aquila
Orient Technologies LTD