118 Commits

Author SHA1 Message Date
Johan Wikman
cb15d90da9 MXS-1337 qc_sqlite info structure now a C++ class
The structure for storing statement information is now a C++ class.
At least initially it will not be turned into a full-fledged class
that would contain all functionality, but the code will be a mishmash
of C and C++.
2017-08-02 09:11:35 +03:00
Johan Wikman
e4f0598743 Convert qc_sqlite.c to C++
MXS-1307 requries some modifications in the query classifier and
making those changes is easier if STL collections are available.
2017-08-01 08:45:03 +03:00
Markus Mäkelä
3eb99139f5 Merge branch '2.1' into develop 2017-07-31 15:57:05 +03:00
Johan Wikman
4985bf9b6e MXS-1328 Mark regexp functions as builtin functions
Regexp functions were not listed among the builtin read-only
functions and consequently any SELECT using one of those was
routed to master.
2017-07-27 09:58:32 +03:00
Johan Wikman
d060320b36 MXS-1248: Further modifications for CTE
- Fields in CTEs are marked as being used in subselects.
- In qc_mysqlembedded all selects must be walked if CTE is present.
- In qc_sqlite unions need special handling.
2017-06-30 12:49:28 +02:00
Johan Wikman
84c5aa9934 MXS-1248: Report fields from CTE expressions
Now field and function information of CTE expressions are
collected.
2017-06-30 08:36:19 +02:00
Johan Wikman
6cd6ded3d8 Merge branch '2.1-oracle-compat' into develop-new-merge-oracle 2017-06-29 09:39:55 +02:00
Johan Wikman
a690b44919 MXS-1278: Sql mode must be specified explicitly
The default sql mode must now be provided explicitly when the query
classifier is setup. This is in preparation for "sql_mode" becoming
a global configuration parameter of MaxScale.
2017-06-28 21:36:08 +02:00
Johan Wikman
d9448e1550 MXS-1275: Function name mappings need to follow sql_mode 2017-06-28 21:36:08 +02:00
Johan Wikman
021fe09edb MXS-1275: qc_mysqlembedded, add support for qc_[get|set]_sql_mode 2017-06-28 21:36:08 +02:00
Johan Wikman
3084e95772 MXS-1275: Implement qc_[get|set]_sql_mode for qc_sqlite 2017-06-28 21:36:08 +02:00
Johan Wikman
9ae0526efb MXS-1275: Extend QC-API to allow setting of sql mode
Only API changes, implementation will follow.
2017-06-28 21:36:08 +02:00
Johan Wikman
94b0b082e4 MXS-1275: Make sql_mode a property of the current context
The sql mode is now a property of the info object used for storing
parsing related information. It is initialized with the value of the
sql mode qc_sqlite was initialized with.

This will be further changed so that the mode can be adjusted at
runtime so that the sql mode can be the property of a session. That
is, once set it will affect all future parsing for that session.
2017-06-28 21:33:04 +02:00
Johan Wikman
9431aded48 MXS-1196: Do not translate keywords that arrive first 2017-06-28 21:33:04 +02:00
Johan Wikman
e9ad1ea7bb MXS-1196: Recognize SQL%ROWCOUNT
Special handling is needed as otherwise "SQL%ROWCOUNT" does not
appear as a function but as the function "%" and the fields "SQL"
and "ROWCOUNT".
2017-06-28 21:33:04 +02:00
Johan Wikman
8b6fc49dc1 MXS-1196: Turn certain keywords into ids 2017-06-28 21:33:04 +02:00
Johan Wikman
77f05b49d0 MXS-1196: Handle top-level FOR loops
The content is ignored and the type is QUERY_TYPE_WRITE.
2017-06-28 21:33:04 +02:00
Johan Wikman
f9eef5ee3b MXS-1196: Classify SHOW as QUERY_TYPE_READ 2017-06-28 21:33:04 +02:00
Johan Wikman
49c9c60c63 MXS-1196: Parse arguments to CALL. 2017-06-28 21:33:04 +02:00
Johan Wikman
2a89a4de45 MXS-1196: Handle DECLARE
DECLARE can also begin an anonymous block in PL/SQL.
2017-06-28 21:33:04 +02:00
Johan Wikman
bf54a9bf9f MXS-1196: Handle anonymous blocks
In PL/SQL BEGIN starts a block (i.e. not a transaction). Whenever we
see that, we assume it is such a block, consume all input and set the
type to QUERY_TYPE_WRITE to ensure it goes to master.
2017-06-28 21:33:04 +02:00
Johan Wikman
573a2c6160 MXS-1196: Accept ".tbl.col" columns names 2017-06-28 21:33:04 +02:00
Johan Wikman
9ecd5da255 MXS-1196: Handle sequence related fields/functions
Both 10.3 and Oracle support sequence pseudo colums and corresponding
functions. Getting the next number in the sequence is in both cases
obtained using nextval/nextval() but the current number is in Oracle
obtained using currval/currval() and in 10.3 using lastval/lastval().

