filter testing harness
This commit is contained in:
77
server/modules/filter/test/Makefile
Executable file
77
server/modules/filter/test/Makefile
Executable file
@ -0,0 +1,77 @@
|
||||
# This file is distributed as part of MaxScale form SkySQL. It is free
|
||||
# software: you can redistribute it and/or modify it under the terms of the
|
||||
# GNU General Public License as published by the Free Software Foundation,
|
||||
# version 2.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Copyright SkySQL Ab 2014
|
||||
|
||||
include ../../../../build_gateway.inc
|
||||
|
||||
LOGPATH := $(ROOT_PATH)/log_manager
|
||||
UTILSPATH := $(ROOT_PATH)/utils
|
||||
QCLASSPATH := $(ROOT_PATH)/query_classifier
|
||||
COREPATH := $(ROOT_PATH)/server/core
|
||||
|
||||
CC=cc
|
||||
CFLAGS=-c -fPIC -I/usr/include -I../../include -I../../../include \
|
||||
-I$(LOGPATH) -I$(UTILSPATH) -I./ -I$(ROOT_PATH)/server/inih -I$(QCLASSPATH) \
|
||||
$(MYSQL_HEADERS) -Wall -g
|
||||
|
||||
include ../../../../makefile.inc
|
||||
|
||||
LDFLAGS=-rdynamic -L$(LOGPATH) -L$(UTILSPATH) -L$(EMBEDDED_LIB) \
|
||||
-Wl,-rpath,$(DEST)/lib \
|
||||
-Wl,-rpath,$(LOGPATH) -Wl,-rpath,$(UTILSPATH) \
|
||||
-Wl,-rpath,$(EMBEDDED_LIB)
|
||||
|
||||
SRCS=harness.c
|
||||
OBJ=$(SRCS:.c=.o)
|
||||
COREOBJ=$(COREPATH)/load_utils.o $(COREPATH)/dcb.o $(COREPATH)/utils.o \
|
||||
$(COREPATH)/gw_utils.o $(COREPATH)/buffer.o $(COREPATH)/poll.o \
|
||||
$(COREPATH)/spinlock.o $(COREPATH)/gwbitmask.o $(COREPATH)/session.o \
|
||||
$(COREPATH)/atomic.o $(COREPATH)/hashtable.o $(COREPATH)/filter.o $(COREPATH)/modutil.o $(ROOT_PATH)/server/inih/ini.o \
|
||||
$(COREPATH)/hint.o
|
||||
LIBS= $(UTILSPATH)/skygw_utils.o -lssl -pthread -llog_manager -lmysqld -ldl -lcrypto
|
||||
MODULES := $(wildcard ../*.so)
|
||||
|
||||
all: build
|
||||
|
||||
build:$(OBJ)
|
||||
$(CC) $(OBJ) $(COREOBJ) $(LDFLAGS) $(LIBS) -o harness
|
||||
$(MAKE) -C ../
|
||||
cp ../*.so ./
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -f *.so
|
||||
-rm -f harness
|
||||
cleantests:clean
|
||||
-rm *.output
|
||||
buildtests:build
|
||||
|
||||
testall:
|
||||
$(MAKE) cleantests
|
||||
$(MAKE) buildtests
|
||||
$(MAKE) runtests
|
||||
|
||||
runtests:
|
||||
@echo ""
|
||||
@echo "-------------------------------"
|
||||
@echo "$(shell date)"
|
||||
@echo "Test Filter harness"
|
||||
@echo "-------------------------------"
|
||||
@echo "Testing hints... "
|
||||
@./hint_tests.sh
|
||||
@echo ""
|
20
server/modules/filter/test/README
Normal file
20
server/modules/filter/test/README
Normal file
@ -0,0 +1,20 @@
|
||||
Filter Test Harness
|
||||
|
||||
For a more detailed description of the filter harness, either generate the documentation or read the harness.h file.
|
||||
|
||||
Running the program without arguments enters the interactive mode. Type 'help' for a list of all commands.
|
||||
|
||||
The default values for threads and sessions are stored in the 'harness.cnf' file
|
||||
|
||||
Mandatory parameters for the command line mode are -c and -i.
|
||||
|
||||
Parameters for the command line:
|
||||
|
||||
-h Display this information
|
||||
-c Path to the MaxScale configuration file to parse for filters
|
||||
-i Name of the input file for buffers
|
||||
-o Name of the output file for results
|
||||
-q Suppress printing to stdout
|
||||
-t Number of threads
|
||||
-s Number of sessions
|
||||
-d Routing delay
|
2303
server/modules/filter/test/doxygen.conf
Normal file
2303
server/modules/filter/test/doxygen.conf
Normal file
File diff suppressed because it is too large
Load Diff
1551
server/modules/filter/test/harness.c
Executable file
1551
server/modules/filter/test/harness.c
Executable file
File diff suppressed because it is too large
Load Diff
2
server/modules/filter/test/harness.cnf
Normal file
2
server/modules/filter/test/harness.cnf
Normal file
@ -0,0 +1,2 @@
|
||||
threads=2
|
||||
sessions=4
|
173
server/modules/filter/test/harness.h
Normal file
173
server/modules/filter/test/harness.h
Normal file
@ -0,0 +1,173 @@
|
||||
#ifndef _FILTER_HARNESS_H
|
||||
#define _FILTER_HARNESS_H
|
||||
/*
|
||||
* This file is distributed as part of the SkySQL Gateway. It is free
|
||||
* software: you can redistribute it and/or modify it under the terms of the
|
||||
* GNU General Public License as published by the Free Software Foundation,
|
||||
* version 2.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright SkySQL Ab 2013
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file harness.h Test harness for independent testing of filters
|
||||
*
|
||||
* A test harness that feeds a GWBUF to a chain of filters and prints the results
|
||||
* either into a file or to the standard output.
|
||||
*
|
||||
* The contents of the GWBUF and the filter parameters are either manually set through
|
||||
* the command line or read from a file.
|
||||
*
|
||||
* @verbatim
|
||||
* Revision History
|
||||
*
|
||||
* Date Who Description
|
||||
* 01/07/14 Markus Makela Initial implementation
|
||||
*
|
||||
* @endverbatim
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <filter.h>
|
||||
#include <buffer.h>
|
||||
#include <modules.h>
|
||||
#include <modutil.h>
|
||||
#include <skygw_utils.h>
|
||||
#include <log_manager.h>
|
||||
#include <atomic.h>
|
||||
#include <ini.h>
|
||||
#include <hint.h>
|
||||
|
||||
/**
|
||||
* A single name-value pair and a link to the next item in the
|
||||
* configuration.
|
||||
*/
|
||||
typedef struct CONFIG_ITEM_T
|
||||
{
|
||||
char* name;
|
||||
char* value;
|
||||
struct CONFIG_ITEM_T* next;
|
||||
}CONFIG_ITEM;
|
||||
|
||||
/**
|
||||
*A simplified version of a MaxScale configuration context used to load filters
|
||||
* and their options.
|
||||
*/
|
||||
typedef struct CONFIG_T
|
||||
{
|
||||
char* section;
|
||||
CONFIG_ITEM* item;
|
||||
struct CONFIG_T* next;
|
||||
|
||||
}CONFIG;
|
||||
|
||||
/**
|
||||
*A structure that holds all the necessary information to emulate a working
|
||||
* filter environment.
|
||||
*/
|
||||
struct FILTERCHAIN_T
|
||||
{
|
||||
FILTER* filter; /**An instance of a particular filter*/
|
||||
FILTER_OBJECT* instance; /**Dynamically loaded module*/
|
||||
SESSION** session; /**A list of sessions*/
|
||||
DOWNSTREAM** down; /** A list of next filters downstreams*/
|
||||
UPSTREAM** up; /** A list of next filters upstreams*/
|
||||
char* name; /**Module name*/
|
||||
struct FILTERCHAIN_T* next;
|
||||
};
|
||||
|
||||
typedef struct FILTERCHAIN_T FILTERCHAIN;
|
||||
|
||||
/**
|
||||
* A container for all the filters, query buffers and user specified parameters
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
int running;
|
||||
int verbose; /**Whether to print to stdout*/
|
||||
int infile; /**A file where the queries are loaded from*/
|
||||
char* infile_name;
|
||||
int outfile; /**A file where the output of the filters is logged*/
|
||||
char* outfile_name;
|
||||
FILTERCHAIN* head; /**The head of the filter chain*/
|
||||
FILTERCHAIN* tail; /**The tail of the filter chain*/
|
||||
GWBUF** buffer; /**Buffers that are fed to the filter chain*/
|
||||
int buffer_count;
|
||||
int session_count;
|
||||
DOWNSTREAM dummyrouter; /**Dummy downstream router for data extraction*/
|
||||
UPSTREAM dummyclient; /**Dummy downstream router for data extraction*/
|
||||
CONFIG* conf; /**Configurations loaded from a file*/
|
||||
pthread_mutex_t work_mtx; /**Mutex for buffer routing*/
|
||||
int buff_ind; /**Index of first unrouted buffer*/
|
||||
int sess_ind;/**Index of first unused session*/
|
||||
int last_ind; /**Index of last used session*/
|
||||
pthread_t* thrpool;
|
||||
int thrcount; /**Number of active threads*/
|
||||
int rt_delay; /**Delay each thread waits after routing a query, in milliseconds*/
|
||||
}HARNESS_INSTANCE;
|
||||
|
||||
static HARNESS_INSTANCE instance;
|
||||
|
||||
/**
|
||||
*A list of available actions.
|
||||
*/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
UNDEFINED,
|
||||
RUNFILTERS,
|
||||
LOAD_FILTER,
|
||||
DELETE_FILTER,
|
||||
LOAD_CONFIG,
|
||||
SET_INFILE,
|
||||
SET_OUTFILE,
|
||||
THR_COUNT,
|
||||
SESS_COUNT,
|
||||
OK,
|
||||
QUIT
|
||||
} operation_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PACKET_OK,
|
||||
PACKET_ERROR,
|
||||
PACKET_RESULT_SET
|
||||
} packet_t;
|
||||
|
||||
typedef packet_t PACKET;
|
||||
|
||||
void free_buffers();
|
||||
void free_filters();
|
||||
operation_t user_input(char*);
|
||||
void print_help();
|
||||
void print_status();
|
||||
int open_file(char* str, unsigned int write);
|
||||
FILTER_PARAMETER** read_params(int*);
|
||||
int routeQuery(void* instance, void* session, GWBUF* queue);
|
||||
void manual_query();
|
||||
int load_query();
|
||||
static int handler(void* user, const char* section, const char* name,const char* value);
|
||||
CONFIG* process_config(CONFIG*);
|
||||
FILTERCHAIN* load_filter_module(char* str);
|
||||
int load_filter(FILTERCHAIN*, CONFIG*);
|
||||
int load_config(char* fname);
|
||||
void route_buffers();
|
||||
void work_buffer(void*);
|
||||
GWBUF* gen_packet(PACKET);
|
||||
int process_opts(int argc, char** argv);
|
||||
|
||||
#endif
|
165
server/modules/filter/test/hint_testing.cnf
Executable file
165
server/modules/filter/test/hint_testing.cnf
Executable file
@ -0,0 +1,165 @@
|
||||
#
|
||||
# Example MaxScale.cnf configuration file
|
||||
#
|
||||
#
|
||||
#
|
||||
# Number of server threads
|
||||
# Valid options are:
|
||||
# threads=<number of threads>
|
||||
|
||||
[maxscale]
|
||||
threads=1
|
||||
|
||||
# Define a monitor that can be used to determine the state and role of
|
||||
# the servers.
|
||||
#
|
||||
# Valid options are:
|
||||
#
|
||||
# module=<name of module to load>
|
||||
# servers=<server name>,<server name>,...
|
||||
# user =<user name - must have slave replication and
|
||||
# slave client privileges>
|
||||
# passwd=<password of the above user, plain text currently>
|
||||
# monitor_interval=<sampling interval in milliseconds,
|
||||
# default value is 10000>
|
||||
|
||||
[MySQL Monitor]
|
||||
type=monitor
|
||||
module=mysqlmon
|
||||
servers=server1,server2,server3,server4
|
||||
user=maxuser
|
||||
passwd=maxpwd
|
||||
|
||||
# A series of service definition
|
||||
#
|
||||
# Valid options are:
|
||||
#
|
||||
# router=<name of router module>
|
||||
# servers=<server name>,<server name>,...
|
||||
# user=<User to fetch password inforamtion with>
|
||||
# passwd=<Password of the user, plain text currently>
|
||||
# enable_root_user=<0 or 1, default is 0>
|
||||
# version_string=<specific string for server handshake,
|
||||
# default is the MariaDB embedded library version>
|
||||
#
|
||||
# Valid router modules currently are:
|
||||
# readwritesplit, readconnroute and debugcli
|
||||
|
||||
|
||||
[RW Split Router]
|
||||
type=service
|
||||
router=readwritesplit
|
||||
servers=server1,server2,server3,server4
|
||||
max_slave_connections=90%
|
||||
user=maxuser
|
||||
passwd=maxpwd
|
||||
#filters=MQ
|
||||
|
||||
[RW Split Hint Router]
|
||||
type=service
|
||||
router=readwritesplit
|
||||
servers=server1,server2,server3,server4
|
||||
max_slave_connections=90%
|
||||
user=maxuser
|
||||
passwd=maxpwd
|
||||
filters=Hint
|
||||
|
||||
|
||||
[Read Connection Router]
|
||||
type=service
|
||||
router=readconnroute
|
||||
router_options=master
|
||||
servers=server1
|
||||
user=maxuser
|
||||
passwd=maxpwd
|
||||
|
||||
|
||||
[HTTPD Router]
|
||||
type=service
|
||||
router=testroute
|
||||
servers=server1,server2,server3
|
||||
|
||||
[Debug Interface]
|
||||
type=service
|
||||
router=debugcli
|
||||
|
||||
|
||||
[Hint]
|
||||
type=filter
|
||||
module=hintfilter
|
||||
|
||||
#[MQ]
|
||||
#type=filter
|
||||
#module=mqfilter
|
||||
#exchange=x1
|
||||
#key=k1
|
||||
#queue=q1
|
||||
#port=5673
|
||||
|
||||
# Listener definitions for the services
|
||||
#
|
||||
# Valid options are:
|
||||
#
|
||||
# service=<name of service defined elsewhere>
|
||||
# protocol=<name of protocol module with which to listen>
|
||||
# port=<Listening port>
|
||||
# address=<Address to bind to>
|
||||
# socket=<Listening socket>
|
||||
|
||||
[RW Split Listener]
|
||||
type=listener
|
||||
service=RW Split Router
|
||||
protocol=MySQLClient
|
||||
port=4006
|
||||
|
||||
[RW Split Hint Listener]
|
||||
type=listener
|
||||
service=RW Split Hint Router
|
||||
protocol=MySQLClient
|
||||
port=4009
|
||||
|
||||
[Read Connection Listener]
|
||||
type=listener
|
||||
service=Read Connection Router
|
||||
protocol=MySQLClient
|
||||
port=4008
|
||||
#socket=/tmp/readconn.sock
|
||||
|
||||
[Debug Listener]
|
||||
type=listener
|
||||
service=Debug Interface
|
||||
protocol=telnetd
|
||||
port=4442
|
||||
#address=127.0.0.1
|
||||
|
||||
[HTTPD Listener]
|
||||
type=listener
|
||||
service=HTTPD Router
|
||||
protocol=HTTPD
|
||||
port=6444
|
||||
|
||||
# Definition of the servers
|
||||
|
||||
[server1]
|
||||
type=server
|
||||
address=127.0.0.1
|
||||
port=3000
|
||||
protocol=MySQLBackend
|
||||
|
||||
[server2]
|
||||
type=server
|
||||
address=127.0.0.1
|
||||
port=3001
|
||||
protocol=MySQLBackend
|
||||
|
||||
[server3]
|
||||
type=server
|
||||
address=127.0.0.1
|
||||
port=3002
|
||||
protocol=MySQLBackend
|
||||
|
||||
[server4]
|
||||
type=server
|
||||
address=127.0.0.1
|
||||
port=3003
|
||||
protocol=MySQLBackend
|
48
server/modules/filter/test/hint_testing.expected
Executable file
48
server/modules/filter/test/hint_testing.expected
Executable file
@ -0,0 +1,48 @@
|
||||
select @@server_id; -- maxscale begin route to master
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; -- maxscale named1 prepare route to master
|
||||
select @@server_id; -- maxscale named1 begin|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id;|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id; -- maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; -- maxscale shorthand1 begin route to server server2|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id; -- maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; # maxscale begin route to master
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id; # maxscale named2 prepare route to master
|
||||
select @@server_id; # maxscale named2 begin|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id;|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id; # maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id; # maxscale shorthand2 begin route to server server2|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id; # maxscale route to server server3|HINT_ROUTE_TO_NAMED_SERVER|server3
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|server2
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id/* maxscale begin route to master */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale route to server server3 */;|HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale end */;
|
||||
select @@server_id/* maxscale named3 prepare route to master */;|HINT_ROUTE_TO_MASTER
|
||||
select @@server_id/* maxscale named3 begin */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale route to server server3 */;|HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale end */;
|
||||
select @@server_id/* maxscale shorthand3 begin route to server server2 */; |HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id/* maxscale route to server server3 */;|HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id;|HINT_ROUTE_TO_NAMED_SERVER|*/;
|
||||
select @@server_id/* maxscale end */;
|
48
server/modules/filter/test/hint_testing.input
Normal file
48
server/modules/filter/test/hint_testing.input
Normal file
@ -0,0 +1,48 @@
|
||||
select @@server_id; -- maxscale begin route to master
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; -- maxscale named1 prepare route to master
|
||||
select @@server_id; -- maxscale named1 begin
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; -- maxscale shorthand1 begin route to server server2
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; -- maxscale end
|
||||
select @@server_id; # maxscale begin route to master
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id; # maxscale named2 prepare route to master
|
||||
select @@server_id; # maxscale named2 begin
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id; # maxscale shorthand2 begin route to server server2
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale route to server server3
|
||||
select @@server_id;
|
||||
select @@server_id; # maxscale end
|
||||
select @@server_id/* maxscale begin route to master */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale route to server server3 */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale end */;
|
||||
select @@server_id/* maxscale named3 prepare route to master */;
|
||||
select @@server_id/* maxscale named3 begin */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale route to server server3 */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale end */;
|
||||
select @@server_id/* maxscale shorthand3 begin route to server server2 */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale route to server server3 */;
|
||||
select @@server_id;
|
||||
select @@server_id/* maxscale end */;
|
9
server/modules/filter/test/hint_tests.sh
Executable file
9
server/modules/filter/test/hint_tests.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#! /bin/bash
|
||||
./harness -q -i hint_testing.input -c hint_testing.cnf -o hint_testing.output -t 1 -s 1 -q &>/dev/null
|
||||
diff hint_testing.expected hint_testing.output &>/dev/null
|
||||
if [[ "$?" == "0" ]]
|
||||
then
|
||||
echo "PASSED"
|
||||
else
|
||||
echo "FAILED"
|
||||
fi
|
1
server/modules/filter/test/querysmall
Normal file
1
server/modules/filter/test/querysmall
Normal file
@ -0,0 +1 @@
|
||||
SELECT * FROM test_table;
|
Reference in New Issue
Block a user