
It is now possible to specify what information the caller is interested in. With this the cost for collecting information during the query parsing that nobody is interested in can be avoided.
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
/*
|
|
* Copyright (c) 2016 MariaDB Corporation Ab
|
|
*
|
|
* Use of this software is governed by the Business Source License included
|
|
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
|
|
*
|
|
* Change Date: 2019-01-01
|
|
*
|
|
* On the date above, in accordance with the Business Source License, use
|
|
* of this software will be governed by version 2 or later of the General
|
|
* Public License.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <maxscale/buffer.h>
|
|
#include <maxscale/paths.h>
|
|
#include <maxscale/query_classifier.h>
|
|
|
|
#define MYSQL_HEADER_LEN 4
|
|
|
|
GWBUF* create_gwbuf(const char* s, size_t len)
|
|
{
|
|
size_t payload_len = len + 1;
|
|
size_t gwbuf_len = MYSQL_HEADER_LEN + payload_len;
|
|
|
|
GWBUF* gwbuf = gwbuf_alloc(gwbuf_len);
|
|
|
|
*((unsigned char*)((char*)GWBUF_DATA(gwbuf))) = payload_len;
|
|
*((unsigned char*)((char*)GWBUF_DATA(gwbuf) + 1)) = (payload_len >> 8);
|
|
*((unsigned char*)((char*)GWBUF_DATA(gwbuf) + 2)) = (payload_len >> 16);
|
|
*((unsigned char*)((char*)GWBUF_DATA(gwbuf) + 3)) = 0x00;
|
|
*((unsigned char*)((char*)GWBUF_DATA(gwbuf) + 4)) = 0x03;
|
|
memcpy((char*)GWBUF_DATA(gwbuf) + 5, s, len);
|
|
|
|
return gwbuf;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int rv = EXIT_FAILURE;
|
|
|
|
set_libdir(strdup("../qc_sqlite"));
|
|
|
|
if (qc_setup("qc_sqlite", NULL) && qc_process_init(QC_INIT_BOTH))
|
|
{
|
|
const char s[] = "SELECT @@global.max_allowed_packet";
|
|
|
|
GWBUF *stmt = create_gwbuf(s, sizeof(s)); // Include superfluous NULL.
|
|
|
|
// In 2.0.1 this crashed due to is_submitted_query() in qc_sqlite.c
|
|
// being of the opinion that the statement was not the one to be
|
|
// classified and hence an alien parse-tree being passed to sqlite3's
|
|
// code generator.
|
|
qc_parse(stmt, QC_COLLECT_ALL);
|
|
|
|
qc_process_end(QC_INIT_BOTH);
|
|
|
|
rv = EXIT_SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "error: Could not load query classifier.");
|
|
}
|
|
|
|
return rv;
|
|
}
|