These fields/functions are now ignored, in the sense that they will
not show up in the field/function infos. However, they will cause the
type mask of the statement to contain the bit QUERY_TYPE_WRITE so that
statements accessing the sequence will always be sent to the master.
2017-06-28 21:33:04 +02:00
Johan Wikman
61b265467b MXS-1196: Add support for DROP SEQUENCE 2017-06-28 21:33:04 +02:00
Johan Wikman
6645a0581f MXS-1196: Add support for [SHOW] CREATE SEQUENCE 2017-06-28 21:33:04 +02:00
Johan Wikman
116e2cd974 MXS-1196: Handle Oracle EXECUTE and PREPARE statements
- EXECUTE IMMEDIATE ...
- PREPARE stmt FROM dynamic string
2017-06-28 21:33:04 +02:00
Johan Wikman
66e027febd MXS-1196: Accept EXECUTE ... USING <INTEGER> 2017-06-28 21:33:04 +02:00
Johan Wikman
471fa01f40 MXS-1196: A single '?' is not a user variable 2017-06-28 21:33:04 +02:00
Johan Wikman
a5637a311c MXS-1196: Recognize builtin Oracle functions 2017-06-28 21:33:04 +02:00
Johan Wikman
1d2ca5cde7 MXS-1196: Translate NVL into IFNULL 2017-06-28 21:33:04 +02:00
Johan Wikman
c46f16041e MXS-1196: Ignore the DUAL table
The embedded parser ignores the DUAL table so it's better if
qc_sqlite does that as well.
2017-06-28 21:33:04 +02:00
Johan Wikman
e6f8432e33 MXS-1196: Accept :'a' as placeholder variables
Oracle SQL accepts statements like

  PREPARE stmt FROM 'INSERT INTO t1 VALUES (:a,:b)';
  PREPARE stmt FROM 'INSERT INTO t1 VALUES (:"a",:"b")';

That is, the variable may be surrounded by quotes.
2017-06-28 21:33:04 +02:00
Johan Wikman
e80a378213 MXS-1196: Add 'sql_mode' argument to qc_sqlite 2017-06-28 21:33:04 +02:00
Johan Wikman
8c1d53192c MXS-1196: Handle REPLACE explicitly
Allowing REPLACE to implicitly decay into an identifier does not
work.
2017-06-28 21:33:04 +02:00
Johan Wikman
e7ef6c855f MXS-1196: Register if variables are used in function calls 2017-06-28 21:33:04 +02:00
Johan Wikman
593070b865 MXS-1196: Tentative commit 2017-06-28 21:33:04 +02:00
Johan Wikman
0de99dc686 MXS-1196: Use a syntactically correct stmt for init 2017-06-28 21:33:04 +02:00
Johan Wikman
422ea7f912 MXS-1196: In 10.3 a unary minus is not a function 2017-06-28 21:33:04 +02:00
Johan Wikman
0c51dd75fe MXS-1196: Pre 10.3 or 10.3 mode selected with option
The embedded parser of 10.3 parses things slightly differently than
how the embedded parser of earlier releases does. When comparing the
output of different query classifiers you need to be able to specify
with what qc_sqlite should be compatible with.
2017-06-28 21:33:04 +02:00
Johan Wikman
62a64cba31 MXS-1196: Report user var read when prepared statements 2017-06-28 21:33:04 +02:00
Johan Wikman
da0900786a MXS-1196: Accept UNIQUE as synonym for DISTINCT 2017-06-28 21:33:04 +02:00
Johan Wikman
298d5642f6 MXS-1196: Accept top-level variable assignments
In Oracle you can write

    set autocommit=1
or
    autocommit:=1
2017-06-28 21:33:04 +02:00
Johan Wikman
43ab0f036e MXS-1196: Do not parse EXPLAIN statements
EXPLAIN statements are no longer parsed completely as doing so makes
it hard to modify the grammar for the needs or Oracle SQL.

Consequently, for an EXPLAIN statement you now bascially only get the
type and the operation (the newly added QUERY_OP_EXPLAIN and QUERY_OP_SHOW).
The other information is not interesting and is related to
information_schema and similar tables.
2017-06-28 21:33:04 +02:00
Markus Mäkelä
65df87d801 Update query operation enum and add EXECUTE
Changed the query operation enum to contain implicit enum values instead
of providing. The operation was never used as a bitmask so it is pointless
to declare them as such.

Added the EXECUTE type to the enum and used it in qc_sqlite and
qc_mysqlembedded.
2017-06-22 10:40:18 +03:00
Johan Wikman
43895b6f28 MXS-1249: Add json functions
The json function are treated as read-only when the server version
is >= 10.2.3.
https://mariadb.com/kb/en/mariadb/json-functions/
2017-06-21 13:28:59 +03:00
Johan Wikman
dcfe118457 MXS-1249: Qc, the server version is passed as a single integer
To be compatible with how the version is managed elsewhere.
2017-06-21 13:28:59 +03:00
Johan Wikman
1034cc51be MXS-1249: Qc, allow setting the server version
In the case of qc_sqlite, the server version may affect how statements
are parsed.
2017-06-21 13:28:59 +03:00
Johan Wikman
f546a17e77 Update change date of 2.2 2017-06-01 10:24:20 +03:00
Markus Mäkelä
7bd05d4581 Merge branch '2.1' into develop 2017-03-22 15:20:21 +02:00
Johan Wikman
d70dad260a Implement collecting behaviour in qc_sqlite
By default, only the essentials - the type and the operation - of
a statement will be collected and only if fields, tables, functions
and databases are explicitly asked for, will they be collected.
However, a statement will be parsed at most twice; if parsing is
needed a second time then all information will be collected.

If it is known that some particular information is needed, then
qc_parse() can be called explicitly to ensure it is collected
at first parsing.
2017-03-22 11:09:36 +02:00