mirror of
https://github.com/MariaDB/server.git
synced 2026-04-17 13:55:32 +02:00
Merge branch '10.0' into 10.1
This commit is contained in:
commit
ec6042bda0
193 changed files with 43237 additions and 3008 deletions
|
|
@ -479,6 +479,12 @@ ENDIF()
|
|||
|
||||
INCLUDE(CPack)
|
||||
|
||||
IF(WIN32 AND SIGNCODE)
|
||||
# Configure post-install script for authenticode signing
|
||||
CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/cmake/sign.cmake.in sign.cmake @ONLY)
|
||||
INSTALL(SCRIPT ${PROJECT_BINARY_DIR}/sign.cmake)
|
||||
ENDIF()
|
||||
|
||||
IF(NON_DISTRIBUTABLE_WARNING)
|
||||
MESSAGE(WARNING "
|
||||
You have linked MariaDB with GPLv3 libraries! You may not distribute the resulting binary. If you do, you will put yourself into a legal problem with Free Software Foundation.")
|
||||
|
|
|
|||
0
cmake/CMakeLis.txt
Normal file
0
cmake/CMakeLis.txt
Normal file
|
|
@ -47,6 +47,21 @@ MACRO (RUN_BISON input_yy output_cc output_h)
|
|||
ENDIF()
|
||||
ENDIF()
|
||||
IF(BISON_USABLE)
|
||||
# Workaround for VS regenerating output even
|
||||
# when outputs are up-to-date. At least, fix output timestamp
|
||||
# after build so that files that depend on generated header are
|
||||
# not rebuilt.
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
FIND_PROGRAM(TOUCH_EXECUTABLE touch DOC "Path to touch executable"
|
||||
PATHS "C:/Program Files/Git/usr/bin"
|
||||
"C:/Program Files (x86)/Git/usr/bin")
|
||||
IF(TOUCH_EXECUTABLE)
|
||||
SET(VS_FIX_OUTPUT_TIMESTAMPS
|
||||
COMMAND ${TOUCH_EXECUTABLE} -r ${input_yy} ${output_cc}
|
||||
COMMAND ${TOUCH_EXECUTABLE} -r ${input_yy} ${output_h})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${output_cc}
|
||||
${output_h}
|
||||
|
|
@ -54,8 +69,9 @@ MACRO (RUN_BISON input_yy output_cc output_h)
|
|||
--output=${output_cc}
|
||||
--defines=${output_h}
|
||||
${input_yy}
|
||||
DEPENDS ${input_yy}
|
||||
)
|
||||
${VS_FIX_OUTPUT_TIMESTAMPS}
|
||||
DEPENDS ${input_yy}
|
||||
)
|
||||
ELSE()
|
||||
# Bison is missing or not usable, e.g too old
|
||||
IF(EXISTS ${output_cc} AND EXISTS ${output_h})
|
||||
|
|
|
|||
|
|
@ -32,17 +32,8 @@ FUNCTION (INSTALL_DEBUG_SYMBOLS)
|
|||
ENDIF()
|
||||
SET(targets ${ARG_DEFAULT_ARGS})
|
||||
FOREACH(target ${targets})
|
||||
GET_TARGET_PROPERTY(type ${target} TYPE)
|
||||
GET_TARGET_PROPERTY(location ${target} LOCATION)
|
||||
STRING(REPLACE ".exe" ".pdb" pdb_location ${location})
|
||||
STRING(REPLACE ".dll" ".pdb" pdb_location ${pdb_location})
|
||||
STRING(REPLACE ".lib" ".pdb" pdb_location ${pdb_location})
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
STRING(REPLACE
|
||||
"${CMAKE_CFG_INTDIR}" "\${CMAKE_INSTALL_CONFIG_NAME}"
|
||||
pdb_location ${pdb_location})
|
||||
ENDIF()
|
||||
|
||||
GET_TARGET_PROPERTY(target_type ${target} TYPE)
|
||||
|
||||
set(comp "")
|
||||
|
||||
IF(target MATCHES "mysqld" OR type MATCHES "MODULE")
|
||||
|
|
@ -61,11 +52,9 @@ FUNCTION (INSTALL_DEBUG_SYMBOLS)
|
|||
IF(NOT comp)
|
||||
SET(comp Debuginfo_archive_only) # not in MSI
|
||||
ENDIF()
|
||||
IF(type MATCHES "STATIC")
|
||||
# PDB for static libraries might be unsupported http://public.kitware.com/Bug/view.php?id=14600
|
||||
SET(opt OPTIONAL)
|
||||
ENDIF()
|
||||
INSTALL(FILES ${pdb_location} DESTINATION ${ARG_INSTALL_LOCATION} COMPONENT ${comp} ${opt})
|
||||
IF(NOT target_type MATCHES "STATIC")
|
||||
INSTALL(FILES $<TARGET_PDB_FILE:${target}> DESTINATION ${ARG_INSTALL_LOCATION} COMPONENT ${comp})
|
||||
ENDIF()
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
ENDFUNCTION()
|
||||
|
|
@ -211,37 +200,22 @@ IF(WIN32)
|
|||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
MACRO(SIGN_TARGET)
|
||||
MYSQL_PARSE_ARGUMENTS(ARG "COMPONENT" "" ${ARGN})
|
||||
SET(target ${ARG_DEFAULT_ARGS})
|
||||
IF(ARG_COMPONENT)
|
||||
SET(comp COMPONENT ${ARG_COMPONENT})
|
||||
ELSE()
|
||||
SET(comp)
|
||||
ENDIF()
|
||||
GET_TARGET_PROPERTY(target_type ${target} TYPE)
|
||||
IF(target_type AND NOT target_type MATCHES "STATIC")
|
||||
GET_TARGET_PROPERTY(target_location ${target} LOCATION)
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
STRING(REPLACE "${CMAKE_CFG_INTDIR}" "\${CMAKE_INSTALL_CONFIG_NAME}"
|
||||
target_location ${target_location})
|
||||
ENDIF()
|
||||
INSTALL(CODE
|
||||
"EXECUTE_PROCESS(COMMAND
|
||||
\"${SIGNTOOL_EXECUTABLE}\" verify /pa /q \"${target_location}\"
|
||||
RESULT_VARIABLE ERR)
|
||||
IF(NOT \${ERR} EQUAL 0)
|
||||
EXECUTE_PROCESS(COMMAND
|
||||
\"${SIGNTOOL_EXECUTABLE}\" sign ${SIGNTOOL_PARAMETERS} \"${target_location}\"
|
||||
RESULT_VARIABLE ERR)
|
||||
ENDIF()
|
||||
IF(NOT \${ERR} EQUAL 0)
|
||||
MESSAGE(FATAL_ERROR \"Error signing '${target_location}'\")
|
||||
ENDIF()
|
||||
" ${comp})
|
||||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
||||
FUNCTION(SIGN_TARGET target)
|
||||
IF(NOT SIGNCODE)
|
||||
RETURN()
|
||||
ENDIF()
|
||||
GET_TARGET_PROPERTY(target_type ${target} TYPE)
|
||||
IF((NOT target_type) OR (target_type MATCHES "STATIC"))
|
||||
RETURN()
|
||||
ENDIF()
|
||||
# Mark executable for signing by creating empty *.signme file
|
||||
# The actual signing happens in preinstall step
|
||||
# (which traverses
|
||||
ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "$<TARGET_FILE:${target}>.signme"
|
||||
)
|
||||
ENDFUNCTION()
|
||||
|
||||
# Installs targets, also installs pdbs on Windows.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -222,7 +222,8 @@ MACRO(MYSQL_ADD_PLUGIN)
|
|||
# Install dynamic library
|
||||
IF(ARG_COMPONENT)
|
||||
IF(CPACK_COMPONENTS_ALL AND
|
||||
NOT CPACK_COMPONENTS_ALL MATCHES ${ARG_COMPONENT})
|
||||
NOT CPACK_COMPONENTS_ALL MATCHES ${ARG_COMPONENT}
|
||||
AND INSTALL_SYSCONF2DIR)
|
||||
IF (ARG_STORAGE_ENGINE)
|
||||
SET(ver " = %{version}-%{release}")
|
||||
ELSE()
|
||||
|
|
|
|||
18
cmake/sign.cmake.in
Normal file
18
cmake/sign.cmake.in
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
FILE(GLOB_RECURSE files "@CMAKE_BINARY_DIR@/*.signme")
|
||||
MESSAGE(STATUS "signing files")
|
||||
FOREACH(f ${files})
|
||||
STRING(REPLACE ".signme" "" exe_location "${f}")
|
||||
|
||||
string (REPLACE ";" " " params "@SIGNTOOL_PARAMETERS@")
|
||||
#MESSAGE("@SIGNTOOL_EXECUTABLE@" sign ${params} "${exe_location}")
|
||||
|
||||
EXECUTE_PROCESS(COMMAND
|
||||
"@SIGNTOOL_EXECUTABLE@" sign @SIGNTOOL_PARAMETERS@ "${exe_location}"
|
||||
RESULT_VARIABLE ERR)
|
||||
IF(NOT ${ERR} EQUAL 0)
|
||||
MESSAGE( "Error ${ERR} signing ${exe_location}")
|
||||
ELSE()
|
||||
FILE(REMOVE ${f})
|
||||
ENDIF()
|
||||
|
||||
ENDFOREACH()
|
||||
|
|
@ -30,8 +30,3 @@ SET(YASSL_SOURCES src/buffer.cpp src/cert_wrapper.cpp src/crypto_wrapper.cpp sr
|
|||
ADD_CONVENIENCE_LIBRARY(yassl ${YASSL_SOURCES})
|
||||
RESTRICT_SYMBOL_EXPORTS(yassl)
|
||||
|
||||
IF(MSVC)
|
||||
INSTALL_DEBUG_TARGET(yassl DESTINATION ${INSTALL_LIBDIR}/debug)
|
||||
ENDIF()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,3 @@ SET(TAOCRYPT_SOURCES src/aes.cpp src/aestables.cpp src/algebra.cpp src/arc4.cpp
|
|||
ADD_CONVENIENCE_LIBRARY(taocrypt ${TAOCRYPT_SOURCES})
|
||||
RESTRICT_SYMBOL_EXPORTS(taocrypt)
|
||||
|
||||
IF(MSVC)
|
||||
INSTALL_DEBUG_TARGET(taocrypt DESTINATION ${INSTALL_LIBDIR}/debug)
|
||||
ENDIF()
|
||||
|
||||
|
|
|
|||
|
|
@ -156,15 +156,6 @@ MERGE_LIBRARIES(mysqlserver STATIC ${EMBEDDED_LIBS}
|
|||
|
||||
INSTALL(FILES embedded_priv.h DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT ${COMPONENT_MYSQLSERVER})
|
||||
|
||||
# Visual Studio users need debug static library
|
||||
IF(MSVC)
|
||||
INSTALL_DEBUG_TARGET(mysqlserver DESTINATION ${INSTALL_LIBDIR}/debug)
|
||||
ENDIF()
|
||||
|
||||
IF(UNIX)
|
||||
INSTALL_DEBUG_TARGET(mysqlserver DESTINATION ${INSTALL_LIBDIR} RENAME
|
||||
${CMAKE_STATIC_LIBRARY_PREFIX}mysqld-debug)
|
||||
ENDIF()
|
||||
|
||||
# List of exported functions in embedded (client api except client plugin or
|
||||
# async (*_start/*_cont functions)
|
||||
|
|
|
|||
|
|
@ -742,8 +742,7 @@ sub run_test_server ($$$) {
|
|||
|
||||
# Repeat test $opt_repeat number of times
|
||||
my $repeat= $result->{repeat} || 1;
|
||||
# Don't repeat if test was skipped
|
||||
if ($repeat < $opt_repeat && $result->{'result'} ne 'MTR_RES_SKIPPED')
|
||||
if ($repeat < $opt_repeat)
|
||||
{
|
||||
$result->{retries}= 0;
|
||||
$result->{rep_failures}++ if $result->{failures};
|
||||
|
|
@ -5818,7 +5817,7 @@ sub debugger_arguments {
|
|||
$$exe= $debugger;
|
||||
|
||||
}
|
||||
elsif ( $debugger =~ /windbg/ )
|
||||
elsif ( $debugger =~ /windbg|vsjitdebugger/ )
|
||||
{
|
||||
# windbg exe arg1 .. argn
|
||||
|
||||
|
|
|
|||
|
|
@ -106,3 +106,28 @@ count(distinct user_id)
|
|||
17
|
||||
drop table t1;
|
||||
set @@tmp_table_size = default;
|
||||
create table t1 (
|
||||
a VARCHAR(1020),
|
||||
b int
|
||||
);
|
||||
insert into t1 values
|
||||
( 0 , 1 ),
|
||||
( 1 , 2 ),
|
||||
( 2 , 3 ),
|
||||
( 3 , 4 ),
|
||||
( 4 , 5 ),
|
||||
( 5 , 6 ),
|
||||
( 6 , 7 ),
|
||||
( 7 , 8 ),
|
||||
( 8 , 9 ),
|
||||
( 9 , 10 ),
|
||||
( 0 , 11 ),
|
||||
( 1 , 12 ),
|
||||
( 2 , 13 ),
|
||||
( 3 , 14 );
|
||||
set @@tmp_table_size=1024;
|
||||
select count(distinct a) from t1;
|
||||
count(distinct a)
|
||||
10
|
||||
drop table t1;
|
||||
set @@tmp_table_size = default;
|
||||
|
|
|
|||
|
|
@ -1429,3 +1429,20 @@ release_lock('test')
|
|||
|
||||
# -- Done.
|
||||
|
||||
#
|
||||
# MDEV-13685 Can not replay binary log due to Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'concat'
|
||||
#
|
||||
SET NAMES utf8;
|
||||
SELECT COERCIBILITY(NAME_CONST('name','test'));
|
||||
COERCIBILITY(NAME_CONST('name','test'))
|
||||
2
|
||||
SELECT COERCIBILITY(NAME_CONST('name',TIME'00:00:00'));
|
||||
COERCIBILITY(NAME_CONST('name',TIME'00:00:00'))
|
||||
5
|
||||
SELECT COERCIBILITY(NAME_CONST('name',15));
|
||||
COERCIBILITY(NAME_CONST('name',15))
|
||||
5
|
||||
SELECT CONCAT(NAME_CONST('name',15),'오');
|
||||
CONCAT(NAME_CONST('name',15),'오')
|
||||
15오
|
||||
SET NAMES latin1;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
set @log_output.saved = @@global.log_output;
|
||||
set @@global.log_output = 'TABLE';
|
||||
set session long_query_time=10;
|
||||
select get_lock('bug27638', 1);
|
||||
|
|
@ -7,25 +8,25 @@ set session long_query_time=1;
|
|||
select get_lock('bug27638', 2);
|
||||
get_lock('bug27638', 2)
|
||||
0
|
||||
select if (query_time >= '00:00:01', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:00:01', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 2)';
|
||||
qt sql_text
|
||||
OK select get_lock('bug27638', 2)
|
||||
select get_lock('bug27638', 60);
|
||||
get_lock('bug27638', 60)
|
||||
0
|
||||
select if (query_time >= '00:00:59', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:00:59', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 60)';
|
||||
qt sql_text
|
||||
OK select get_lock('bug27638', 60)
|
||||
select get_lock('bug27638', 101);
|
||||
get_lock('bug27638', 101)
|
||||
0
|
||||
select if (query_time >= '00:01:40', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:01:40', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 101)';
|
||||
qt sql_text
|
||||
OK select get_lock('bug27638', 101)
|
||||
select release_lock('bug27638');
|
||||
release_lock('bug27638')
|
||||
1
|
||||
set @@global.log_output=default;
|
||||
set @@global.log_output = @log_output.saved;
|
||||
|
|
|
|||
|
|
@ -5659,9 +5659,6 @@ CREATE TABLE t3 (a INT);
|
|||
CREATE ALGORITHM = MERGE VIEW v1 AS SELECT t2.a FROM t3 AS t1, t3 AS t2;
|
||||
CREATE ALGORITHM = MERGE VIEW v2 AS SELECT * FROM v1;
|
||||
PREPARE stmt FROM 'REPLACE INTO v2 SELECT a FROM t3';
|
||||
EXECUTE stmt;
|
||||
ERROR HY000: Can not insert into join view 'test.v2' without fields list
|
||||
EXECUTE stmt;
|
||||
ERROR HY000: Can not insert into join view 'test.v2' without fields list
|
||||
drop view v1,v2;
|
||||
drop table t3;
|
||||
|
|
|
|||
24
mysql-test/suite/rpl/r/rpl_sp_variables.result
Normal file
24
mysql-test/suite/rpl/r/rpl_sp_variables.result
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
include/master-slave.inc
|
||||
[connection master]
|
||||
#
|
||||
# MDEV-13685 Can not replay binary log due to Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'concat'
|
||||
#
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8);
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE v_id INT DEFAULT 2017;
|
||||
INSERT INTO test.t1 SELECT CONCAT(v_id, '오');
|
||||
END;
|
||||
$$
|
||||
CALL p1;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
2017오
|
||||
SET NAMES utf8;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
2017오
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
||||
28
mysql-test/suite/rpl/t/rpl_sp_variables.test
Normal file
28
mysql-test/suite/rpl/t/rpl_sp_variables.test
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
source include/master-slave.inc;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13685 Can not replay binary log due to Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'concat'
|
||||
--echo #
|
||||
|
||||
connection master;
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8);
|
||||
DELIMITER $$;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE v_id INT DEFAULT 2017;
|
||||
INSERT INTO test.t1 SELECT CONCAT(v_id, '오');
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
CALL p1;
|
||||
SELECT * FROM t1;
|
||||
sync_slave_with_master;
|
||||
SET NAMES utf8;
|
||||
SELECT * FROM t1;
|
||||
connection master;
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
|
@ -120,6 +120,35 @@ select count(distinct user_id) from t1;
|
|||
drop table t1;
|
||||
set @@tmp_table_size = default;
|
||||
|
||||
#
|
||||
# MDEV-13457: Wrong result for aggregate function with distinct clause when the value for
|
||||
# tmp_table_size is small
|
||||
#
|
||||
|
||||
create table t1 (
|
||||
a VARCHAR(1020),
|
||||
b int
|
||||
);
|
||||
insert into t1 values
|
||||
( 0 , 1 ),
|
||||
( 1 , 2 ),
|
||||
( 2 , 3 ),
|
||||
( 3 , 4 ),
|
||||
( 4 , 5 ),
|
||||
( 5 , 6 ),
|
||||
( 6 , 7 ),
|
||||
( 7 , 8 ),
|
||||
( 8 , 9 ),
|
||||
( 9 , 10 ),
|
||||
( 0 , 11 ),
|
||||
( 1 , 12 ),
|
||||
( 2 , 13 ),
|
||||
( 3 , 14 );
|
||||
set @@tmp_table_size=1024;
|
||||
select count(distinct a) from t1;
|
||||
drop table t1;
|
||||
set @@tmp_table_size = default;
|
||||
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1107,3 +1107,14 @@ select release_lock('test');
|
|||
--echo
|
||||
--echo # -- Done.
|
||||
--echo
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13685 Can not replay binary log due to Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'concat'
|
||||
--echo #
|
||||
SET NAMES utf8;
|
||||
SELECT COERCIBILITY(NAME_CONST('name','test'));
|
||||
SELECT COERCIBILITY(NAME_CONST('name',TIME'00:00:00'));
|
||||
SELECT COERCIBILITY(NAME_CONST('name',15));
|
||||
SELECT CONCAT(NAME_CONST('name',15),'오');
|
||||
SET NAMES latin1;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
# check that CSV engine was compiled in
|
||||
--source include/have_csv.inc
|
||||
|
||||
set @log_output.saved = @@global.log_output;
|
||||
set @@global.log_output = 'TABLE';
|
||||
|
||||
connect (con1,localhost,root,,);
|
||||
|
|
@ -21,13 +22,13 @@ select get_lock('bug27638', 1);
|
|||
connection con2;
|
||||
set session long_query_time=1;
|
||||
select get_lock('bug27638', 2);
|
||||
select if (query_time >= '00:00:01', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:00:01', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 2)';
|
||||
select get_lock('bug27638', 60);
|
||||
select if (query_time >= '00:00:59', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:00:59', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 60)';
|
||||
select get_lock('bug27638', 101);
|
||||
select if (query_time >= '00:01:40', 'OK', 'WRONG') as qt, sql_text from mysql.slow_log
|
||||
select if (query_time >= '00:01:40', 'OK', concat('WRONG: ',query_time)) as qt, sql_text from mysql.slow_log
|
||||
where sql_text = 'select get_lock(\'bug27638\', 101)';
|
||||
connection con1;
|
||||
select release_lock('bug27638');
|
||||
|
|
@ -36,4 +37,4 @@ connection default;
|
|||
disconnect con1;
|
||||
disconnect con2;
|
||||
|
||||
set @@global.log_output=default;
|
||||
set @@global.log_output = @log_output.saved;
|
||||
|
|
|
|||
|
|
@ -5585,11 +5585,8 @@ drop table t1,t2,t3;
|
|||
CREATE TABLE t3 (a INT);
|
||||
CREATE ALGORITHM = MERGE VIEW v1 AS SELECT t2.a FROM t3 AS t1, t3 AS t2;
|
||||
CREATE ALGORITHM = MERGE VIEW v2 AS SELECT * FROM v1;
|
||||
--error ER_VIEW_NO_INSERT_FIELD_LIST
|
||||
PREPARE stmt FROM 'REPLACE INTO v2 SELECT a FROM t3';
|
||||
--error ER_VIEW_NO_INSERT_FIELD_LIST
|
||||
EXECUTE stmt;
|
||||
--error ER_VIEW_NO_INSERT_FIELD_LIST
|
||||
EXECUTE stmt;
|
||||
drop view v1,v2;
|
||||
drop table t3;
|
||||
|
||||
|
|
|
|||
|
|
@ -48,24 +48,13 @@ ${WSREP_INCLUDES}
|
|||
SET(GEN_SOURCES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.h
|
||||
${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.cc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h
|
||||
)
|
||||
SET(GEN_DIGEST_SOURCES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/lex_token.h
|
||||
${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h
|
||||
${CMAKE_CURRENT_BINARY_DIR}/lex_token.h
|
||||
)
|
||||
|
||||
SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES}
|
||||
${GEN_DIGEST_SOURCES}
|
||||
PROPERTIES GENERATED 1)
|
||||
|
||||
# Gen_lex_token
|
||||
# Make sure sql_yacc.h is generated before compiling gen_lex_token
|
||||
|
||||
IF(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
SET(DEPENDS_gen_lex_token DEPENDS gen_lex_token)
|
||||
SET(DEPENDS_gen_lex_hash DEPENDS gen_lex_hash)
|
||||
ENDIF()
|
||||
|
||||
|
||||
IF(NOT CMAKE_CROSSCOMPILING)
|
||||
ADD_EXECUTABLE(gen_lex_token gen_lex_token.cc
|
||||
|
|
@ -75,7 +64,7 @@ ENDIF()
|
|||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lex_token.h
|
||||
COMMAND gen_lex_token > lex_token.h
|
||||
${DEPENDS_gen_lex_token}
|
||||
DEPENDS gen_lex_token
|
||||
)
|
||||
|
||||
ADD_DEFINITIONS(-DMYSQL_SERVER -DHAVE_EVENT_SCHEDULER)
|
||||
|
|
@ -148,7 +137,6 @@ SET (SQL_SOURCE
|
|||
table_cache.cc encryption.cc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc
|
||||
${GEN_SOURCES}
|
||||
${GEN_DIGEST_SOURCES}
|
||||
${MYSYS_LIBWRAP_SOURCE}
|
||||
)
|
||||
|
||||
|
|
@ -169,7 +157,6 @@ RECOMPILE_FOR_EMBEDDED)
|
|||
|
||||
ADD_LIBRARY(sql STATIC ${SQL_SOURCE})
|
||||
ADD_DEPENDENCIES(sql GenServerSource)
|
||||
ADD_DEPENDENCIES(sql GenDigestServerSource)
|
||||
DTRACE_INSTRUMENT(sql)
|
||||
TARGET_LINK_LIBRARIES(sql ${MYSQLD_STATIC_PLUGIN_LIBS}
|
||||
mysys mysys_ssl dbug strings vio pcre ${LIBJEMALLOC}
|
||||
|
|
@ -208,7 +195,7 @@ IF(MSVC AND NOT WITHOUT_DYNAMIC_PLUGINS)
|
|||
SET(MYSQLD_DEF ${CMAKE_CURRENT_BINARY_DIR}/mysqld_lib.def)
|
||||
SET(MYSQLD_EXP ${CMAKE_CURRENT_BINARY_DIR}/mysqld_lib.exp)
|
||||
SET(MYSQLD_LIB ${CMAKE_CURRENT_BINARY_DIR}/mysqld_lib.lib)
|
||||
SET(MYSQLD_CORELIBS sql mysys mysys_ssl dbug strings)
|
||||
SET(MYSQLD_CORELIBS sql mysys dbug strings)
|
||||
FOREACH (CORELIB ${MYSQLD_CORELIBS})
|
||||
GET_TARGET_PROPERTY(LOC ${CORELIB} LOCATION)
|
||||
FILE(TO_NATIVE_PATH ${LOC} LOC)
|
||||
|
|
@ -219,25 +206,45 @@ IF(MSVC AND NOT WITHOUT_DYNAMIC_PLUGINS)
|
|||
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
SET(_PLATFORM x64)
|
||||
ENDIF()
|
||||
# Create a cmake script to generate import and export libs
|
||||
# from a .def file
|
||||
SET(CMAKE_CONFIGURABLE_FILE_CONTENT "
|
||||
IF ((mysqld_lib.def IS_NEWER_THAN mysqld_lib.lib) OR
|
||||
(mysqld_lib.def IS_NEWER_THAN mysqld_lib.exp))
|
||||
FILE(REMOVE mysqld_lib.lib mysqld_lib.exp)
|
||||
SET(ENV{VS_UNICODE_OUTPUT})
|
||||
EXECUTE_PROCESS (
|
||||
COMMAND \"${CMAKE_LINKER}\" /lib /NAME:mysqld.exe \"/DEF:${MYSQLD_DEF}\" /MACHINE:${_PLATFORM}
|
||||
RESULT_VARIABLE ret)
|
||||
IF(NOT ret EQUAL 0)
|
||||
MESSAGE(FATAL_ERROR \"process failed ret=\${ret}\")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
")
|
||||
|
||||
CONFIGURE_FILE(
|
||||
${PROJECT_SOURCE_DIR}/cmake/configurable_file_content.in
|
||||
make_mysqld_lib.cmake)
|
||||
|
||||
IF(CMAKE_VERSION VERSION_GREATER "3.2.0")
|
||||
SET(MYSQLD_LIB_BYPRODUCTS BYPRODUCTS ${MYSQLD_DEF} ${MYSQLD_LIB} ${MYSQLD_EXP})
|
||||
ENDIF()
|
||||
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${MYSQLD_DEF}
|
||||
COMMAND cscript ARGS //nologo ${PROJECT_SOURCE_DIR}/win/create_def_file.js
|
||||
${_PLATFORM} /forLib ${LIB_LOCATIONS} > mysqld_lib.def.tmp
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mysqld_lib.stamp
|
||||
${MYSQLD_LIB_BYPRODUCTS}
|
||||
COMMENT "Generating mysqld_lib.def, mysqld_lib.lib, mysqld_lib.exp"
|
||||
COMMAND cscript //nologo ${PROJECT_SOURCE_DIR}/win/create_def_file.js
|
||||
${_PLATFORM} /forLib ${LIB_LOCATIONS} > mysqld_lib.def.tmp
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different mysqld_lib.def.tmp mysqld_lib.def
|
||||
COMMAND ${CMAKE_COMMAND} -E remove mysqld_lib.def.tmp
|
||||
COMMAND ${CMAKE_COMMAND} -P make_mysqld_lib.cmake
|
||||
COMMAND ${CMAKE_COMMAND} -E touch mysqld_lib.stamp
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS ${MYSQLD_CORELIBS}
|
||||
)
|
||||
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${MYSQLD_LIB}
|
||||
COMMAND lib
|
||||
ARGS /NAME:mysqld.exe "/DEF:${MYSQLD_DEF}" "/MACHINE:${_PLATFORM}"
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS ${MYSQLD_DEF}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(gen_mysqld_lib DEPENDS ${MYSQLD_LIB})
|
||||
ADD_CUSTOM_TARGET(gen_mysqld_lib DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/mysqld_lib.stamp)
|
||||
ADD_LIBRARY(mysqld_import_lib UNKNOWN IMPORTED GLOBAL)
|
||||
SET_TARGET_PROPERTIES(mysqld_import_lib PROPERTIES IMPORTED_LOCATION ${MYSQLD_LIB})
|
||||
ENDIF()
|
||||
|
|
@ -253,7 +260,9 @@ IF(APPLE)
|
|||
ENDIF()
|
||||
|
||||
IF(NOT WITHOUT_DYNAMIC_PLUGINS)
|
||||
SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE)
|
||||
IF(NOT MSVC)
|
||||
SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE)
|
||||
ENDIF()
|
||||
GET_TARGET_PROPERTY(mysqld_link_flags mysqld LINK_FLAGS)
|
||||
IF(NOT mysqld_link_flags)
|
||||
SET(mysqld_link_flags)
|
||||
|
|
@ -267,7 +276,6 @@ IF(NOT WITHOUT_DYNAMIC_PLUGINS)
|
|||
ENDIF()
|
||||
ENDIF(NOT WITHOUT_DYNAMIC_PLUGINS)
|
||||
|
||||
SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE)
|
||||
TARGET_LINK_LIBRARIES(mysqld sql)
|
||||
|
||||
# Provide plugins with minimal set of libraries
|
||||
|
|
@ -293,10 +301,6 @@ IF(WITH_MYSQLD_LDFLAGS)
|
|||
SET_TARGET_PROPERTIES(mysqld PROPERTIES LINK_FLAGS
|
||||
"${MYSQLD_LINK_FLAGS} ${WITH_MYSQLD_LDFLAGS}")
|
||||
ENDIF()
|
||||
INSTALL_DEBUG_TARGET(mysqld
|
||||
DESTINATION ${INSTALL_SBINDIR}
|
||||
PDB_DESTINATION ${INSTALL_SBINDIR}/debug
|
||||
RENAME mysqld-debug)
|
||||
|
||||
INCLUDE(${CMAKE_SOURCE_DIR}/cmake/bison.cmake)
|
||||
|
||||
|
|
@ -330,7 +334,7 @@ ENDIF()
|
|||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h
|
||||
COMMAND gen_lex_hash > lex_hash.h
|
||||
${DEPENDS_gen_lex_hash}
|
||||
DEPENDS gen_lex_hash
|
||||
)
|
||||
|
||||
MYSQL_ADD_EXECUTABLE(mysql_tzinfo_to_sql tztime.cc COMPONENT Server)
|
||||
|
|
@ -342,11 +346,6 @@ ADD_CUSTOM_TARGET(
|
|||
DEPENDS ${GEN_SOURCES}
|
||||
)
|
||||
|
||||
ADD_CUSTOM_TARGET(
|
||||
GenDigestServerSource
|
||||
DEPENDS ${GEN_DIGEST_SOURCES}
|
||||
)
|
||||
|
||||
#Need this only for embedded
|
||||
SET_TARGET_PROPERTIES(GenServerSource PROPERTIES EXCLUDE_FROM_ALL TRUE)
|
||||
|
||||
|
|
|
|||
|
|
@ -1742,7 +1742,10 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
|
|||
{
|
||||
set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
|
||||
}
|
||||
collation.set(value_item->collation.collation, DERIVATION_IMPLICIT);
|
||||
if (value_item->collation.derivation == DERIVATION_NUMERIC)
|
||||
collation.set_numeric();
|
||||
else
|
||||
collation.set(value_item->collation.collation, DERIVATION_IMPLICIT);
|
||||
max_length= value_item->max_length;
|
||||
decimals= value_item->decimals;
|
||||
fixed= 1;
|
||||
|
|
|
|||
|
|
@ -5106,7 +5106,7 @@ public:
|
|||
{
|
||||
DBUG_ENTER("unique_add");
|
||||
DBUG_PRINT("info", ("tree %u - %lu", tree.elements_in_tree, max_elements));
|
||||
if (!(tree.flag & TREE_ONLY_DUPS) &&
|
||||
if (!(tree.flag & TREE_ONLY_DUPS) &&
|
||||
tree.elements_in_tree >= max_elements && flush())
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(!tree_insert(&tree, ptr, 0, tree.custom_arg));
|
||||
|
|
|
|||
|
|
@ -520,6 +520,8 @@ bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived)
|
|||
derived->merge_underlying_list != 0));
|
||||
if (derived->merged_for_insert)
|
||||
DBUG_RETURN(FALSE);
|
||||
if (derived->init_derived(thd, FALSE))
|
||||
DBUG_RETURN(TRUE);
|
||||
if (derived->is_materialized_derived())
|
||||
DBUG_RETURN(mysql_derived_prepare(thd, lex, derived));
|
||||
if ((thd->lex->sql_command == SQLCOM_UPDATE_MULTI ||
|
||||
|
|
@ -537,8 +539,6 @@ bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived)
|
|||
DBUG_ASSERT(derived->table);
|
||||
}
|
||||
}
|
||||
else
|
||||
derived->table= derived->merge_underlying_list->table;
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,6 +100,9 @@ Unique::Unique(qsort_cmp2 comp_func, void * comp_func_fixed_arg,
|
|||
*/
|
||||
max_elements= (ulong) (max_in_memory_size /
|
||||
ALIGN_SIZE(sizeof(TREE_ELEMENT)+size));
|
||||
if (!max_elements)
|
||||
max_elements= 1;
|
||||
|
||||
(void) open_cached_file(&file, mysql_tmpdir,TEMP_PREFIX, DISK_BUFFER_SIZE,
|
||||
MYF(MY_WME));
|
||||
}
|
||||
|
|
@ -643,11 +646,12 @@ bool Unique::walk(TABLE *table, tree_walk_action action, void *walk_action_arg)
|
|||
if (flush_io_cache(&file) || reinit_io_cache(&file, READ_CACHE, 0L, 0, 0))
|
||||
return 1;
|
||||
/*
|
||||
merge_buffer must fit at least MERGEBUFF2 keys, because
|
||||
merge_index() can merge that many BUFFPEKs at once.
|
||||
merge_buffer must fit at least MERGEBUFF2 + 1 keys, because
|
||||
merge_index() can merge that many BUFFPEKs at once. The extra space for one key
|
||||
is needed when a piece of merge buffer is re-read, see merge_walk()
|
||||
*/
|
||||
size_t buff_sz= MY_MAX(MERGEBUFF2, max_in_memory_size/full_size+1) * full_size;
|
||||
if (!(merge_buffer = (uchar *)my_malloc(buff_sz, MYF(MY_THREAD_SPECIFIC|MY_WME))))
|
||||
size_t buff_sz= MY_MAX(MERGEBUFF2+1, max_in_memory_size/full_size+1) * full_size;
|
||||
if (!(merge_buffer = (uchar *)my_malloc(buff_sz, MYF(MY_WME))))
|
||||
return 1;
|
||||
if (buff_sz < full_size * (file_ptrs.elements + 1UL))
|
||||
res= merge(table, merge_buffer, buff_sz >= full_size * MERGEBUFF2) ;
|
||||
|
|
@ -707,8 +711,8 @@ bool Unique::merge(TABLE *table, uchar *buff, bool without_last_merge)
|
|||
full_size;
|
||||
sort_param.min_dupl_count= min_dupl_count;
|
||||
sort_param.res_length= 0;
|
||||
sort_param.max_keys_per_buffer=
|
||||
(uint) (max_in_memory_size / sort_param.sort_length);
|
||||
sort_param.max_keys_per_buffer=
|
||||
(uint) MY_MAX((max_in_memory_size / sort_param.sort_length), MERGEBUFF2);
|
||||
sort_param.not_killable= 1;
|
||||
|
||||
sort_param.unique_buff= buff +(sort_param.max_keys_per_buffer *
|
||||
|
|
|
|||
|
|
@ -245,13 +245,10 @@ int main() {
|
|||
ENDIF(CONNECT_WITH_ODBC)
|
||||
|
||||
#
|
||||
# JDBC
|
||||
# JDBC with MongoDB Java Driver included but disabled
|
||||
#
|
||||
IF(APPLE)
|
||||
OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine without JDBC support" OFF)
|
||||
ELSE()
|
||||
OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON)
|
||||
ENDIF()
|
||||
OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON)
|
||||
OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON)
|
||||
|
||||
IF(CONNECT_WITH_JDBC)
|
||||
FIND_PACKAGE(Java 1.6)
|
||||
|
|
@ -262,11 +259,19 @@ IF(CONNECT_WITH_JDBC)
|
|||
INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2})
|
||||
# SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked
|
||||
SET(CONNECT_SOURCES ${CONNECT_SOURCES}
|
||||
jdbconn.cpp tabjdbc.cpp jdbconn.h tabjdbc.h jdbccat.h
|
||||
javaconn.cpp jdbconn.cpp tabjdbc.cpp
|
||||
jdbccat.h javaconn.h jdbconn.h tabjdbc.h
|
||||
JdbcInterface.java ApacheInterface.java MariadbInterface.java
|
||||
MysqlInterface.java OracleInterface.java PostgresqlInterface.java
|
||||
JavaWrappers.jar)
|
||||
add_definitions(-DJDBC_SUPPORT)
|
||||
IF(CONNECT_WITH_MONGO)
|
||||
SET(CONNECT_SOURCES ${CONNECT_SOURCES}
|
||||
jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp
|
||||
jmgfam.h jmgoconn.h mongo.h tabjmg.h
|
||||
Mongo2Interface.java Mongo3Interface.java)
|
||||
add_definitions(-DMONGO_SUPPORT -DMONGO_ENABLED=0)
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(JDBC_LIBRARY "")
|
||||
ENDIF()
|
||||
|
|
@ -284,6 +289,38 @@ IF(CONNECT_WITH_ZIP)
|
|||
add_definitions(-DZIP_SUPPORT -DNOCRYPT)
|
||||
ENDIF(CONNECT_WITH_ZIP)
|
||||
|
||||
#
|
||||
# MONGO C Driver
|
||||
#
|
||||
|
||||
IF(CONNECT_WITH_MONGO)
|
||||
IF(WIN32)
|
||||
# Adding some typical places to search in
|
||||
SET(PC_MONGO_INCLUDE_DIRS
|
||||
C:/mongo-c-driver/include
|
||||
D:/mongo-c-driver/include)
|
||||
SET(PC_MONGO_LIBRARY_DIRS
|
||||
C:/mongo-c-driver/lib
|
||||
D:/mongo-c-driver/lib)
|
||||
ENDIF(WIN32)
|
||||
FIND_PACKAGE(libmongoc-1.0 1.7)
|
||||
IF (libmongoc-1.0_FOUND)
|
||||
INCLUDE_DIRECTORIES(${MONGOC_INCLUDE_DIRS})
|
||||
SET(MONGOC_LIBRARY ${MONGOC_LIBRARIES})
|
||||
SET(CONNECT_SOURCES ${CONNECT_SOURCES}
|
||||
cmgoconn.cpp cmgfam.cpp tabcmg.cpp
|
||||
cmgoconn.h cmgfam.h tabcmg.h)
|
||||
add_definitions(-DCMGO_SUPPORT)
|
||||
IF (NOT JAVA_FOUND AND JNI_FOUND)
|
||||
SET(CONNECT_SOURCES ${CONNECT_SOURCES} mongo.cpp mongo.h)
|
||||
add_definitions(-DMONGO_SUPPORT -DMONGO_ENABLED=1)
|
||||
ELSE ()
|
||||
remove_definitions(-DMONGO_ENABLED=0)
|
||||
add_definitions(-DMONGO_ENABLED=1)
|
||||
ENDIF (NOT JAVA_FOUND AND JNI_FOUND)
|
||||
ENDIF(libmongoc-1.0_FOUND)
|
||||
ENDIF(CONNECT_WITH_MONGO)
|
||||
|
||||
|
||||
#
|
||||
# XMAP
|
||||
|
|
@ -304,7 +341,7 @@ MYSQL_ADD_PLUGIN(connect ${CONNECT_SOURCES}
|
|||
COMPONENT connect-engine
|
||||
RECOMPILE_FOR_EMBEDDED
|
||||
LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY}
|
||||
${ODBC_LIBRARY} ${JDBC_LIBRARY} ${IPHLPAPI_LIBRARY})
|
||||
${ODBC_LIBRARY} ${JDBC_LIBRARY} ${MONGOC_LIBRARY} ${IPHLPAPI_LIBRARY})
|
||||
|
||||
IF(NOT TARGET connect)
|
||||
RETURN()
|
||||
|
|
@ -333,4 +370,3 @@ IF(CONNECT_WITH_JDBC AND JAVA_FOUND AND JNI_FOUND)
|
|||
${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar
|
||||
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||
ENDIF()
|
||||
|
||||
|
|
|
|||
Binary file not shown.
437
storage/connect/Mongo2Interface.java
Normal file
437
storage/connect/Mongo2Interface.java
Normal file
|
|
@ -0,0 +1,437 @@
|
|||
package wrappers;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.mongodb.AggregationOptions;
|
||||
import com.mongodb.BasicDBList;
|
||||
import com.mongodb.BasicDBObject;
|
||||
import com.mongodb.Cursor;
|
||||
import com.mongodb.DB;
|
||||
import com.mongodb.DBCollection;
|
||||
import com.mongodb.DBObject;
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.MongoClientURI;
|
||||
import com.mongodb.MongoException;
|
||||
import com.mongodb.WriteConcernException;
|
||||
import com.mongodb.WriteResult;
|
||||
import com.mongodb.util.JSON;
|
||||
|
||||
public class Mongo2Interface {
|
||||
boolean DEBUG = false;
|
||||
String Errmsg = "No error";
|
||||
Set<String> Colnames = null;
|
||||
Cursor cursor = null;
|
||||
MongoClient client = null;
|
||||
DB db = null;
|
||||
DBCollection coll = null;
|
||||
BasicDBObject doc = null;
|
||||
BasicDBObject dbq = null;
|
||||
BasicDBObject dbf = null;
|
||||
List<DBObject> pip = null;
|
||||
AggregationOptions aop = null;
|
||||
|
||||
// === Constructors/finalize =========================================
|
||||
public Mongo2Interface() {
|
||||
this(false);
|
||||
} // end of default constructor
|
||||
|
||||
public Mongo2Interface(boolean b) {
|
||||
DEBUG = b;
|
||||
} // end of constructor
|
||||
|
||||
protected void SetErrmsg(String str) {
|
||||
if (DEBUG)
|
||||
System.out.println(str);
|
||||
|
||||
Errmsg = str;
|
||||
} // end of SetErrmsg
|
||||
|
||||
protected void SetErrmsg(Exception e) {
|
||||
if (DEBUG)
|
||||
System.out.println(e.getMessage());
|
||||
|
||||
Errmsg = e.toString();
|
||||
} // end of SetErrmsg
|
||||
|
||||
public String GetErrmsg() {
|
||||
String err = Errmsg;
|
||||
|
||||
Errmsg = "No error";
|
||||
return err;
|
||||
} // end of GetErrmsg
|
||||
|
||||
public int MongoConnect(String[] parms) {
|
||||
int rc = 0;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Mongo2: URI=" + parms[0] + " DB=" + parms[1]);
|
||||
|
||||
try {
|
||||
MongoClientURI uri = new MongoClientURI(parms[0]);
|
||||
|
||||
client = new MongoClient(uri);
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Connection " + client.toString() + " established");
|
||||
|
||||
// Now connect to your databases
|
||||
db = client.getDB(parms[1]);
|
||||
|
||||
if (parms[2] != null && !parms[2].isEmpty()) {
|
||||
if (DEBUG)
|
||||
System.out.println("user=" + parms[2] + " pwd=" + parms[3]);
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
boolean auth = db.authenticate(parms[2], parms[3].toCharArray());
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Authentication: " + auth);
|
||||
|
||||
} // endif user
|
||||
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
rc = -1;
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
rc = -3;
|
||||
} // end try/catch
|
||||
|
||||
return rc;
|
||||
} // end of MongoConnect
|
||||
|
||||
public int MongoDisconnect() {
|
||||
int rc = 0;
|
||||
|
||||
try {
|
||||
if (cursor != null) {
|
||||
if (DEBUG)
|
||||
System.out.println("Closing cursor");
|
||||
|
||||
cursor.close();
|
||||
cursor = null;
|
||||
} // endif client
|
||||
|
||||
if (client != null) {
|
||||
if (DEBUG)
|
||||
System.out.println("Closing connection");
|
||||
|
||||
client.close();
|
||||
client = null;
|
||||
} // endif client
|
||||
|
||||
} catch (MongoException se) {
|
||||
SetErrmsg(se);
|
||||
rc += 8;
|
||||
} // end try/catch
|
||||
|
||||
return rc;
|
||||
} // end of MongoDisconnect
|
||||
|
||||
public boolean GetCollection(String name) {
|
||||
if (DEBUG)
|
||||
System.out.println("GetCollection: name=" + name);
|
||||
|
||||
try {
|
||||
coll = db.getCollection(name);
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of GetCollection
|
||||
|
||||
public long GetCollSize() {
|
||||
return (coll != null) ? coll.count() : 0;
|
||||
} // end of GetCollSize
|
||||
|
||||
public boolean FindColl(String query, String fields) {
|
||||
if (DEBUG)
|
||||
System.out.println("FindColl: query=" + query + " fields=" + fields);
|
||||
|
||||
try {
|
||||
if (query != null || fields != null) {
|
||||
dbq = (BasicDBObject) JSON.parse((query != null) ? query : "{}");
|
||||
|
||||
if (fields != null) {
|
||||
dbf = (BasicDBObject) JSON.parse(fields);
|
||||
cursor = coll.find(dbq, dbf);
|
||||
} else
|
||||
cursor = coll.find(dbq);
|
||||
|
||||
} else
|
||||
cursor = coll.find();
|
||||
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of FindColl
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public boolean AggregateColl(String pipeline) {
|
||||
if (DEBUG)
|
||||
System.out.println("AggregateColl: pipeline=" + pipeline);
|
||||
|
||||
try {
|
||||
DBObject pipe = (DBObject) JSON.parse(pipeline);
|
||||
|
||||
pip = (List<DBObject>) pipe.get("pipeline");
|
||||
aop = AggregationOptions.builder().batchSize(0).allowDiskUse(true)
|
||||
.outputMode(AggregationOptions.OutputMode.CURSOR).build();
|
||||
cursor = coll.aggregate(pip, aop);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of AggregateColl
|
||||
|
||||
public boolean Rewind() {
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
|
||||
if (pip == null) {
|
||||
if (dbf != null)
|
||||
cursor = coll.find(dbq, dbf);
|
||||
else if (dbq != null)
|
||||
cursor = coll.find(dbq);
|
||||
else
|
||||
cursor = coll.find();
|
||||
|
||||
} else
|
||||
cursor = coll.aggregate(pip, aop);
|
||||
|
||||
return (cursor == null);
|
||||
} // end of Rewind
|
||||
|
||||
public int ReadNext() {
|
||||
try {
|
||||
if (cursor.hasNext()) {
|
||||
doc = (BasicDBObject) cursor.next();
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Class doc = " + doc.getClass());
|
||||
|
||||
Colnames = doc.keySet();
|
||||
return 1;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return -1;
|
||||
} // end try/catch
|
||||
|
||||
} // end of ReadNext
|
||||
|
||||
public boolean Fetch(int row) {
|
||||
if (cursor.hasNext()) {
|
||||
doc = (BasicDBObject) cursor.next();
|
||||
Colnames = doc.keySet();
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
} // end of Fetch
|
||||
|
||||
public String GetDoc() {
|
||||
return (doc != null) ? doc.toString() : null;
|
||||
} // end of GetDoc
|
||||
|
||||
public Set<String> GetColumns() {
|
||||
if (doc != null)
|
||||
return doc.keySet();
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end of GetColumns
|
||||
|
||||
public String ColumnDesc(int n, int[] val) {
|
||||
// if (rsmd == null) {
|
||||
// System.out.println("No result metadata");
|
||||
// return null;
|
||||
// } else try {
|
||||
// val[0] = rsmd.getColumnType(n);
|
||||
// val[1] = rsmd.getPrecision(n);
|
||||
// val[2] = rsmd.getScale(n);
|
||||
// val[3] = rsmd.isNullable(n);
|
||||
// return rsmd.getColumnLabel(n);
|
||||
// } catch (SQLException se) {
|
||||
// SetErrmsg(se);
|
||||
// } //end try/catch
|
||||
|
||||
return null;
|
||||
} // end of ColumnDesc
|
||||
|
||||
protected Object GetFieldObject(String path) {
|
||||
Object o = null;
|
||||
BasicDBObject dob = null;
|
||||
BasicDBList lst = null;
|
||||
String[] names = null;
|
||||
|
||||
if (path == null || path.equals("*"))
|
||||
return doc;
|
||||
else if (doc instanceof BasicDBObject)
|
||||
dob = doc;
|
||||
// else if (o instanceof BasicDBList)
|
||||
// lst = (BasicDBList) doc;
|
||||
else
|
||||
return doc;
|
||||
|
||||
try {
|
||||
names = path.split("\\.");
|
||||
|
||||
for (String name : names) {
|
||||
if (lst != null) {
|
||||
o = lst.get(Integer.parseInt(name));
|
||||
} else
|
||||
o = dob.get(name);
|
||||
|
||||
if (o == null)
|
||||
break;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Class o = " + o.getClass());
|
||||
|
||||
if (o instanceof BasicDBObject) {
|
||||
dob = (BasicDBObject) o;
|
||||
lst = null;
|
||||
} else if (o instanceof BasicDBList) {
|
||||
lst = (BasicDBList) o;
|
||||
} else
|
||||
break;
|
||||
|
||||
} // endfor name
|
||||
|
||||
} catch (IndexOutOfBoundsException x) {
|
||||
o = null;
|
||||
} catch (MongoException se) {
|
||||
SetErrmsg(se);
|
||||
o = null;
|
||||
} // end try/catch
|
||||
|
||||
return o;
|
||||
} // end of GetFieldObject
|
||||
|
||||
public String GetField(String path) {
|
||||
Object o = GetFieldObject(path);
|
||||
|
||||
if (o != null) {
|
||||
if (o instanceof Date) {
|
||||
Integer TS = (int) (((Date) o).getTime() / 1000);
|
||||
return TS.toString();
|
||||
} // endif Date
|
||||
|
||||
return o.toString();
|
||||
} else
|
||||
return null;
|
||||
|
||||
} // end of GetField
|
||||
|
||||
public Object MakeDocument() {
|
||||
return new BasicDBObject();
|
||||
} // end of MakeDocument
|
||||
|
||||
public boolean DocAdd(Object bdc, String key, Object val) {
|
||||
try {
|
||||
((BasicDBObject) bdc).append(key, val);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of DocAdd
|
||||
|
||||
public Object MakeArray() {
|
||||
return new BasicDBList();
|
||||
} // end of MakeArray
|
||||
|
||||
public boolean ArrayAdd(Object bar, int n, Object val) {
|
||||
try {
|
||||
((BasicDBList) bar).put(n, val);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of ArrayAdd
|
||||
|
||||
public boolean CollInsert(Object dob) {
|
||||
try {
|
||||
coll.insert((BasicDBObject) dob);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of CollInsert
|
||||
|
||||
public long CollUpdate(Object upd) {
|
||||
long n = -1;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("upd: " + upd.toString());
|
||||
|
||||
try {
|
||||
DBObject qry = new BasicDBObject("_id", doc.get("_id"));
|
||||
|
||||
WriteResult res = coll.update(qry, (DBObject) upd);
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("CollUpdate: " + res.toString());
|
||||
|
||||
n = res.getN();
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
} // end try/catch
|
||||
|
||||
return n;
|
||||
} // end of CollUpdate
|
||||
|
||||
public long CollDelete(boolean all) {
|
||||
long n = -1;
|
||||
|
||||
try {
|
||||
WriteResult res;
|
||||
BasicDBObject qry = new BasicDBObject();
|
||||
|
||||
if (!all)
|
||||
qry.append("_id", doc.get("_id"));
|
||||
|
||||
res = coll.remove(qry);
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("CollDelete: " + res.toString());
|
||||
|
||||
n = res.getN();
|
||||
} catch (WriteConcernException wx) {
|
||||
SetErrmsg(wx);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
} catch (UnsupportedOperationException ux) {
|
||||
SetErrmsg(ux);
|
||||
n = 0;
|
||||
} // end try/catch
|
||||
|
||||
return n;
|
||||
} // end of CollDelete
|
||||
|
||||
} // end of class MongoInterface
|
||||
504
storage/connect/Mongo3Interface.java
Normal file
504
storage/connect/Mongo3Interface.java
Normal file
|
|
@ -0,0 +1,504 @@
|
|||
package wrappers;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bson.BsonArray;
|
||||
import org.bson.BsonBoolean;
|
||||
import org.bson.BsonDateTime;
|
||||
import org.bson.BsonDocument;
|
||||
import org.bson.BsonDouble;
|
||||
import org.bson.BsonInt32;
|
||||
import org.bson.BsonInt64;
|
||||
import org.bson.BsonNull;
|
||||
import org.bson.BsonString;
|
||||
import org.bson.BsonValue;
|
||||
import org.bson.Document;
|
||||
import org.bson.conversions.Bson;
|
||||
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.MongoClientURI;
|
||||
import com.mongodb.MongoException;
|
||||
import com.mongodb.client.AggregateIterable;
|
||||
import com.mongodb.client.FindIterable;
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoCursor;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import com.mongodb.client.model.Filters;
|
||||
import com.mongodb.client.result.DeleteResult;
|
||||
import com.mongodb.client.result.UpdateResult;
|
||||
|
||||
public class Mongo3Interface {
|
||||
boolean DEBUG = false;
|
||||
String Errmsg = "No error";
|
||||
Set<String> Colnames = null;
|
||||
MongoClient client = null;
|
||||
MongoDatabase db = null;
|
||||
MongoCollection<BsonDocument> coll = null;
|
||||
FindIterable<BsonDocument> finditer = null;
|
||||
AggregateIterable<BsonDocument> aggiter = null;
|
||||
MongoCursor<BsonDocument> cursor = null;
|
||||
BsonDocument doc = null;
|
||||
BsonDocument util = null;
|
||||
BsonNull bsonull = new BsonNull();
|
||||
|
||||
// === Constructors/finalize =========================================
|
||||
public Mongo3Interface() {
|
||||
this(false);
|
||||
} // end of default constructor
|
||||
|
||||
public Mongo3Interface(boolean b) {
|
||||
DEBUG = b;
|
||||
} // end of constructor
|
||||
|
||||
protected void SetErrmsg(String str) {
|
||||
if (DEBUG)
|
||||
System.out.println(str);
|
||||
|
||||
Errmsg = str;
|
||||
} // end of SetErrmsg
|
||||
|
||||
protected void SetErrmsg(Exception e) {
|
||||
if (DEBUG)
|
||||
System.out.println(e.getMessage());
|
||||
|
||||
Errmsg = e.toString();
|
||||
} // end of SetErrmsg
|
||||
|
||||
public String GetErrmsg() {
|
||||
String err = Errmsg;
|
||||
|
||||
Errmsg = "No error";
|
||||
return err;
|
||||
} // end of GetErrmsg
|
||||
|
||||
public int MongoConnect(String[] parms) {
|
||||
int rc = 0;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Mongo3: URI=" + parms[0] + " DB=" + parms[1]);
|
||||
|
||||
try {
|
||||
MongoClientURI uri = new MongoClientURI(parms[0]);
|
||||
|
||||
client = new MongoClient(uri);
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Connection " + client.toString() + " established");
|
||||
|
||||
// Now connect to your databases
|
||||
db = client.getDatabase(parms[1]);
|
||||
|
||||
// if (parms[2] != null && !parms[2].isEmpty()) {
|
||||
// if (DEBUG)
|
||||
// System.out.println("user=" + parms[2] + " pwd=" + parms[3]);
|
||||
|
||||
// @SuppressWarnings("deprecation")
|
||||
// boolean auth = db.authenticate(parms[2], parms[3].toCharArray());
|
||||
|
||||
// if (DEBUG)
|
||||
// System.out.println("Authentication: " + auth);
|
||||
|
||||
// } // endif user
|
||||
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
rc = -1;
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
rc = -3;
|
||||
} // end try/catch
|
||||
|
||||
return rc;
|
||||
} // end of MongoConnect
|
||||
|
||||
public int MongoDisconnect() {
|
||||
int rc = 0;
|
||||
|
||||
try {
|
||||
if (cursor != null) {
|
||||
if (DEBUG)
|
||||
System.out.println("Closing cursor");
|
||||
|
||||
cursor.close();
|
||||
cursor = null;
|
||||
} // endif client
|
||||
|
||||
if (client != null) {
|
||||
if (DEBUG)
|
||||
System.out.println("Closing connection");
|
||||
|
||||
client.close();
|
||||
client = null;
|
||||
} // endif client
|
||||
|
||||
} catch (MongoException se) {
|
||||
SetErrmsg(se);
|
||||
rc += 8;
|
||||
} // end try/catch
|
||||
|
||||
return rc;
|
||||
} // end of MongoDisconnect
|
||||
|
||||
public boolean GetCollection(String name) {
|
||||
if (DEBUG)
|
||||
System.out.println("GetCollection: name=" + name);
|
||||
|
||||
try {
|
||||
coll = db.getCollection(name).withDocumentClass(BsonDocument.class);
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of GetCollection
|
||||
|
||||
public long GetCollSize() {
|
||||
return (coll != null) ? coll.count() : 0;
|
||||
} // end of GetCollSize
|
||||
|
||||
public boolean FindColl(String query, String fields) {
|
||||
if (DEBUG)
|
||||
System.out.println("FindColl: query=" + query + " fields=" + fields);
|
||||
|
||||
try {
|
||||
if (query != null) {
|
||||
Bson dbq = Document.parse((query != null) ? query : "{}");
|
||||
finditer = coll.find(dbq);
|
||||
} else
|
||||
finditer = coll.find();
|
||||
|
||||
if (fields != null) {
|
||||
Bson dbf = BsonDocument.parse(fields);
|
||||
finditer = finditer.projection(dbf);
|
||||
} // endif fields
|
||||
|
||||
cursor = finditer.iterator();
|
||||
} catch (Exception e) {
|
||||
SetErrmsg(e);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of FindColl
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public boolean AggregateColl(String pipeline) {
|
||||
if (DEBUG)
|
||||
System.out.println("AggregateColl: pipeline=" + pipeline);
|
||||
|
||||
try {
|
||||
Document pipe = Document.parse(pipeline);
|
||||
ArrayList<?> pip = (ArrayList<?>) pipe.get("pipeline");
|
||||
|
||||
aggiter = coll.aggregate((List<? extends Bson>) pip);
|
||||
cursor = aggiter.iterator();
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of AggregateColl
|
||||
|
||||
public boolean Rewind() {
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
|
||||
if (finditer != null)
|
||||
cursor = finditer.iterator();
|
||||
else if (aggiter != null)
|
||||
cursor = aggiter.iterator();
|
||||
|
||||
return (cursor == null);
|
||||
} // end of Rewind
|
||||
|
||||
public int ReadNext() {
|
||||
if (cursor.hasNext()) {
|
||||
doc = cursor.next();
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Class doc = " + doc.getClass());
|
||||
|
||||
Colnames = doc.keySet();
|
||||
return 1;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
} // end of ReadNext
|
||||
|
||||
public boolean Fetch(int row) {
|
||||
if (cursor.hasNext()) {
|
||||
doc = cursor.next();
|
||||
Colnames = doc.keySet();
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
} // end of Fetch
|
||||
|
||||
public String GetDoc() {
|
||||
return (doc != null) ? doc.toJson() : null;
|
||||
} // end of GetDoc
|
||||
|
||||
public Set<String> GetColumns() {
|
||||
if (doc != null)
|
||||
return doc.keySet();
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end of GetColumns
|
||||
|
||||
public String ColumnName(int n) {
|
||||
int i = 1;
|
||||
|
||||
for (String name : Colnames)
|
||||
if (i++ == n)
|
||||
return name;
|
||||
|
||||
return null;
|
||||
} // end of ColumnName
|
||||
|
||||
public int ColumnType(int n, String name) {
|
||||
// if (rsmd == null) {
|
||||
// System.out.println("No result metadata");
|
||||
// } else try {
|
||||
// if (n == 0)
|
||||
// n = rs.findColumn(name);
|
||||
|
||||
// return rsmd.getColumnType(n);
|
||||
// } catch (SQLException se) {
|
||||
// SetErrmsg(se);
|
||||
// } //end try/catch
|
||||
|
||||
return 666; // Not a type
|
||||
} // end of ColumnType
|
||||
|
||||
public String ColumnDesc(int n, int[] val) {
|
||||
// if (rsmd == null) {
|
||||
// System.out.println("No result metadata");
|
||||
// return null;
|
||||
// } else try {
|
||||
// val[0] = rsmd.getColumnType(n);
|
||||
// val[1] = rsmd.getPrecision(n);
|
||||
// val[2] = rsmd.getScale(n);
|
||||
// val[3] = rsmd.isNullable(n);
|
||||
// return rsmd.getColumnLabel(n);
|
||||
// } catch (SQLException se) {
|
||||
// SetErrmsg(se);
|
||||
// } //end try/catch
|
||||
|
||||
return null;
|
||||
} // end of ColumnDesc
|
||||
|
||||
protected BsonValue GetFieldObject(String path) {
|
||||
BsonValue o = doc;
|
||||
BsonDocument dob = null;
|
||||
BsonArray ary = null;
|
||||
String[] names = null;
|
||||
|
||||
if (path == null || path.equals("*"))
|
||||
return doc;
|
||||
else if (o instanceof BsonDocument)
|
||||
dob = doc;
|
||||
else if (o instanceof BsonArray)
|
||||
ary = (BsonArray) o;
|
||||
else
|
||||
return doc;
|
||||
|
||||
try {
|
||||
names = path.split("\\.");
|
||||
|
||||
for (String name : names) {
|
||||
if (ary != null) {
|
||||
o = ary.get(Integer.parseInt(name));
|
||||
} else
|
||||
o = dob.get(name);
|
||||
|
||||
if (o == null)
|
||||
break;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("Class o = " + o.getClass());
|
||||
|
||||
if (o instanceof BsonDocument) {
|
||||
dob = (BsonDocument) o;
|
||||
ary = null;
|
||||
} else if (o instanceof BsonArray) {
|
||||
ary = (BsonArray) o;
|
||||
} else
|
||||
break;
|
||||
|
||||
} // endfor name
|
||||
|
||||
} catch (IndexOutOfBoundsException x) {
|
||||
o = null;
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
o = null;
|
||||
} // end try/catch
|
||||
|
||||
return o;
|
||||
} // end of GetFieldObject
|
||||
|
||||
public String GetField(String path) {
|
||||
BsonValue o = GetFieldObject(path);
|
||||
|
||||
if (o != null) {
|
||||
if (o.isString()) {
|
||||
return o.asString().getValue();
|
||||
} else if (o.isInt32()) {
|
||||
return Integer.toString(o.asInt32().getValue());
|
||||
} else if (o.isInt64()) {
|
||||
return Long.toString(o.asInt64().getValue());
|
||||
} else if (o.isObjectId()) {
|
||||
return o.asObjectId().getValue().toString();
|
||||
} else if (o.isDateTime()) {
|
||||
Integer TS = (int) (o.asDateTime().getValue() / 1000);
|
||||
return TS.toString();
|
||||
} else if (o.isDouble()) {
|
||||
return Double.toString(o.asDouble().getValue());
|
||||
} else if (o.isDocument()) {
|
||||
return o.asDocument().toJson();
|
||||
} else if (o.isArray()) {
|
||||
util = new BsonDocument("arr", o.asArray());
|
||||
String s = util.toJson();
|
||||
int i1 = s.indexOf('[');
|
||||
int i2 = s.lastIndexOf(']');
|
||||
return s.substring(i1, i2 + 1);
|
||||
} else if (o.isNull()) {
|
||||
return null;
|
||||
} else
|
||||
return o.toString();
|
||||
|
||||
} else
|
||||
return null;
|
||||
|
||||
} // end of GetField
|
||||
|
||||
protected BsonValue ObjToBson(Object val) {
|
||||
BsonValue bval = null;
|
||||
|
||||
if (val == null)
|
||||
bval = bsonull;
|
||||
else if (val.getClass() == String.class)
|
||||
bval = new BsonString((String) val);
|
||||
else if (val.getClass() == Integer.class)
|
||||
bval = new BsonInt32((int) val);
|
||||
else if (val.getClass() == Double.class)
|
||||
bval = new BsonDouble((double) val);
|
||||
else if (val.getClass() == BigInteger.class)
|
||||
bval = new BsonInt64((long) val);
|
||||
else if (val.getClass() == Boolean.class)
|
||||
bval = new BsonBoolean((Boolean) val);
|
||||
else if (val.getClass() == Date.class)
|
||||
bval = new BsonDateTime(((Date) val).getTime() * 1000);
|
||||
else if (val.getClass() == BsonDocument.class)
|
||||
bval = (BsonDocument) val;
|
||||
else if (val.getClass() == BsonArray.class)
|
||||
bval = (BsonArray) val;
|
||||
|
||||
return bval;
|
||||
} // end of ObjToBson
|
||||
|
||||
public Object MakeDocument() {
|
||||
return new BsonDocument();
|
||||
} // end of MakeDocument
|
||||
|
||||
public boolean DocAdd(Object bdc, String key, Object val) {
|
||||
try {
|
||||
((BsonDocument) bdc).append(key, ObjToBson(val));
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of DocAdd
|
||||
|
||||
public Object MakeArray() {
|
||||
return new BsonArray();
|
||||
} // end of MakeArray
|
||||
|
||||
public boolean ArrayAdd(Object bar, int n, Object val) {
|
||||
try {
|
||||
for (int i = ((BsonArray) bar).size(); i < n; i++)
|
||||
((BsonArray) bar).add(bsonull);
|
||||
|
||||
((BsonArray) bar).add(ObjToBson(val));
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of ArrayAdd
|
||||
|
||||
public boolean CollInsert(Object dob) {
|
||||
try {
|
||||
coll.insertOne((BsonDocument) dob);
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
return true;
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
return false;
|
||||
} // end of CollInsert
|
||||
|
||||
public long CollUpdate(Object upd) {
|
||||
long n = -1;
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("upd: " + upd.toString());
|
||||
|
||||
try {
|
||||
UpdateResult res = coll.updateOne(Filters.eq("_id", doc.get("_id")), (Bson) upd);
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("CollUpdate: " + res.toString());
|
||||
|
||||
n = res.getModifiedCount();
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
} // end try/catch
|
||||
|
||||
return n;
|
||||
} // end of CollUpdate
|
||||
|
||||
public long CollDelete(boolean all) {
|
||||
long n = -1;
|
||||
|
||||
try {
|
||||
DeleteResult res;
|
||||
|
||||
if (all)
|
||||
res = coll.deleteMany(new Document());
|
||||
else
|
||||
res = coll.deleteOne(Filters.eq("_id", doc.get("_id")));
|
||||
|
||||
if (DEBUG)
|
||||
System.out.println("CollDelete: " + res.toString());
|
||||
|
||||
n = res.getDeletedCount();
|
||||
} catch (MongoException me) {
|
||||
SetErrmsg(me);
|
||||
} catch (Exception ex) {
|
||||
SetErrmsg(ex);
|
||||
} // end try/catch
|
||||
|
||||
return n;
|
||||
} // end of CollDelete
|
||||
|
||||
} // end of class MongoInterface
|
||||
|
|
@ -975,7 +975,7 @@ int ARRAY::BlockTest(PGLOBAL, int opc, int opm,
|
|||
PSZ ARRAY::MakeArrayList(PGLOBAL g)
|
||||
{
|
||||
char *p, *tp;
|
||||
int i;
|
||||
int i;
|
||||
size_t z, len = 2;
|
||||
|
||||
if (Type == TYPE_LIST)
|
||||
|
|
|
|||
271
storage/connect/cmgfam.cpp
Normal file
271
storage/connect/cmgfam.cpp
Normal file
|
|
@ -0,0 +1,271 @@
|
|||
/************** CMGFAM C++ Program Source Code File (.CPP) *************/
|
||||
/* PROGRAM NAME: cmgfam.cpp */
|
||||
/* ------------- */
|
||||
/* Version 1.4 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 20017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
/* This program are the MongoDB access method classes. */
|
||||
/* */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant sections of the System header files. */
|
||||
/***********************************************************************/
|
||||
#include "my_global.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include application header files: */
|
||||
/* global.h is header containing all global declarations. */
|
||||
/* plgdbsem.h is header containing the DB application declarations. */
|
||||
/* filamtxt.h is header containing the file AM classes declarations. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "reldef.h"
|
||||
#include "filamtxt.h"
|
||||
#include "tabdos.h"
|
||||
#include "tabjson.h"
|
||||
#include "cmgfam.h"
|
||||
|
||||
#if defined(UNIX) || defined(UNIV_LINUX)
|
||||
#include "osutil.h"
|
||||
#endif
|
||||
|
||||
/* --------------------------- Class CMGFAM -------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constructors. */
|
||||
/***********************************************************************/
|
||||
CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
|
||||
{
|
||||
Cmgp = NULL;
|
||||
Pcg.Tdbp = NULL;
|
||||
|
||||
if (tdp) {
|
||||
Pcg.Uristr = tdp->Uri;
|
||||
Pcg.Db_name = tdp->Schema;
|
||||
Pcg.Coll_name = tdp->Collname;
|
||||
Pcg.Options = tdp->Options;
|
||||
Pcg.Filter = tdp->Filter;
|
||||
Pcg.Pipe = tdp->Pipe && tdp->Options != NULL;
|
||||
} else {
|
||||
Pcg.Uristr = NULL;
|
||||
Pcg.Db_name = NULL;
|
||||
Pcg.Coll_name = NULL;
|
||||
Pcg.Options = NULL;
|
||||
Pcg.Filter = NULL;
|
||||
Pcg.Pipe = false;
|
||||
} // endif tdp
|
||||
|
||||
To_Fbt = NULL;
|
||||
Mode = MODE_ANY;
|
||||
Done = false;
|
||||
Lrecl = tdp->Lrecl + tdp->Ending;
|
||||
} // end of CMGFAM standard constructor
|
||||
|
||||
CMGFAM::CMGFAM(PCMGFAM tdfp) : DOSFAM(tdfp)
|
||||
{
|
||||
Pcg = tdfp->Pcg;
|
||||
To_Fbt = tdfp->To_Fbt;
|
||||
Mode = tdfp->Mode;
|
||||
Done = tdfp->Done;
|
||||
} // end of CMGFAM copy constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Reset: reset position values at the beginning of file. */
|
||||
/***********************************************************************/
|
||||
void CMGFAM::Reset(void)
|
||||
{
|
||||
TXTFAM::Reset();
|
||||
Fpos = Tpos = Spos = 0;
|
||||
} // end of Reset
|
||||
|
||||
/***********************************************************************/
|
||||
/* MGO GetFileLength: returns file size in number of bytes. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::GetFileLength(PGLOBAL g)
|
||||
{
|
||||
return 0;
|
||||
} // end of GetFileLength
|
||||
|
||||
/***********************************************************************/
|
||||
/* Cardinality: returns the number of documents in the collection. */
|
||||
/* This function can be called with a null argument to test the */
|
||||
/* availability of Cardinality implementation (1 yes, 0 no). */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::Cardinality(PGLOBAL g)
|
||||
{
|
||||
if (!g)
|
||||
return 1;
|
||||
|
||||
return (!Init(g)) ? Cmgp->CollSize(g) : 0;
|
||||
} // end of Cardinality
|
||||
|
||||
/***********************************************************************/
|
||||
/* Note: This function is not really implemented yet. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::MaxBlkSize(PGLOBAL, int s)
|
||||
{
|
||||
return s;
|
||||
} // end of MaxBlkSize
|
||||
|
||||
/***********************************************************************/
|
||||
/* Init: initialize MongoDB processing. */
|
||||
/***********************************************************************/
|
||||
bool CMGFAM::Init(PGLOBAL g)
|
||||
{
|
||||
if (Done)
|
||||
return false;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Open an C connection for this table. */
|
||||
/*********************************************************************/
|
||||
if (!Cmgp) {
|
||||
Pcg.Tdbp = Tdbp;
|
||||
Cmgp = new(g) CMgoConn(g, &Pcg);
|
||||
} else if (Cmgp->IsConnected())
|
||||
Cmgp->Close();
|
||||
|
||||
if (Cmgp->Connect(g))
|
||||
return true;
|
||||
|
||||
Done = true;
|
||||
return false;
|
||||
} // end of Init
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a MongoDB table. */
|
||||
/***********************************************************************/
|
||||
bool CMGFAM::OpenTableFile(PGLOBAL g)
|
||||
{
|
||||
Mode = Tdbp->GetMode();
|
||||
|
||||
if (Pcg.Pipe && Mode != MODE_READ) {
|
||||
strcpy(g->Message, "Pipeline tables are read only");
|
||||
return true;
|
||||
} // endif Pipe
|
||||
|
||||
if (Init(g))
|
||||
return true;
|
||||
|
||||
if (Mode == MODE_DELETE && !Tdbp->GetNext())
|
||||
// Delete all documents
|
||||
return Cmgp->DocDelete(g);
|
||||
else if (Mode == MODE_INSERT)
|
||||
Cmgp->MakeColumnGroups(g);
|
||||
|
||||
return false;
|
||||
} // end of OpenTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetRowID: return the RowID of last read record. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::GetRowID(void)
|
||||
{
|
||||
return Rows;
|
||||
} // end of GetRowID
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetPos: return the position of last read record. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::GetPos(void)
|
||||
{
|
||||
return Fpos;
|
||||
} // end of GetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetNextPos: return the position of next record. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::GetNextPos(void)
|
||||
{
|
||||
return Fpos; // TODO
|
||||
} // end of GetNextPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* SetPos: Replace the table at the specified position. */
|
||||
/***********************************************************************/
|
||||
bool CMGFAM::SetPos(PGLOBAL g, int pos)
|
||||
{
|
||||
Fpos = pos;
|
||||
Placed = true;
|
||||
return false;
|
||||
} // end of SetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Record file position in case of UPDATE or DELETE. */
|
||||
/***********************************************************************/
|
||||
bool CMGFAM::RecordPos(PGLOBAL g)
|
||||
{
|
||||
strcpy(g->Message, "CMGFAM::RecordPos NIY");
|
||||
return true;
|
||||
} // end of RecordPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Initialize Fpos and the current position for indexed DELETE. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::InitDelete(PGLOBAL g, int fpos, int spos)
|
||||
{
|
||||
strcpy(g->Message, "CMGFAM::InitDelete NIY");
|
||||
return RC_FX;
|
||||
} // end of InitDelete
|
||||
|
||||
/***********************************************************************/
|
||||
/* Skip one record in file. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::SkipRecord(PGLOBAL g, bool header)
|
||||
{
|
||||
return RC_OK; // Dummy
|
||||
} // end of SkipRecord
|
||||
|
||||
/***********************************************************************/
|
||||
/* ReadBuffer: Get next document from a collection. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::ReadBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc = Cmgp->ReadNext(g);
|
||||
|
||||
if (rc != RC_OK)
|
||||
return rc;
|
||||
|
||||
strncpy(Tdbp->GetLine(), Cmgp->GetDocument(g), Lrecl);
|
||||
return RC_OK;
|
||||
} // end of ReadBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteBuffer: File write routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::WriteBuffer(PGLOBAL g)
|
||||
{
|
||||
return Cmgp->Write(g);
|
||||
} // end of WriteBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* Data Base delete line routine for MGO and BLK access methods. */
|
||||
/***********************************************************************/
|
||||
int CMGFAM::DeleteRecords(PGLOBAL g, int irc)
|
||||
{
|
||||
return (irc == RC_OK) ? WriteBuffer(g) : RC_OK;
|
||||
} // end of DeleteRecords
|
||||
|
||||
/***********************************************************************/
|
||||
/* Table file close routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void CMGFAM::CloseTableFile(PGLOBAL g, bool)
|
||||
{
|
||||
Cmgp->Close();
|
||||
Done = false;
|
||||
} // end of CloseTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* Rewind routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void CMGFAM::Rewind(void)
|
||||
{
|
||||
Cmgp->Rewind();
|
||||
} // end of Rewind
|
||||
|
||||
65
storage/connect/cmgfam.h
Normal file
65
storage/connect/cmgfam.h
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*************** CMGFam H Declares Source Code File (.H) ***************/
|
||||
/* Name: cmgfam.h Version 1.5 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the MongoDB access method classes declares. */
|
||||
/***********************************************************************/
|
||||
#include "cmgoconn.h"
|
||||
|
||||
typedef class TXTFAM *PTXF;
|
||||
typedef class CMGFAM *PCMGFAM;
|
||||
typedef class MGODEF *PMGODEF;
|
||||
typedef class TDBCMG *PTDBCMG;
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the MongoDB Access Method class declaration. */
|
||||
/***********************************************************************/
|
||||
class DllExport CMGFAM : public DOSFAM {
|
||||
friend void mongo_init(bool);
|
||||
public:
|
||||
// Constructor
|
||||
CMGFAM(PJDEF tdp);
|
||||
CMGFAM(PCMGFAM txfp);
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) { return TYPE_AM_MGO; }
|
||||
virtual bool GetUseTemp(void) { return false; }
|
||||
virtual int GetPos(void);
|
||||
virtual int GetNextPos(void);
|
||||
void SetTdbp(PTDBDOS tdbp) { Tdbp = tdbp; }
|
||||
virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) CMGFAM(this); }
|
||||
void SetLrecl(int lrecl) { Lrecl = lrecl; }
|
||||
|
||||
// Methods
|
||||
virtual void Reset(void);
|
||||
virtual int GetFileLength(PGLOBAL g);
|
||||
virtual int Cardinality(PGLOBAL g);
|
||||
virtual int MaxBlkSize(PGLOBAL g, int s);
|
||||
virtual bool AllocateBuffer(PGLOBAL g) { return false; }
|
||||
virtual int GetRowID(void);
|
||||
virtual bool RecordPos(PGLOBAL g);
|
||||
virtual bool SetPos(PGLOBAL g, int recpos);
|
||||
virtual int SkipRecord(PGLOBAL g, bool header);
|
||||
virtual bool OpenTableFile(PGLOBAL g);
|
||||
virtual int ReadBuffer(PGLOBAL g);
|
||||
virtual int WriteBuffer(PGLOBAL g);
|
||||
virtual int DeleteRecords(PGLOBAL g, int irc);
|
||||
virtual void CloseTableFile(PGLOBAL g, bool abort);
|
||||
virtual void Rewind(void);
|
||||
|
||||
protected:
|
||||
virtual bool OpenTempFile(PGLOBAL g) { return false; }
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; }
|
||||
virtual int RenameTempFile(PGLOBAL g) { return RC_OK; }
|
||||
virtual int InitDelete(PGLOBAL g, int fpos, int spos);
|
||||
bool Init(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
CMgoConn *Cmgp; // Points to a C Mongo connection class
|
||||
CMGOPARM Pcg; // Parms passed to Cmgp
|
||||
PFBLOCK To_Fbt; // Pointer to temp file block
|
||||
MODE Mode;
|
||||
bool Done; // Init done
|
||||
}; // end of class CMGFAM
|
||||
|
||||
935
storage/connect/cmgoconn.cpp
Normal file
935
storage/connect/cmgoconn.cpp
Normal file
|
|
@ -0,0 +1,935 @@
|
|||
/************ CMgoConn C++ Functions Source Code File (.CPP) ***********/
|
||||
/* Name: CMgoConn.CPP Version 1.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the MongoDB C connection classes functions. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant MariaDB header file. */
|
||||
/***********************************************************************/
|
||||
#include <my_global.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Required objects includes. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "colblk.h"
|
||||
#include "xobject.h"
|
||||
#include "xtable.h"
|
||||
#include "filter.h"
|
||||
#include "cmgoconn.h"
|
||||
|
||||
bool IsNum(PSZ s);
|
||||
|
||||
// Required to initialize libmongoc's internals
|
||||
void mongo_init(bool init)
|
||||
{
|
||||
if (init)
|
||||
mongoc_init();
|
||||
else
|
||||
mongoc_cleanup();
|
||||
|
||||
} // end of mongo_init
|
||||
|
||||
/* --------------------------- Class INCOL --------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Add a column in the column list. */
|
||||
/***********************************************************************/
|
||||
void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp)
|
||||
{
|
||||
char *p;
|
||||
PKC kp, kcp;
|
||||
|
||||
if ((p = strchr(jp, '.'))) {
|
||||
PINCOL icp;
|
||||
|
||||
*p++ = 0;
|
||||
|
||||
for (kp = Klist; kp; kp = kp->Next)
|
||||
if (kp->Incolp && !strcmp(jp, kp->Key))
|
||||
break;
|
||||
|
||||
if (!kp) {
|
||||
icp = new(g) INCOL(IsNum(p));
|
||||
kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL));
|
||||
kcp->Next = NULL;
|
||||
kcp->Incolp = icp;
|
||||
kcp->Colp = NULL;
|
||||
kcp->Key = PlugDup(g, jp);
|
||||
|
||||
if (Klist) {
|
||||
for (kp = Klist; kp->Next; kp = kp->Next);
|
||||
|
||||
kp->Next = kcp;
|
||||
} else
|
||||
Klist = kcp;
|
||||
|
||||
} else
|
||||
icp = kp->Incolp;
|
||||
|
||||
*(p - 1) = '.';
|
||||
icp->AddCol(g, colp, p);
|
||||
} else {
|
||||
kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL));
|
||||
|
||||
kcp->Next = NULL;
|
||||
kcp->Incolp = NULL;
|
||||
kcp->Colp = colp;
|
||||
kcp->Key = jp;
|
||||
|
||||
if (Klist) {
|
||||
for (kp = Klist; kp->Next; kp = kp->Next);
|
||||
|
||||
kp->Next = kcp;
|
||||
} else
|
||||
Klist = kcp;
|
||||
|
||||
} // endif jp
|
||||
|
||||
} // end of AddCol
|
||||
|
||||
/***********************************************************************/
|
||||
/* Clear. */
|
||||
/***********************************************************************/
|
||||
void INCOL::Init(void)
|
||||
{
|
||||
bson_init(Child);
|
||||
|
||||
for (PKC kp = Klist; kp; kp = kp->Next)
|
||||
if (kp->Incolp)
|
||||
kp->Incolp->Init();
|
||||
|
||||
} // end of init
|
||||
|
||||
/***********************************************************************/
|
||||
/* Destroy. */
|
||||
/***********************************************************************/
|
||||
void INCOL::Destroy(void)
|
||||
{
|
||||
bson_destroy(Child);
|
||||
|
||||
for (PKC kp = Klist; kp; kp = kp->Next)
|
||||
if (kp->Incolp)
|
||||
kp->Incolp->Destroy();
|
||||
|
||||
} // end of Destroy
|
||||
|
||||
/* -------------------------- Class CMgoConn ------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Implementation of the CMgoConn class. */
|
||||
/***********************************************************************/
|
||||
CMgoConn::CMgoConn(PGLOBAL g, PCPARM pcg)
|
||||
{
|
||||
Pcg = pcg;
|
||||
Uri = NULL;
|
||||
Pool = NULL;
|
||||
Client = NULL;
|
||||
Database = NULL;
|
||||
Collection = NULL;
|
||||
Cursor = NULL;
|
||||
Query = NULL;
|
||||
Opts = NULL;
|
||||
Fpc = NULL;
|
||||
fp = NULL;
|
||||
m_Connected = false;
|
||||
} // end of CMgoConn standard constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Connect to the MongoDB server and get the collection. */
|
||||
/***********************************************************************/
|
||||
bool CMgoConn::Connect(PGLOBAL g)
|
||||
{
|
||||
Uri = mongoc_uri_new(Pcg->Uristr);
|
||||
|
||||
if (!Uri) {
|
||||
sprintf(g->Message, "Failed to parse URI: \"%s\"", Pcg->Uristr);
|
||||
return true;
|
||||
} // endif Uri
|
||||
|
||||
// Create a new client pool instance
|
||||
Pool = mongoc_client_pool_new(Uri);
|
||||
mongoc_client_pool_set_error_api(Pool, 2);
|
||||
|
||||
// Register the application name so we can track it in the profile logs
|
||||
// on the server. This can also be done from the URI.
|
||||
mongoc_client_pool_set_appname(Pool, "Connect");
|
||||
|
||||
// Create a new client instance
|
||||
Client = mongoc_client_pool_pop(Pool);
|
||||
|
||||
if (!Client) {
|
||||
sprintf(g->Message, "Failed to get Client");
|
||||
return true;
|
||||
} // endif Client
|
||||
|
||||
// Get a handle on the collection Coll_name
|
||||
Collection = mongoc_client_get_collection(Client, Pcg->Db_name, Pcg->Coll_name);
|
||||
|
||||
if (!Collection) {
|
||||
sprintf(g->Message, "Failed to get Collection %s.%s",
|
||||
Pcg->Db_name, Pcg->Coll_name);
|
||||
return true;
|
||||
} // endif Collection
|
||||
|
||||
/*********************************************************************/
|
||||
/* Link a Fblock. This make possible to automatically close it */
|
||||
/* in case of error (throw). */
|
||||
/*********************************************************************/
|
||||
PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr;
|
||||
|
||||
fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK));
|
||||
fp->Type = TYPE_FB_MONGO;
|
||||
fp->Fname = NULL;
|
||||
fp->Next = dbuserp->Openlist;
|
||||
dbuserp->Openlist = fp;
|
||||
fp->Count = 1;
|
||||
fp->Length = 0;
|
||||
fp->Memory = NULL;
|
||||
fp->Mode = MODE_ANY;
|
||||
fp->File = this;
|
||||
fp->Handle = 0;
|
||||
|
||||
m_Connected = true;
|
||||
return false;
|
||||
} // end of Connect
|
||||
|
||||
/***********************************************************************/
|
||||
/* CollSize: returns the number of documents in the collection. */
|
||||
/***********************************************************************/
|
||||
int CMgoConn::CollSize(PGLOBAL g)
|
||||
{
|
||||
int cnt;
|
||||
bson_t *query;
|
||||
const char *jf = NULL;
|
||||
|
||||
if (Pcg->Pipe)
|
||||
return 10;
|
||||
else if (Pcg->Filter)
|
||||
jf = Pcg->Filter;
|
||||
|
||||
if (jf) {
|
||||
query = bson_new_from_json((const uint8_t *)jf, -1, &Error);
|
||||
|
||||
if (!query) {
|
||||
htrc("Wrong filter: %s", Error.message);
|
||||
return 10;
|
||||
} // endif Query
|
||||
|
||||
} else
|
||||
query = bson_new();
|
||||
|
||||
cnt = (int)mongoc_collection_count(Collection,
|
||||
MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error);
|
||||
|
||||
if (cnt < 0) {
|
||||
htrc("Collection count: %s", Error.message);
|
||||
cnt = 2;
|
||||
} // endif Cardinal
|
||||
|
||||
bson_destroy(query);
|
||||
return cnt;
|
||||
} // end of CollSize
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenDB: Data Base open routine for MONGO access method. */
|
||||
/***********************************************************************/
|
||||
bool CMgoConn::MakeCursor(PGLOBAL g)
|
||||
{
|
||||
const char *p;
|
||||
bool id, b = false, all = false;
|
||||
PCSZ options = Pcg->Options;
|
||||
PTDB tp = Pcg->Tdbp;
|
||||
PCOL cp;
|
||||
PSTRG s = NULL;
|
||||
|
||||
id = (tp->GetMode() != MODE_READ);
|
||||
|
||||
if (options && !stricmp(options, "all")) {
|
||||
options = NULL;
|
||||
all = true;
|
||||
} // endif Options
|
||||
|
||||
for (cp = tp->GetColumns(); cp; cp = cp->GetNext())
|
||||
if (!strcmp(cp->GetName(), "_id"))
|
||||
id = true;
|
||||
else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options)
|
||||
all = true;
|
||||
|
||||
if (Pcg->Pipe) {
|
||||
if (trace)
|
||||
htrc("Pipeline: %s\n", options);
|
||||
|
||||
p = strrchr(options, ']');
|
||||
|
||||
if (!p) {
|
||||
strcpy(g->Message, "Missing ] in pipeline");
|
||||
return true;
|
||||
} else
|
||||
*(char*)p = 0;
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)options);
|
||||
|
||||
if (tp->GetFilter()) {
|
||||
s->Append(",{\"$match\":");
|
||||
|
||||
if (tp->GetFilter()->MakeSelector(g, s)) {
|
||||
strcpy(g->Message, "Failed making selector");
|
||||
return true;
|
||||
} else
|
||||
s->Append('}');
|
||||
|
||||
tp->SetFilter(NULL); // Not needed anymore
|
||||
} // endif To_Filter
|
||||
|
||||
if (!all && tp->GetColumns()) {
|
||||
// Project list
|
||||
s->Append(",{\"$project\":{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
s->Append(cp->GetJpath(g, true));
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
s->Append("}}");
|
||||
} // endif all
|
||||
|
||||
s->Append("]}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
*(char*)p = ']'; // Restore Colist for discovery
|
||||
p = s->GetStr();
|
||||
|
||||
if (trace)
|
||||
htrc("New Pipeline: %s\n", p);
|
||||
|
||||
Query = bson_new_from_json((const uint8_t *)p, -1, &Error);
|
||||
|
||||
if (!Query) {
|
||||
sprintf(g->Message, "Wrong pipeline: %s", Error.message);
|
||||
return true;
|
||||
} // endif Query
|
||||
|
||||
Cursor = mongoc_collection_aggregate(Collection, MONGOC_QUERY_NONE,
|
||||
Query, NULL, NULL);
|
||||
|
||||
if (mongoc_cursor_error(Cursor, &Error)) {
|
||||
sprintf(g->Message, "Mongo aggregate Failure: %s", Error.message);
|
||||
return true;
|
||||
} // endif error
|
||||
|
||||
} else {
|
||||
if (Pcg->Filter || tp->GetFilter()) {
|
||||
if (trace) {
|
||||
if (Pcg->Filter)
|
||||
htrc("Filter: %s\n", Pcg->Filter);
|
||||
|
||||
if (tp->GetFilter()) {
|
||||
char buf[512];
|
||||
|
||||
tp->GetFilter()->Prints(g, buf, 511);
|
||||
htrc("To_Filter: %s\n", buf);
|
||||
} // endif To_Filter
|
||||
|
||||
} // endif trace
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)Pcg->Filter);
|
||||
|
||||
if (tp->GetFilter()) {
|
||||
if (Pcg->Filter)
|
||||
s->Append(',');
|
||||
|
||||
if (tp->GetFilter()->MakeSelector(g, s)) {
|
||||
strcpy(g->Message, "Failed making selector");
|
||||
return NULL;
|
||||
} // endif Selector
|
||||
|
||||
tp->SetFilter(NULL); // Not needed anymore
|
||||
} // endif To_Filter
|
||||
|
||||
if (trace)
|
||||
htrc("selector: %s\n", s->GetStr());
|
||||
|
||||
s->Resize(s->GetLength() + 1);
|
||||
Query = bson_new_from_json((const uint8_t *)s->GetStr(), -1, &Error);
|
||||
|
||||
if (!Query) {
|
||||
sprintf(g->Message, "Wrong filter: %s", Error.message);
|
||||
return NULL;
|
||||
} // endif Query
|
||||
|
||||
} else
|
||||
Query = bson_new();
|
||||
|
||||
if (!all) {
|
||||
if (options && *options) {
|
||||
if (trace)
|
||||
htrc("options=%s\n", options);
|
||||
|
||||
p = options;
|
||||
} else if (tp->GetColumns()) {
|
||||
// Projection list
|
||||
if (s)
|
||||
s->Set("{\"projection\":{\"");
|
||||
else
|
||||
s = new(g) STRING(g, 511, "{\"projection\":{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
s->Append(cp->GetJpath(g, true));
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
s->Append("}}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
p = s->GetStr();
|
||||
} else {
|
||||
// count(*) ?
|
||||
p = "{\"projection\":{\"_id\":1}}";
|
||||
} // endif Options
|
||||
|
||||
Opts = bson_new_from_json((const uint8_t *)p, -1, &Error);
|
||||
|
||||
if (!Opts) {
|
||||
sprintf(g->Message, "Wrong options: %s", Error.message);
|
||||
return NULL;
|
||||
} // endif Opts
|
||||
|
||||
} // endif all
|
||||
|
||||
Cursor = mongoc_collection_find_with_opts(Collection, Query, Opts, NULL);
|
||||
} // endif Pipe
|
||||
|
||||
return false;
|
||||
} // end of MakeCursor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Fetch next document. */
|
||||
/***********************************************************************/
|
||||
int CMgoConn::ReadNext(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
|
||||
if (!Cursor && MakeCursor(g)) {
|
||||
rc = RC_FX;
|
||||
} else if (mongoc_cursor_next(Cursor, &Document)) {
|
||||
if (trace > 1) {
|
||||
bson_iter_t iter;
|
||||
ShowDocument(&iter, Document, "");
|
||||
} else if (trace == 1)
|
||||
htrc("%s\n", GetDocument(g));
|
||||
|
||||
} else if (mongoc_cursor_error(Cursor, &Error)) {
|
||||
sprintf(g->Message, "Mongo Cursor Failure: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} else
|
||||
rc = RC_EF;
|
||||
|
||||
return rc;
|
||||
} // end of Fetch
|
||||
|
||||
/***********************************************************************/
|
||||
/* Get the Json string of the current document. */
|
||||
/***********************************************************************/
|
||||
PSZ CMgoConn::GetDocument(PGLOBAL g)
|
||||
{
|
||||
char *str = bson_as_json(Document, NULL);
|
||||
PSZ doc = PlugDup(g, str);
|
||||
|
||||
bson_free(str);
|
||||
return doc;
|
||||
} // end of GetDocument
|
||||
|
||||
/***********************************************************************/
|
||||
/* Use to trace restaurants document contains. */
|
||||
/***********************************************************************/
|
||||
void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k)
|
||||
{
|
||||
if (!doc || bson_iter_init(iter, doc)) {
|
||||
const char *key;
|
||||
|
||||
while (bson_iter_next(iter)) {
|
||||
key = bson_iter_key(iter);
|
||||
htrc("Found element key: \"%s\"\n", key);
|
||||
|
||||
if (BSON_ITER_HOLDS_UTF8(iter))
|
||||
htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL));
|
||||
else if (BSON_ITER_HOLDS_INT32(iter))
|
||||
htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter));
|
||||
else if (BSON_ITER_HOLDS_INT64(iter))
|
||||
htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter));
|
||||
else if (BSON_ITER_HOLDS_DOUBLE(iter))
|
||||
htrc("%s.%s=%g\n", k, key, bson_iter_double(iter));
|
||||
else if (BSON_ITER_HOLDS_DATE_TIME(iter))
|
||||
htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter));
|
||||
else if (BSON_ITER_HOLDS_OID(iter)) {
|
||||
char str[25];
|
||||
|
||||
bson_oid_to_string(bson_iter_oid(iter), str);
|
||||
htrc("%s.%s=%s\n", k, key, str);
|
||||
} else if (BSON_ITER_HOLDS_DECIMAL128(iter)) {
|
||||
char *str = NULL;
|
||||
bson_decimal128_t dec;
|
||||
|
||||
bson_iter_decimal128(iter, &dec);
|
||||
bson_decimal128_to_string(&dec, str);
|
||||
htrc("%s.%s=%s\n", k, key, str);
|
||||
} else if (BSON_ITER_HOLDS_DOCUMENT(iter)) {
|
||||
bson_iter_t child;
|
||||
|
||||
if (bson_iter_recurse(iter, &child))
|
||||
ShowDocument(&child, NULL, key);
|
||||
|
||||
} else if (BSON_ITER_HOLDS_ARRAY(iter)) {
|
||||
bson_t *arr;
|
||||
bson_iter_t itar;
|
||||
const uint8_t *data = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
bson_iter_array(iter, &len, &data);
|
||||
arr = bson_new_from_data(data, len);
|
||||
ShowDocument(&itar, arr, key);
|
||||
} // endif's
|
||||
|
||||
} // endwhile bson_iter_next
|
||||
|
||||
} // endif bson_iter_init
|
||||
|
||||
} // end of ShowDocument
|
||||
|
||||
/***********************************************************************/
|
||||
/* Group columns for inserting or updating. */
|
||||
/***********************************************************************/
|
||||
void CMgoConn::MakeColumnGroups(PGLOBAL g)
|
||||
{
|
||||
Fpc = new(g) INCOL(false);
|
||||
|
||||
for (PCOL colp = Pcg->Tdbp->GetColumns(); colp; colp = colp->GetNext())
|
||||
if (!colp->IsSpecial())
|
||||
Fpc->AddCol(g, colp, colp->GetJpath(g, false));
|
||||
|
||||
} // end of MakeColumnGroups
|
||||
|
||||
/***********************************************************************/
|
||||
/* DocWrite. */
|
||||
/***********************************************************************/
|
||||
bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp)
|
||||
{
|
||||
for (PKC kp = icp->Klist; kp; kp = kp->Next)
|
||||
if (kp->Incolp) {
|
||||
bool isdoc = !kp->Incolp->Array;
|
||||
|
||||
if (isdoc)
|
||||
BSON_APPEND_DOCUMENT_BEGIN(icp->Child, kp->Key, kp->Incolp->Child);
|
||||
else
|
||||
BSON_APPEND_ARRAY_BEGIN(icp->Child, kp->Key, kp->Incolp->Child);
|
||||
|
||||
if (DocWrite(g, kp->Incolp))
|
||||
return true;
|
||||
|
||||
if (isdoc)
|
||||
bson_append_document_end(icp->Child, kp->Incolp->Child);
|
||||
else
|
||||
bson_append_array_end(icp->Child, kp->Incolp->Child);
|
||||
|
||||
} else if (AddValue(g, kp->Colp, icp->Child, kp->Key, false))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
} // end of DocWrite
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteDB: Data Base write routine for DOS access method. */
|
||||
/***********************************************************************/
|
||||
int CMgoConn::Write(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
PTDB tp = Pcg->Tdbp;
|
||||
|
||||
if (tp->GetMode() == MODE_INSERT) {
|
||||
Fpc->Init();
|
||||
|
||||
if (DocWrite(g, Fpc))
|
||||
return RC_FX;
|
||||
|
||||
if (trace) {
|
||||
char *str = bson_as_json(Fpc->Child, NULL);
|
||||
htrc("Inserting: %s\n", str);
|
||||
bson_free(str);
|
||||
} // endif trace
|
||||
|
||||
if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE,
|
||||
Fpc->Child, NULL, &Error)) {
|
||||
sprintf(g->Message, "Mongo insert: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} // endif insert
|
||||
|
||||
} else {
|
||||
bool b = false;
|
||||
bson_iter_t iter;
|
||||
bson_t *query = bson_new();
|
||||
|
||||
bson_iter_init(&iter, Document);
|
||||
|
||||
if (bson_iter_find(&iter, "_id")) {
|
||||
if (BSON_ITER_HOLDS_OID(&iter))
|
||||
b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter));
|
||||
else if (BSON_ITER_HOLDS_INT32(&iter))
|
||||
b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter));
|
||||
else if (BSON_ITER_HOLDS_INT64(&iter))
|
||||
b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter));
|
||||
else if (BSON_ITER_HOLDS_DOUBLE(&iter))
|
||||
b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter));
|
||||
else if (BSON_ITER_HOLDS_UTF8(&iter))
|
||||
b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL));
|
||||
|
||||
} // endif iter
|
||||
|
||||
if (b) {
|
||||
if (trace) {
|
||||
char *str = bson_as_json(query, NULL);
|
||||
htrc("update query: %s\n", str);
|
||||
bson_free(str);
|
||||
} // endif trace
|
||||
|
||||
if (tp->GetMode() == MODE_UPDATE) {
|
||||
bson_t child;
|
||||
bson_t *update = bson_new();
|
||||
|
||||
BSON_APPEND_DOCUMENT_BEGIN(update, "$set", &child);
|
||||
|
||||
for (PCOL colp = tp->GetSetCols(); colp; colp = colp->GetNext())
|
||||
if (AddValue(g, colp, &child, colp->GetJpath(g, false), true))
|
||||
rc = RC_FX;
|
||||
|
||||
bson_append_document_end(update, &child);
|
||||
|
||||
if (rc == RC_OK)
|
||||
if (!mongoc_collection_update(Collection, MONGOC_UPDATE_NONE,
|
||||
query, update, NULL, &Error)) {
|
||||
sprintf(g->Message, "Mongo update: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} // endif update
|
||||
|
||||
bson_destroy(update);
|
||||
} else if (!mongoc_collection_remove(Collection,
|
||||
MONGOC_REMOVE_SINGLE_REMOVE, query, NULL, &Error)) {
|
||||
sprintf(g->Message, "Mongo delete: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} // endif remove
|
||||
|
||||
} else {
|
||||
strcpy(g->Message, "Mongo update: cannot find _id");
|
||||
rc = RC_FX;
|
||||
} // endif b
|
||||
|
||||
bson_destroy(query);
|
||||
} // endif Mode
|
||||
|
||||
return rc;
|
||||
} // end of Write
|
||||
|
||||
/***********************************************************************/
|
||||
/* Remove all documents from the collection. */
|
||||
/***********************************************************************/
|
||||
bool CMgoConn::DocDelete(PGLOBAL g)
|
||||
{
|
||||
Query = bson_new();
|
||||
|
||||
if (!mongoc_collection_remove(Collection, MONGOC_REMOVE_NONE,
|
||||
Query, NULL, &Error)) {
|
||||
sprintf(g->Message, "Mongo remove all: %s", Error.message);
|
||||
return true;
|
||||
} // endif remove
|
||||
|
||||
return false;
|
||||
} // end of DocDelete
|
||||
|
||||
/***********************************************************************/
|
||||
/* Rewind the collection. */
|
||||
/***********************************************************************/
|
||||
void CMgoConn::Rewind(void)
|
||||
{
|
||||
mongoc_cursor_t *cursor = mongoc_cursor_clone(Cursor);
|
||||
|
||||
mongoc_cursor_destroy(Cursor);
|
||||
Cursor = cursor;
|
||||
} // end of Rewind
|
||||
|
||||
/***********************************************************************/
|
||||
/* Table close routine for MONGO tables. */
|
||||
/***********************************************************************/
|
||||
void CMgoConn::Close(void)
|
||||
{
|
||||
if (Query) bson_destroy(Query);
|
||||
if (Opts) bson_destroy(Opts);
|
||||
if (Cursor) mongoc_cursor_destroy(Cursor);
|
||||
if (Collection) mongoc_collection_destroy(Collection);
|
||||
if (Client) mongoc_client_pool_push(Pool, Client);
|
||||
if (Pool) mongoc_client_pool_destroy(Pool);
|
||||
if (Uri) mongoc_uri_destroy(Uri);
|
||||
if (Fpc) Fpc->Destroy();
|
||||
if (fp) fp->Count = 0;
|
||||
} // end of Close
|
||||
|
||||
/***********************************************************************/
|
||||
/* Mini: used to suppress blanks to json strings. */
|
||||
/***********************************************************************/
|
||||
char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b)
|
||||
{
|
||||
char *s, *str = NULL;
|
||||
char *Mbuf = (char*)PlugSubAlloc(g, NULL, colp->GetLength() + 1);
|
||||
int i, k = 0;
|
||||
bool ok = true;
|
||||
|
||||
if (b)
|
||||
s = str = bson_array_as_json(bson, NULL);
|
||||
else
|
||||
s = str = bson_as_json(bson, NULL);
|
||||
|
||||
for (i = 0; i < colp->GetLength() && s[i]; i++) {
|
||||
switch (s[i]) {
|
||||
case ' ':
|
||||
if (ok) continue;
|
||||
case '"':
|
||||
ok = !ok;
|
||||
default:
|
||||
break;
|
||||
} // endswitch s[i]
|
||||
|
||||
Mbuf[k++] = s[i];
|
||||
} // endfor i
|
||||
|
||||
bson_free(str);
|
||||
|
||||
if (i >= colp->GetLength()) {
|
||||
sprintf(g->Message, "Value too long for column %s", colp->GetName());
|
||||
throw (int)TYPE_AM_MGO;
|
||||
} // endif i
|
||||
|
||||
Mbuf[k] = 0;
|
||||
return Mbuf;
|
||||
} // end of Mini
|
||||
|
||||
/***********************************************************************/
|
||||
/* Retrieve the column value from the document. */
|
||||
/***********************************************************************/
|
||||
void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp)
|
||||
{
|
||||
char *jpath = colp->GetJpath(g, false);
|
||||
PVAL value = colp->GetValue();
|
||||
|
||||
if (!strcmp(jpath, "*")) {
|
||||
value->SetValue_psz(Mini(g, colp, Document, false));
|
||||
} else if (bson_iter_init(&Iter, Document) &&
|
||||
bson_iter_find_descendant(&Iter, jpath, &Desc)) {
|
||||
if (BSON_ITER_HOLDS_UTF8(&Desc))
|
||||
value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL));
|
||||
else if (BSON_ITER_HOLDS_INT32(&Desc))
|
||||
value->SetValue(bson_iter_int32(&Desc));
|
||||
else if (BSON_ITER_HOLDS_INT64(&Desc))
|
||||
value->SetValue(bson_iter_int64(&Desc));
|
||||
else if (BSON_ITER_HOLDS_DOUBLE(&Desc))
|
||||
value->SetValue(bson_iter_double(&Desc));
|
||||
else if (BSON_ITER_HOLDS_DATE_TIME(&Desc))
|
||||
value->SetValue(bson_iter_date_time(&Desc) / 1000);
|
||||
else if (BSON_ITER_HOLDS_BOOL(&Desc)) {
|
||||
bool b = bson_iter_bool(&Desc);
|
||||
|
||||
if (value->IsTypeNum())
|
||||
value->SetValue(b ? 1 : 0);
|
||||
else
|
||||
value->SetValue_psz(b ? "true" : "false");
|
||||
|
||||
} else if (BSON_ITER_HOLDS_OID(&Desc)) {
|
||||
char str[25];
|
||||
|
||||
bson_oid_to_string(bson_iter_oid(&Desc), str);
|
||||
value->SetValue_psz(str);
|
||||
} else if (BSON_ITER_HOLDS_NULL(&Iter)) {
|
||||
// Apparently this does not work...
|
||||
value->Reset();
|
||||
value->SetNull(true);
|
||||
} else if (BSON_ITER_HOLDS_DECIMAL128(&Desc)) {
|
||||
char *str = NULL;
|
||||
bson_decimal128_t dec;
|
||||
|
||||
bson_iter_decimal128(&Desc, &dec);
|
||||
bson_decimal128_to_string(&dec, str);
|
||||
value->SetValue_psz(str);
|
||||
bson_free(str);
|
||||
} else if (BSON_ITER_HOLDS_DOCUMENT(&Iter)) {
|
||||
bson_t *doc;
|
||||
const uint8_t *data = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
bson_iter_document(&Desc, &len, &data);
|
||||
|
||||
if (data) {
|
||||
doc = bson_new_from_data(data, len);
|
||||
value->SetValue_psz(Mini(g, colp, doc, false));
|
||||
bson_destroy(doc);
|
||||
} else {
|
||||
// ... but we can come here in case of NULL!
|
||||
value->Reset();
|
||||
value->SetNull(true);
|
||||
} // endif data
|
||||
|
||||
} else if (BSON_ITER_HOLDS_ARRAY(&Iter)) {
|
||||
bson_t *arr;
|
||||
const uint8_t *data = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
bson_iter_array(&Desc, &len, &data);
|
||||
|
||||
if (data) {
|
||||
arr = bson_new_from_data(data, len);
|
||||
value->SetValue_psz(Mini(g, colp, arr, true));
|
||||
bson_destroy(arr);
|
||||
} else {
|
||||
// This is a bug in returning the wrong type
|
||||
// This fix is only for document items
|
||||
bson_t *doc;
|
||||
|
||||
bson_iter_document(&Desc, &len, &data);
|
||||
|
||||
if (data) {
|
||||
doc = bson_new_from_data(data, len);
|
||||
value->SetValue_psz(Mini(g, colp, doc, false));
|
||||
bson_destroy(doc);
|
||||
} else {
|
||||
// ... or we can also come here in case of NULL!
|
||||
value->Reset();
|
||||
value->SetNull(true);
|
||||
} // endif data
|
||||
|
||||
} // endif data
|
||||
|
||||
} else
|
||||
value->Reset();
|
||||
|
||||
} else {
|
||||
// Field does not exist
|
||||
value->Reset();
|
||||
value->SetNull(true);
|
||||
} // endif Iter
|
||||
|
||||
} // end of GetColumnValue
|
||||
|
||||
/***********************************************************************/
|
||||
/* AddValue: Add column value to the document to insert or update. */
|
||||
/***********************************************************************/
|
||||
bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd)
|
||||
{
|
||||
bool rc = false;
|
||||
PVAL value = colp->GetValue();
|
||||
|
||||
if (value->IsNull()) {
|
||||
if (upd)
|
||||
rc = BSON_APPEND_NULL(doc, key);
|
||||
else
|
||||
return false;
|
||||
|
||||
} else switch (colp->GetResultType()) {
|
||||
case TYPE_STRING:
|
||||
rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue());
|
||||
break;
|
||||
case TYPE_INT:
|
||||
case TYPE_SHORT:
|
||||
rc = BSON_APPEND_INT32(doc, key, value->GetIntValue());
|
||||
break;
|
||||
case TYPE_TINY:
|
||||
rc = BSON_APPEND_BOOL(doc, key, value->GetIntValue());
|
||||
break;
|
||||
case TYPE_BIGINT:
|
||||
rc = BSON_APPEND_INT64(doc, key, value->GetBigintValue());
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
rc = BSON_APPEND_DOUBLE(doc, key, value->GetFloatValue());
|
||||
break;
|
||||
case TYPE_DECIM:
|
||||
{bson_decimal128_t dec;
|
||||
|
||||
if (bson_decimal128_from_string(value->GetCharValue(), &dec))
|
||||
rc = BSON_APPEND_DECIMAL128(doc, key, &dec);
|
||||
|
||||
} break;
|
||||
case TYPE_DATE:
|
||||
rc = BSON_APPEND_DATE_TIME(doc, key, value->GetBigintValue() * 1000);
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, "Type %d not supported yet", colp->GetResultType());
|
||||
return true;
|
||||
} // endswitch Buf_Type
|
||||
|
||||
if (!rc) {
|
||||
strcpy(g->Message, "Adding value failed");
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
} // end of AddValue
|
||||
|
||||
#if 0
|
||||
void *CMgoConn::mgo_alloc(size_t n)
|
||||
{
|
||||
char *mst = (char*)PlgDBSubAlloc(G, NULL, n + sizeof(size_t));
|
||||
|
||||
if (mst) {
|
||||
*(size_t*)mst = n;
|
||||
return mst + sizeof(size_t);
|
||||
} // endif mst
|
||||
|
||||
return NULL;
|
||||
} // end of mgo_alloc
|
||||
|
||||
void *CMgoConn::mgo_calloc(size_t n, size_t sz)
|
||||
{
|
||||
void *m = mgo_alloc(n * sz);
|
||||
|
||||
if (m)
|
||||
memset(m, 0, n * sz);
|
||||
|
||||
return m;
|
||||
} // end of mgo_calloc
|
||||
|
||||
void *CMgoConn::mgo_realloc(void *m, size_t n)
|
||||
{
|
||||
if (!m)
|
||||
return n ? mgo_alloc(n) : NULL;
|
||||
|
||||
size_t *osz = (size_t*)((char*)m - sizeof(size_t));
|
||||
|
||||
if (n > *osz) {
|
||||
void *nwm = mgo_alloc(n);
|
||||
|
||||
if (nwm)
|
||||
memcpy(nwm, m, *osz);
|
||||
|
||||
return nwm;
|
||||
} else {
|
||||
*osz = n;
|
||||
return m;
|
||||
} // endif n
|
||||
|
||||
} // end of mgo_realloc
|
||||
#endif // 0
|
||||
|
||||
115
storage/connect/cmgoconn.h
Normal file
115
storage/connect/cmgoconn.h
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
/***********************************************************************/
|
||||
/* CMgoConn.h : header file for the MongoDB connection classes. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include MongoDB library header files. */
|
||||
/***********************************************************************/
|
||||
#include <bson.h>
|
||||
#include <bcon.h>
|
||||
#include <mongoc.h>
|
||||
|
||||
// C connection to a MongoDB data source
|
||||
class TDBCMG;
|
||||
class MGOCOL;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include MongoDB library header files. */
|
||||
/***********************************************************************/
|
||||
typedef class INCOL *PINCOL;
|
||||
typedef class MGODEF *PMGODEF;
|
||||
typedef class TDBCMG *PTDBCMG;
|
||||
typedef class MGOCOL *PMGOCOL;
|
||||
|
||||
typedef struct mongo_parms {
|
||||
PTDB Tdbp;
|
||||
PCSZ Uristr; // Driver URI
|
||||
PCSZ Db_name;
|
||||
PCSZ Coll_name;
|
||||
PCSZ Options;
|
||||
PCSZ Filter;
|
||||
bool Pipe;
|
||||
//PCSZ User; // User connect info
|
||||
//PCSZ Pwd; // Password connect info
|
||||
//int Fsize; // Fetch size
|
||||
//bool Scrollable; // Scrollable cursor
|
||||
} CMGOPARM, *PCPARM;
|
||||
|
||||
typedef struct KEYCOL {
|
||||
KEYCOL *Next;
|
||||
PINCOL Incolp;
|
||||
PCOL Colp;
|
||||
char *Key;
|
||||
} *PKC;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Used when inserting values in a MongoDB collection. */
|
||||
/***********************************************************************/
|
||||
class INCOL : public BLOCK {
|
||||
public:
|
||||
// Constructor
|
||||
INCOL(bool ar) { Child = bson_new(); Klist = NULL; Array = ar; }
|
||||
|
||||
// Methods
|
||||
void AddCol(PGLOBAL g, PCOL colp, char *jp);
|
||||
void Init(void);
|
||||
void Destroy(void);
|
||||
|
||||
//Members
|
||||
bson_t *Child;
|
||||
PKC Klist;
|
||||
bool Array;
|
||||
}; // end of INCOL;
|
||||
|
||||
/***********************************************************************/
|
||||
/* CMgoConn class. */
|
||||
/***********************************************************************/
|
||||
class CMgoConn : public BLOCK {
|
||||
friend class TDBCMG;
|
||||
friend class CMGDISC;
|
||||
public:
|
||||
// Constructor
|
||||
CMgoConn(PGLOBAL g, PCPARM pcg);
|
||||
|
||||
//static void *mgo_alloc(size_t n);
|
||||
//static void *mgo_calloc(size_t n, size_t sz);
|
||||
//static void *mgo_realloc(void *m, size_t n);
|
||||
//static void mgo_free(void *) {}
|
||||
|
||||
// Implementation
|
||||
bool IsConnected(void) { return m_Connected; }
|
||||
bool Connect(PGLOBAL g);
|
||||
int CollSize(PGLOBAL g);
|
||||
bool MakeCursor(PGLOBAL g);
|
||||
int ReadNext(PGLOBAL g);
|
||||
PSZ GetDocument(PGLOBAL g);
|
||||
void ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k);
|
||||
void MakeColumnGroups(PGLOBAL g);
|
||||
bool DocWrite(PGLOBAL g, PINCOL icp);
|
||||
int Write(PGLOBAL g);
|
||||
bool DocDelete(PGLOBAL g);
|
||||
void Rewind(void);
|
||||
void Close(void);
|
||||
PSZ Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b);
|
||||
void GetColumnValue(PGLOBAL g, PCOL colp);
|
||||
bool AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
PCPARM Pcg;
|
||||
mongoc_uri_t *Uri;
|
||||
mongoc_client_pool_t *Pool; // Thread safe client pool
|
||||
mongoc_client_t *Client; // The MongoDB client
|
||||
mongoc_database_t *Database; // The MongoDB database
|
||||
mongoc_collection_t *Collection; // The MongoDB collection
|
||||
mongoc_cursor_t *Cursor;
|
||||
const bson_t *Document;
|
||||
bson_t *Query; // MongoDB cursor filter
|
||||
bson_t *Opts; // MongoDB cursor options
|
||||
bson_error_t Error;
|
||||
bson_iter_t Iter; // Used to retrieve column value
|
||||
bson_iter_t Desc; // Descendant iter
|
||||
PINCOL Fpc; // To insert INCOL classes
|
||||
PFBLOCK fp;
|
||||
bool m_Connected;
|
||||
}; // end of class CMgoConn
|
||||
|
|
@ -38,7 +38,8 @@ class DllExport COLBLK : public XOBJECT {
|
|||
virtual PTDB GetTo_Tdb(void) {return To_Tdb;}
|
||||
virtual int GetClustered(void) {return 0;}
|
||||
virtual int IsClustered(void) {return FALSE;}
|
||||
PCOL GetNext(void) {return Next;}
|
||||
virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;}
|
||||
PCOL GetNext(void) {return Next;}
|
||||
PSZ GetName(void) {return Name;}
|
||||
int GetIndex(void) {return Index;}
|
||||
ushort GetColUse(void) {return ColUse;}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ PGLOBAL CntExit(PGLOBAL g)
|
|||
/* CntEndDB: DB termination semantic routine. */
|
||||
/***********************************************************************/
|
||||
void CntEndDB(PGLOBAL g)
|
||||
{
|
||||
{
|
||||
PDBUSER dbuserp= PlgGetUser(g);
|
||||
|
||||
if (dbuserp) {
|
||||
|
|
@ -91,9 +91,14 @@ void CntEndDB(PGLOBAL g)
|
|||
delete dbuserp->Catalog;
|
||||
|
||||
free(dbuserp);
|
||||
} // endif dbuserp
|
||||
|
||||
} // end of CntEndDB
|
||||
if (trace)
|
||||
htrc("CntEndDB: Freeing Dup\n");
|
||||
|
||||
g->Activityp->Aptr = NULL;
|
||||
} // endif dbuserp
|
||||
|
||||
} // end of CntEndDB
|
||||
|
||||
/***********************************************************************/
|
||||
/* CntCheckDB: Initialize a DB application session. */
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
|
|
|
|||
|
|
@ -290,6 +290,9 @@ void ZIPUTIL::close()
|
|||
zipfile = NULL;
|
||||
} // endif zipfile
|
||||
|
||||
if (fp)
|
||||
fp->Count = 0;
|
||||
|
||||
} // end of close
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
@ -455,7 +458,7 @@ loopStart:
|
|||
if (!*++pat) return TRUE;
|
||||
goto loopStart;
|
||||
default:
|
||||
if (mapCaseTable[(uchar)*s] != mapCaseTable[(uchar)*p])
|
||||
if (mapCaseTable[(uint)*s] != mapCaseTable[(uint)*p])
|
||||
goto starCheck;
|
||||
break;
|
||||
} /* endswitch */
|
||||
|
|
@ -493,6 +496,9 @@ void UNZIPUTL::close()
|
|||
zipfile = NULL;
|
||||
} // endif zipfile
|
||||
|
||||
if (fp)
|
||||
fp->Count = 0;
|
||||
|
||||
} // end of close
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
|
|||
|
|
@ -33,11 +33,11 @@
|
|||
#include "tabcol.h"
|
||||
#include "xtable.h"
|
||||
#include "array.h"
|
||||
//#include "subquery.h"
|
||||
#include "filter.h"
|
||||
//#include "token.h"
|
||||
//#include "select.h"
|
||||
#include "xindex.h"
|
||||
#if defined(MONGO_SUPPORT) || defined(JDBC_SUPPORT)
|
||||
#include "tabext.h"
|
||||
#endif // MONGO_SUPPORT || JDBC_SUPPORT
|
||||
|
||||
/***********************************************************************/
|
||||
/* Utility routines. */
|
||||
|
|
@ -87,7 +87,7 @@ BYTE OpBmp(PGLOBAL g, OPVAL opc)
|
|||
case OP_EXIST: bt = 0x00; break;
|
||||
default:
|
||||
sprintf(g->Message, MSG(BAD_FILTER_OP), opc);
|
||||
throw (int)TYPE_FILTER;
|
||||
throw (int)TYPE_ARRAY;
|
||||
} // endswitch opc
|
||||
|
||||
return bt;
|
||||
|
|
@ -1406,6 +1406,86 @@ PFIL FILTER::Copy(PTABS t)
|
|||
} // end of Copy
|
||||
#endif // 0
|
||||
|
||||
#if defined(MONGO_SUPPORT)
|
||||
/***********************************************************************/
|
||||
/* Make selector json representation for Mongo tables. */
|
||||
/***********************************************************************/
|
||||
bool FILTER::MakeSelector(PGLOBAL g, PSTRG s)
|
||||
{
|
||||
s->Append('{');
|
||||
|
||||
if (Opc == OP_AND || Opc == OP_OR) {
|
||||
if (GetArgType(0) != TYPE_FILTER || GetArgType(1) != TYPE_FILTER)
|
||||
return true;
|
||||
|
||||
s->Append("\"$");
|
||||
s->Append(Opc == OP_AND ? "and" : "or");
|
||||
s->Append("\":[");
|
||||
|
||||
if (((PFIL)Arg(0))->MakeSelector(g, s))
|
||||
return true;
|
||||
|
||||
s->Append(',');
|
||||
|
||||
if (((PFIL)Arg(1))->MakeSelector(g, s))
|
||||
return true;
|
||||
|
||||
s->Append(']');
|
||||
} else {
|
||||
if (GetArgType(0) != TYPE_COLBLK)
|
||||
return true;
|
||||
|
||||
s->Append('"');
|
||||
s->Append(((PCOL)Arg(0))->GetJpath(g, false));
|
||||
s->Append("\":{\"$");
|
||||
|
||||
switch (Opc) {
|
||||
case OP_EQ:
|
||||
s->Append("eq");
|
||||
break;
|
||||
case OP_NE:
|
||||
s->Append("ne");
|
||||
break;
|
||||
case OP_GT:
|
||||
s->Append("gt");
|
||||
break;
|
||||
case OP_GE:
|
||||
s->Append("gte");
|
||||
break;
|
||||
case OP_LT:
|
||||
s->Append("lt");
|
||||
break;
|
||||
case OP_LE:
|
||||
s->Append("lte");
|
||||
break;
|
||||
case OP_NULL:
|
||||
case OP_LIKE:
|
||||
case OP_EXIST:
|
||||
default:
|
||||
return true;
|
||||
} // endswitch Opc
|
||||
|
||||
s->Append("\":");
|
||||
|
||||
if (GetArgType(1) == TYPE_COLBLK) {
|
||||
s->Append("\"$");
|
||||
s->Append(((PEXTCOL)Arg(1))->GetJpath(g, false));
|
||||
s->Append('"');
|
||||
} else {
|
||||
char buf[501];
|
||||
|
||||
Arg(1)->Prints(g, buf, 500);
|
||||
s->Append(buf);
|
||||
} // endif Type
|
||||
|
||||
s->Append('}');
|
||||
} // endif Opc
|
||||
|
||||
s->Append('}');
|
||||
return false;
|
||||
} // end of MakeSelector
|
||||
#endif // MONGO_SUPPORT
|
||||
|
||||
/*********************************************************************/
|
||||
/* Make file output of FILTER contents. */
|
||||
/*********************************************************************/
|
||||
|
|
@ -1710,7 +1790,7 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having)
|
|||
break; // Remove eventual ending separator(s)
|
||||
|
||||
// if (fp->Convert(g, having))
|
||||
// throw (int)TYPE_FILTER;
|
||||
// (int)throw TYPE_ARRAY;
|
||||
|
||||
filp = fp;
|
||||
fp = fp->Next;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*************** Filter H Declares Source Code File (.H) ***************/
|
||||
/* Name: FILTER.H Version 1.2 */
|
||||
/* Name: FILTER.H Version 1.3 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2010-2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2010-2017 */
|
||||
/* */
|
||||
/* This file contains the FILTER and derived classes declares. */
|
||||
/***********************************************************************/
|
||||
|
|
@ -61,6 +61,9 @@ class DllExport FILTER : public XOBJECT { /* Filter description block */
|
|||
//virtual PXOB CheckSubQuery(PGLOBAL, PSQL);
|
||||
//virtual bool CheckLocal(PTDB);
|
||||
//virtual int CheckSpcCol(PTDB tdbp, int n);
|
||||
#if defined(MONGO_SUPPORT)
|
||||
bool MakeSelector(PGLOBAL g, PSTRG s);
|
||||
#endif // MONGO_SUPPORT
|
||||
virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
// PFIL Linearize(bool nosep);
|
||||
|
|
|
|||
|
|
@ -58,31 +58,10 @@
|
|||
/* Miscellaneous Constants */
|
||||
/***********************************************************************/
|
||||
#define NO_IVAL -95684275 /* Used by GetIntegerOption */
|
||||
#define VMLANG 370 /* Size of olf VM lang blocks */
|
||||
#define MAX_JUMP 24 /* Maximum jump level number */
|
||||
#define MAX_STR 4160 /* Maximum message length */
|
||||
#define STR_SIZE 501 /* Length of char strings. */
|
||||
#define STD_INPUT 0 /* Standard language input */
|
||||
#define STD_OUTPUT 1 /* Standard language output */
|
||||
#define ERROR_OUTPUT 2 /* Error message output */
|
||||
#define DEBUG_OUTPUT 3 /* Debug info output */
|
||||
#define PROMPT_OUTPUT 4 /* Prompt message output */
|
||||
#define COPY_OUTPUT 5 /* Copy of language input */
|
||||
#define STD_MSG 6 /* System message file */
|
||||
#define DEBUG_MSG 7 /* Debug message file */
|
||||
#define DUMMY 0 /* Dummy file index in Ldm block */
|
||||
#define STDIN 1 /* stdin file index in Ldm block */
|
||||
#define STDOUT 2 /* stdout file index in Ldm block */
|
||||
#define STDERR 3 /* stderr file index in Ldm block */
|
||||
#define STDEBUG 4 /* debug file index in Ldm block */
|
||||
#define STDPRN 5 /* stdprn file index in Ldm block */
|
||||
#define STDFREE 6 /* Free file index in Ldm block */
|
||||
|
||||
#define TYPE_SEM -2 /* Returned semantic function */
|
||||
#define TYPE_DFONC -2 /* Indirect sem ref in FPARM */
|
||||
#define TYPE_VOID -1
|
||||
#define TYPE_SBPAR -1 /* Phrase reference in FPARM */
|
||||
#define TYPE_SEMX 0 /* Initial semantic function type? */
|
||||
#define TYPE_ERROR 0
|
||||
#define TYPE_STRING 1
|
||||
#define TYPE_DOUBLE 2
|
||||
|
|
@ -96,22 +75,6 @@
|
|||
#define TYPE_BIN 10
|
||||
#define TYPE_PCHAR 11
|
||||
|
||||
#if defined(OS32)
|
||||
#define SYS_STAMP "OS32"
|
||||
#elif defined(UNIX) || defined(LINUX) || defined(UNIV_LINUX)
|
||||
#define SYS_STAMP "UNIX"
|
||||
#elif defined(OS16)
|
||||
#define SYS_STAMP "OS16"
|
||||
#elif defined(DOSR)
|
||||
#define SYS_STAMP "DOSR"
|
||||
#elif defined(WIN)
|
||||
#define SYS_STAMP "WIN1"
|
||||
#elif defined(__WIN__)
|
||||
#define SYS_STAMP "WIN2"
|
||||
#else
|
||||
#define SYS_STAMP "XXXX"
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
@ -119,11 +82,6 @@ extern "C" {
|
|||
/***********************************************************************/
|
||||
/* Static variables */
|
||||
/***********************************************************************/
|
||||
#if defined(STORAGE)
|
||||
char sys_stamp[5] = SYS_STAMP;
|
||||
#else
|
||||
extern char sys_stamp[];
|
||||
#endif
|
||||
|
||||
/***********************************************************************/
|
||||
/* File-Selection Indicators */
|
||||
|
|
|
|||
|
|
@ -98,8 +98,8 @@
|
|||
rnd_next signals that it has reached the end of its data. Calls to
|
||||
ha_connect::extra() are hints as to what will be occuring to the request.
|
||||
|
||||
Author Olivier Bertrand
|
||||
*/
|
||||
Author Olivier Bertrand
|
||||
*/
|
||||
|
||||
#ifdef USE_PRAGMA_IMPLEMENTATION
|
||||
#pragma implementation // gcc: Class implementation
|
||||
|
|
@ -171,15 +171,19 @@
|
|||
#define JSONMAX 10 // JSON Default max grp size
|
||||
|
||||
extern "C" {
|
||||
char version[]= "Version 1.06.0001 April 17, 2017";
|
||||
char version[]= "Version 1.06.0004 September 03, 2017";
|
||||
#if defined(__WIN__)
|
||||
char compver[]= "Version 1.06.0001 " __DATE__ " " __TIME__;
|
||||
char compver[]= "Version 1.06.0004 " __DATE__ " " __TIME__;
|
||||
char slash= '\\';
|
||||
#else // !__WIN__
|
||||
char slash= '/';
|
||||
#endif // !__WIN__
|
||||
} // extern "C"
|
||||
|
||||
#if defined(NEW_MAR)
|
||||
#define stored_in_db stored_in_db()
|
||||
#endif // NEW_MAR)
|
||||
|
||||
#if defined(XMAP)
|
||||
my_bool xmap= false;
|
||||
#endif // XMAP
|
||||
|
|
@ -197,28 +201,29 @@ extern "C" {
|
|||
char *ClassPath;
|
||||
#endif // JDBC_SUPPORT
|
||||
|
||||
//#if defined(__WIN__)
|
||||
//CRITICAL_SECTION parsec; // Used calling the Flex parser
|
||||
//#else // !__WIN__
|
||||
//pthread_mutex_t parmut = PTHREAD_MUTEX_INITIALIZER;
|
||||
//#endif // !__WIN__
|
||||
pthread_mutex_t parmut;
|
||||
pthread_mutex_t usrmut;
|
||||
pthread_mutex_t tblmut;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Utility functions. */
|
||||
/***********************************************************************/
|
||||
PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info);
|
||||
PQRYRES VirColumns(PGLOBAL g, bool info);
|
||||
PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info);
|
||||
PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info);
|
||||
PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info);
|
||||
#if defined(MONGO_SUPPORT)
|
||||
PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ url, PTOS topt, bool info);
|
||||
#endif // MONGO_SUPPORT
|
||||
int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v);
|
||||
void PushWarning(PGLOBAL g, THD *thd, int level);
|
||||
bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, PCSZ db,
|
||||
PCSZ tab, PCSZ src, int port);
|
||||
bool ZipLoadFile(PGLOBAL, PCSZ, PCSZ, PCSZ, bool, bool);
|
||||
bool ExactInfo(void);
|
||||
#if defined(CMGO_SUPPORT)
|
||||
void mongo_init(bool);
|
||||
#endif // CMGO_SUPPORT
|
||||
USETEMP UseTemp(void);
|
||||
int GetConvSize(void);
|
||||
TYPCONV GetTypeConv(void);
|
||||
|
|
@ -350,10 +355,17 @@ static MYSQL_THDVAR_UINT(json_grp_size,
|
|||
static MYSQL_THDVAR_STR(java_wrapper,
|
||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC,
|
||||
"Java wrapper class name",
|
||||
// check_class_path, update_class_path,
|
||||
// check_java_wrapper, update_java_wrapper,
|
||||
NULL, NULL, "wrappers/JdbcInterface");
|
||||
#endif // JDBC_SUPPORT
|
||||
|
||||
#if defined(MONGO_SUPPORT)
|
||||
// Enabling MONGO table type
|
||||
static MYSQL_THDVAR_BOOL(enable_mongo, PLUGIN_VAR_RQCMDARG,
|
||||
"Enabling the MongoDB access",
|
||||
NULL, NULL, MONGO_ENABLED);
|
||||
#endif // MONGO_SUPPORT
|
||||
|
||||
#if defined(XMSG) || defined(NEWMSG)
|
||||
const char *language_names[]=
|
||||
{
|
||||
|
|
@ -414,6 +426,10 @@ char *GetJavaWrapper(void)
|
|||
{return connect_hton ? THDVAR(current_thd, java_wrapper) : (char*)"wrappers/JdbcInterface";}
|
||||
#endif // JDBC_SUPPORT
|
||||
|
||||
#if defined(MONGO_SUPPORT)
|
||||
bool MongoEnabled(void) { return THDVAR(current_thd, enable_mongo); }
|
||||
#endif // MONGO_SUPPORT
|
||||
|
||||
extern "C" const char *msglang(void)
|
||||
{
|
||||
#if defined(FRENCH)
|
||||
|
|
@ -516,7 +532,8 @@ ha_create_table_option connect_table_option_list[]=
|
|||
HA_TOPTION_STRING("CATFUNC", catfunc),
|
||||
HA_TOPTION_STRING("SRCDEF", srcdef),
|
||||
HA_TOPTION_STRING("COLIST", colist),
|
||||
HA_TOPTION_STRING("OPTION_LIST", oplist),
|
||||
HA_TOPTION_STRING("FILTER", filter),
|
||||
HA_TOPTION_STRING("OPTION_LIST", oplist),
|
||||
HA_TOPTION_STRING("DATA_CHARSET", data_charset),
|
||||
HA_TOPTION_NUMBER("LRECL", lrecl, 0, 0, INT_MAX32, 1),
|
||||
HA_TOPTION_NUMBER("BLOCK_SIZE", elements, 0, 0, INT_MAX32, 1),
|
||||
|
|
@ -677,17 +694,21 @@ static int connect_init_func(void *p)
|
|||
|
||||
#if defined(__WIN__)
|
||||
sql_print_information("CONNECT: %s", compver);
|
||||
//InitializeCriticalSection((LPCRITICAL_SECTION)&parsec);
|
||||
#else // !__WIN__
|
||||
sql_print_information("CONNECT: %s", version);
|
||||
#endif // !__WIN__
|
||||
pthread_mutex_init(&parmut, NULL);
|
||||
pthread_mutex_init(&usrmut, NULL);
|
||||
pthread_mutex_init(&tblmut, NULL);
|
||||
|
||||
#if defined(LIBXML2_SUPPORT)
|
||||
XmlInitParserLib();
|
||||
#endif // LIBXML2_SUPPORT
|
||||
|
||||
#if defined(CMGO_SUPPORT)
|
||||
mongo_init(true);
|
||||
#endif // CMGO_SUPPORT
|
||||
|
||||
init_connect_psi_keys();
|
||||
|
||||
connect_hton= (handlerton *)p;
|
||||
|
|
@ -706,7 +727,7 @@ static int connect_init_func(void *p)
|
|||
DTVAL::SetTimeShift(); // Initialize time zone shift once for all
|
||||
BINCOL::SetEndian(); // Initialize host endian setting
|
||||
#if defined(JDBC_SUPPORT)
|
||||
JDBConn::SetJVM();
|
||||
JAVAConn::SetJVM();
|
||||
#endif // JDBC_SUPPORT
|
||||
DBUG_RETURN(0);
|
||||
} // end of connect_init_func
|
||||
|
|
@ -726,13 +747,15 @@ static int connect_done_func(void *)
|
|||
XmlCleanupParserLib();
|
||||
#endif // LIBXML2_SUPPORT
|
||||
|
||||
#if defined(CMGO_SUPPORT)
|
||||
mongo_init(false);
|
||||
#endif // CMGO_SUPPORT
|
||||
|
||||
#ifdef JDBC_SUPPORT
|
||||
JDBConn::ResetJVM();
|
||||
JAVAConn::ResetJVM();
|
||||
#endif // JDBC_SUPPORT
|
||||
|
||||
#if defined(__WIN__)
|
||||
//DeleteCriticalSection((LPCRITICAL_SECTION)&parsec);
|
||||
#else // !__WIN__
|
||||
#if !defined(__WIN__)
|
||||
PROFILE_End();
|
||||
#endif // !__WIN__
|
||||
|
||||
|
|
@ -749,6 +772,7 @@ static int connect_done_func(void *)
|
|||
|
||||
pthread_mutex_destroy(&usrmut);
|
||||
pthread_mutex_destroy(&parmut);
|
||||
pthread_mutex_destroy(&tblmut);
|
||||
connect_hton= NULL;
|
||||
DBUG_RETURN(error);
|
||||
} // end of connect_done_func
|
||||
|
|
@ -919,15 +943,18 @@ static PCONNECT GetUser(THD *thd, PCONNECT xp)
|
|||
pthread_mutex_unlock(&usrmut);
|
||||
|
||||
if (!xp) {
|
||||
xp= new user_connect(thd);
|
||||
xp = new user_connect(thd);
|
||||
|
||||
if (xp->user_init()) {
|
||||
delete xp;
|
||||
xp= NULL;
|
||||
if (xp->user_init()) {
|
||||
delete xp;
|
||||
xp = NULL;
|
||||
} // endif user_init
|
||||
|
||||
} // endif xp
|
||||
|
||||
//} else
|
||||
// xp->count++;
|
||||
|
||||
return xp;
|
||||
} // end of GetUser
|
||||
|
||||
|
|
@ -1054,55 +1081,55 @@ PCSZ GetListOption(PGLOBAL g, PCSZ opname, PCSZ oplist, PCSZ def)
|
|||
if (!oplist)
|
||||
return (char*)def;
|
||||
|
||||
char key[16], val[256];
|
||||
char *pv, *pn, *pk = (char*)oplist;
|
||||
PCSZ opval = def;
|
||||
int n;
|
||||
char key[16], val[256];
|
||||
char *pv, *pn, *pk= (char*)oplist;
|
||||
PCSZ opval= def;
|
||||
int n;
|
||||
|
||||
while (*pk == ' ')
|
||||
pk++;
|
||||
|
||||
for (; pk; pk = pn) {
|
||||
pn = strchr(pk, ',');
|
||||
pv = strchr(pk, '=');
|
||||
for (; pk; pk= pn) {
|
||||
pn= strchr(pk, ',');
|
||||
pv= strchr(pk, '=');
|
||||
|
||||
if (pv && (!pn || pv < pn)) {
|
||||
if (pv && (!pn || pv < pn)) {
|
||||
n = MY_MIN(static_cast<size_t>(pv - pk), sizeof(key) - 1);
|
||||
memcpy(key, pk, n);
|
||||
|
||||
while (n && key[n - 1] == ' ')
|
||||
n--;
|
||||
|
||||
key[n] = 0;
|
||||
key[n]= 0;
|
||||
|
||||
while (*(++pv) == ' ');
|
||||
while(*(++pv) == ' ') ;
|
||||
|
||||
n = MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1);
|
||||
memcpy(val, pv, n);
|
||||
n= MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1);
|
||||
memcpy(val, pv, n);
|
||||
|
||||
while (n && val[n - 1] == ' ')
|
||||
n--;
|
||||
|
||||
val[n] = 0;
|
||||
} else {
|
||||
n = MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1);
|
||||
memcpy(key, pk, n);
|
||||
val[n]= 0;
|
||||
} else {
|
||||
n= MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1);
|
||||
memcpy(key, pk, n);
|
||||
|
||||
while (n && key[n - 1] == ' ')
|
||||
n--;
|
||||
|
||||
key[n] = 0;
|
||||
val[0] = 0;
|
||||
} // endif pv
|
||||
key[n]= 0;
|
||||
val[0]= 0;
|
||||
} // endif pv
|
||||
|
||||
if (!stricmp(opname, key)) {
|
||||
opval = PlugDup(g, val);
|
||||
break;
|
||||
} else if (!pn)
|
||||
break;
|
||||
if (!stricmp(opname, key)) {
|
||||
opval= PlugDup(g, val);
|
||||
break;
|
||||
} else if (!pn)
|
||||
break;
|
||||
|
||||
while (*(++pn) == ' ');
|
||||
} // endfor pk
|
||||
while (*(++pn) == ' ') ;
|
||||
} // endfor pk
|
||||
|
||||
return opval;
|
||||
} // end of GetListOption
|
||||
|
|
@ -1143,7 +1170,9 @@ PCSZ GetStringTableOption(PGLOBAL g, PTOS options, PCSZ opname, PCSZ sdef)
|
|||
opval= options->srcdef;
|
||||
else if (!stricmp(opname, "Colist"))
|
||||
opval= options->colist;
|
||||
else if (!stricmp(opname, "Data_charset"))
|
||||
else if (!stricmp(opname, "Filter"))
|
||||
opval = options->filter;
|
||||
else if (!stricmp(opname, "Data_charset"))
|
||||
opval= options->data_charset;
|
||||
|
||||
if (!opval && options->oplist)
|
||||
|
|
@ -1267,9 +1296,14 @@ PCSZ ha_connect::GetStringOption(PCSZ opname, PCSZ sdef)
|
|||
else
|
||||
opval= GetListOption(xp->g, opname, options->oplist);
|
||||
|
||||
} else if (!stricmp(opname, "Query_String"))
|
||||
opval= thd_query_string(table->in_use)->str;
|
||||
else if (!stricmp(opname, "Partname"))
|
||||
} else if (!stricmp(opname, "Query_String")) {
|
||||
// This escapes everything and returns a wrong query
|
||||
// opval = thd_query_string(table->in_use)->str;
|
||||
opval = (PCSZ)PlugSubAlloc(xp->g, NULL,
|
||||
thd_query_string(table->in_use)->length + 1);
|
||||
strcpy((char*)opval, thd_query_string(table->in_use)->str);
|
||||
// sprintf((char*)opval, "%s", thd_query_string(table->in_use)->str);
|
||||
} else if (!stricmp(opname, "Partname"))
|
||||
opval= partname;
|
||||
else if (!stricmp(opname, "Table_charset")) {
|
||||
const CHARSET_INFO *chif= (tshp) ? tshp->table_charset
|
||||
|
|
@ -1415,7 +1449,7 @@ PFOS ha_connect::GetFieldOptionStruct(Field *fdp)
|
|||
void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
|
||||
{
|
||||
const char *cp;
|
||||
char *chset, v;
|
||||
char *chset, v = 0;
|
||||
ha_field_option_struct *fop;
|
||||
Field* fp;
|
||||
Field* *fldp;
|
||||
|
|
@ -1468,14 +1502,13 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
|
|||
} // endif fop
|
||||
|
||||
chset = (char *)fp->charset()->name;
|
||||
v = (!strcmp(chset, "binary")) ? 'B' : 0;
|
||||
|
||||
switch (fp->type()) {
|
||||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_VARCHAR:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
pcf->Flags |= U_VAR;
|
||||
// fall through
|
||||
// fall through
|
||||
default:
|
||||
pcf->Type= MYSQLtoPLG(fp->type(), &v);
|
||||
break;
|
||||
|
|
@ -1483,8 +1516,9 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
|
|||
|
||||
switch (pcf->Type) {
|
||||
case TYPE_STRING:
|
||||
// Do something for case
|
||||
cp= fp->charset()->name;
|
||||
case TYPE_BIN:
|
||||
// Do something for case
|
||||
cp= chset;
|
||||
|
||||
// Find if collation name ends by _ci
|
||||
if (!strcmp(cp + strlen(cp) - 3, "_ci")) {
|
||||
|
|
@ -2096,6 +2130,11 @@ int ha_connect::MakeRecord(char *buf)
|
|||
charset= tdbp->data_charset();
|
||||
rc= fp->store(p, strlen(p), charset, CHECK_FIELD_WARN);
|
||||
break;
|
||||
case TYPE_BIN:
|
||||
p = value->GetCharValue();
|
||||
charset = &my_charset_bin;
|
||||
rc = fp->store(p, strlen(p), charset, CHECK_FIELD_WARN);
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
rc= fp->store(value->GetFloatValue());
|
||||
break;
|
||||
|
|
@ -2594,7 +2633,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond)
|
|||
case Item_func::LE_FUNC: vop= OP_LE; break;
|
||||
case Item_func::GE_FUNC: vop= OP_GE; break;
|
||||
case Item_func::GT_FUNC: vop= OP_GT; break;
|
||||
case Item_func::IN_FUNC: vop= OP_IN;
|
||||
case Item_func::IN_FUNC: vop= OP_IN; /* fall through */
|
||||
case Item_func::BETWEEN:
|
||||
ismul= true;
|
||||
neg= ((Item_func_opt_neg *)condf)->negated;
|
||||
|
|
@ -2849,10 +2888,10 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
|||
case Item_func::GT_FUNC: vop= OP_GT; break;
|
||||
case Item_func::LIKE_FUNC: vop= OP_LIKE; break;
|
||||
case Item_func::ISNOTNULL_FUNC:
|
||||
neg = true;
|
||||
neg = true;
|
||||
// fall through
|
||||
case Item_func::ISNULL_FUNC: vop= OP_NULL; break;
|
||||
case Item_func::IN_FUNC: vop= OP_IN;
|
||||
case Item_func::IN_FUNC: vop= OP_IN; /* fall through */
|
||||
case Item_func::BETWEEN:
|
||||
ismul= true;
|
||||
neg= ((Item_func_opt_neg *)condf)->negated;
|
||||
|
|
@ -2979,6 +3018,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
|||
break;
|
||||
} // endif ODBC
|
||||
|
||||
// fall through
|
||||
case MYSQL_TYPE_DATE:
|
||||
if (tty == TYPE_AM_ODBC) {
|
||||
strcat(s, "{d '");
|
||||
|
|
@ -4129,8 +4169,10 @@ int ha_connect::info(uint flag)
|
|||
} else
|
||||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR); // Should never happen
|
||||
|
||||
if (!(tdbp= GetTDB(g)))
|
||||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR); // Should never happen
|
||||
if (!(tdbp = GetTDB(g))) {
|
||||
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
|
||||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
|
||||
} // endif tdbp
|
||||
|
||||
valid_info = false;
|
||||
} // endif tdbp
|
||||
|
|
@ -4305,6 +4347,7 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn, bool quick)
|
|||
case TAB_ODBC:
|
||||
case TAB_JDBC:
|
||||
case TAB_MYSQL:
|
||||
case TAB_MONGO:
|
||||
case TAB_DIR:
|
||||
case TAB_MAC:
|
||||
case TAB_WMI:
|
||||
|
|
@ -4377,7 +4420,11 @@ bool ha_connect::IsSameIndex(PIXDEF xp1, PIXDEF xp2)
|
|||
MODE ha_connect::CheckMode(PGLOBAL g, THD *thd,
|
||||
MODE newmode, bool *chk, bool *cras)
|
||||
{
|
||||
#if defined(DEVELOPMENT)
|
||||
if (true) {
|
||||
#else
|
||||
if (trace) {
|
||||
#endif
|
||||
LEX_STRING *query_string= thd_query_string(thd);
|
||||
htrc("%p check_mode: cmdtype=%d\n", this, thd_sql_command(thd));
|
||||
htrc("Cmd=%.*s\n", (int) query_string->length, query_string->str);
|
||||
|
|
@ -4389,7 +4436,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd,
|
|||
if (newmode == MODE_WRITE) {
|
||||
switch (thd_sql_command(thd)) {
|
||||
case SQLCOM_LOCK_TABLES:
|
||||
locked= 2;
|
||||
locked= 2; // fall through
|
||||
case SQLCOM_CREATE_TABLE:
|
||||
case SQLCOM_INSERT:
|
||||
case SQLCOM_LOAD:
|
||||
|
|
@ -4483,9 +4530,9 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd,
|
|||
break;
|
||||
// } // endif partitioned
|
||||
|
||||
case SQLCOM_END:
|
||||
// Met in procedures: IF(EXISTS(SELECT...
|
||||
newmode= MODE_READ;
|
||||
case SQLCOM_CHECK: // TODO implement it
|
||||
case SQLCOM_END: // Met in procedures: IF(EXISTS(SELECT...
|
||||
newmode= MODE_READ;
|
||||
break;
|
||||
default:
|
||||
htrc("Unsupported sql_command=%d\n", thd_sql_command(thd));
|
||||
|
|
@ -5137,7 +5184,8 @@ static bool add_field(String *sql, const char *field_name, int typ, int len,
|
|||
error|= sql->append("` ");
|
||||
error|= sql->append(type);
|
||||
|
||||
if (len && typ != TYPE_DATE && (typ != TYPE_DOUBLE || dec >= 0)) {
|
||||
if (typ == TYPE_STRING ||
|
||||
(len && typ != TYPE_DATE && (typ != TYPE_DOUBLE || dec >= 0))) {
|
||||
error|= sql->append('(');
|
||||
error|= sql->append_ulonglong(len);
|
||||
|
||||
|
|
@ -5334,16 +5382,17 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
#if defined(ODBC_SUPPORT)
|
||||
POPARM sop= NULL;
|
||||
PCSZ ucnc= NULL;
|
||||
bool cnc= false;
|
||||
PCSZ tabtyp = NULL;
|
||||
bool cnc= false;
|
||||
int cto= -1, qto= -1;
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT) || defined(MONGO_SUPPORT)
|
||||
#if defined(JDBC_SUPPORT)
|
||||
PJPARM sjp= NULL;
|
||||
#endif // JDBC_SUPPORT
|
||||
PCSZ driver= NULL;
|
||||
char *url= NULL;
|
||||
//char *prop= NULL;
|
||||
PCSZ tabtyp= NULL;
|
||||
#endif // JDBC_SUPPORT
|
||||
#endif // JDBC_SUPPORT || MONGO_SUPPORT
|
||||
uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL);
|
||||
bool bif, ok= false, dbf= false;
|
||||
TABTYPE ttp= TAB_UNDEF;
|
||||
|
|
@ -5351,6 +5400,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
PCOLRES crp;
|
||||
PCONNECT xp= NULL;
|
||||
PGLOBAL g= GetPlug(thd, xp);
|
||||
|
||||
if (!g)
|
||||
return HA_ERR_INTERNAL_ERROR;
|
||||
|
||||
PDBUSER dup= PlgGetUser(g);
|
||||
PCATLG cat= (dup) ? dup->Catalog : NULL;
|
||||
PTOS topt= table_s->option_struct;
|
||||
|
|
@ -5358,10 +5411,6 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
String sql(buf, sizeof(buf), system_charset_info);
|
||||
|
||||
sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info);
|
||||
|
||||
if (!g)
|
||||
return HA_ERR_INTERNAL_ERROR;
|
||||
|
||||
user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= zfn= dsn= NULL;
|
||||
|
||||
// Get the useful create options
|
||||
|
|
@ -5396,19 +5445,17 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
#endif // __WIN__
|
||||
port= atoi(GetListOption(g, "port", topt->oplist, "0"));
|
||||
#if defined(ODBC_SUPPORT)
|
||||
mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0"));
|
||||
tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL);
|
||||
mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0"));
|
||||
cto= atoi(GetListOption(g,"ConnectTimeout", topt->oplist, "-1"));
|
||||
qto= atoi(GetListOption(g,"QueryTimeout", topt->oplist, "-1"));
|
||||
|
||||
if ((ucnc= GetListOption(g, "UseDSN", topt->oplist)))
|
||||
cnc= (!*ucnc || *ucnc == 'y' || *ucnc == 'Y' || atoi(ucnc) != 0);
|
||||
#endif
|
||||
#if defined(JDBC_SUPPORT)
|
||||
#if defined(JDBC_SUPPORT) || defined(MONGO_SUPPORT)
|
||||
driver= GetListOption(g, "Driver", topt->oplist, NULL);
|
||||
// url= GetListOption(g, "URL", topt->oplist, NULL);
|
||||
// prop = GetListOption(g, "Properties", topt->oplist, NULL);
|
||||
tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL);
|
||||
#endif // JDBC_SUPPORT
|
||||
#endif // JDBC_SUPPORT || MONGO_SUPPORT
|
||||
#if defined(PROMPT_OK)
|
||||
cop= atoi(GetListOption(g, "checkdsn", topt->oplist, "0"));
|
||||
#endif // PROMPT_OK
|
||||
|
|
@ -5530,16 +5577,16 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
supfnc |= (FNC_DRIVER | FNC_TABLE);
|
||||
break;
|
||||
#endif // JDBC_SUPPORT
|
||||
case TAB_DBF:
|
||||
dbf= true;
|
||||
// fall through
|
||||
case TAB_CSV:
|
||||
if (!fn && fnc != FNC_NO)
|
||||
sprintf(g->Message, "Missing %s file name", topt->type);
|
||||
else if (sep && strlen(sep) > 1)
|
||||
sprintf(g->Message, "Invalid separator %s", sep);
|
||||
else
|
||||
ok= true;
|
||||
case TAB_DBF:
|
||||
dbf = true;
|
||||
// fall through
|
||||
case TAB_CSV:
|
||||
if (!fn && fnc != FNC_NO)
|
||||
sprintf(g->Message, "Missing %s file name", topt->type);
|
||||
else if (sep && strlen(sep) > 1)
|
||||
sprintf(g->Message, "Invalid separator %s", sep);
|
||||
else
|
||||
ok = true;
|
||||
|
||||
break;
|
||||
case TAB_MYSQL:
|
||||
|
|
@ -5612,12 +5659,22 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
case TAB_XML:
|
||||
#endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT
|
||||
case TAB_JSON:
|
||||
if (!fn && !zfn && !mul)
|
||||
dsn = strz(g, create_info->connect_string);
|
||||
|
||||
if (!fn && !zfn && !mul && !dsn)
|
||||
sprintf(g->Message, "Missing %s file name", topt->type);
|
||||
else
|
||||
ok = true;
|
||||
|
||||
break;
|
||||
#if defined(MONGO_SUPPORT)
|
||||
case TAB_MONGO:
|
||||
if (!topt->tabname)
|
||||
topt->tabname = tab;
|
||||
|
||||
ok = true;
|
||||
break;
|
||||
#endif // MONGO_SUPPORT
|
||||
case TAB_VIR:
|
||||
ok = true;
|
||||
break;
|
||||
|
|
@ -5758,8 +5815,16 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
|||
qrp = VirColumns(g, fnc == FNC_COL);
|
||||
break;
|
||||
case TAB_JSON:
|
||||
qrp = JSONColumns(g, (char*)db, topt, fnc == FNC_COL);
|
||||
qrp = JSONColumns(g, db, dsn, topt, fnc == FNC_COL);
|
||||
break;
|
||||
#if defined(MONGO_SUPPORT)
|
||||
case TAB_MONGO:
|
||||
if (!(url = strz(g, create_info->connect_string)) || !*url)
|
||||
url = "mongodb://localhost:27017";
|
||||
|
||||
qrp = MGOColumns(g, db, url, topt, fnc == FNC_COL);
|
||||
break;
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT)
|
||||
case TAB_XML:
|
||||
qrp = XMLColumns(g, (char*)db, tab, topt, fnc == FNC_COL);
|
||||
|
|
@ -6075,6 +6140,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
TABTYPE type;
|
||||
TABLE *st= table; // Probably unuseful
|
||||
THD *thd= ha_thd();
|
||||
LEX_STRING cnc = table_arg->s->connect_string;
|
||||
#if defined(WITH_PARTITION_STORAGE_ENGINE)
|
||||
partition_info *part_info= table_arg->part_info;
|
||||
#endif // WITH_PARTITION_STORAGE_ENGINE
|
||||
|
|
@ -6122,7 +6188,8 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
if (check_privileges(thd, options, GetDBfromName(name)))
|
||||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
|
||||
|
||||
inward= IsFileType(type) && !options->filename;
|
||||
inward= IsFileType(type) && !options->filename &&
|
||||
(type != TAB_JSON || !cnc.length);
|
||||
|
||||
if (options->data_charset) {
|
||||
const CHARSET_INFO *data_charset;
|
||||
|
|
@ -6175,6 +6242,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
|
||||
} // endif tabname
|
||||
|
||||
// fall through
|
||||
case TAB_MYSQL:
|
||||
#if defined(WITH_PARTITION_STORAGE_ENGINE)
|
||||
if (!part_info)
|
||||
|
|
@ -6219,7 +6287,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
DBUG_RETURN(HA_ERR_INTERNAL_ERROR);
|
||||
} // endif CheckSelf
|
||||
|
||||
}break;
|
||||
} break;
|
||||
default: /* do nothing */;
|
||||
break;
|
||||
} // endswitch ttp
|
||||
|
|
@ -6230,7 +6298,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
|
||||
// Note that if no support is specified, the default is MS-DOM
|
||||
// on Windows and libxml2 otherwise
|
||||
switch (*xsup) {
|
||||
switch (toupper(*xsup)) {
|
||||
case '*':
|
||||
#if defined(__WIN__)
|
||||
dom= true;
|
||||
|
|
@ -6343,6 +6411,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
case MYSQL_TYPE_VARCHAR:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
case MYSQL_TYPE_STRING:
|
||||
#if 0
|
||||
if (!fp->field_length) {
|
||||
sprintf(g->Message, "Unsupported 0 length for column %s",
|
||||
fp->field_name);
|
||||
|
|
@ -6352,7 +6421,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
|
|||
MYF(0), fp->field_name);
|
||||
DBUG_RETURN(rc);
|
||||
} // endif fp
|
||||
|
||||
#endif // 0
|
||||
break; // To be checked
|
||||
case MYSQL_TYPE_BIT:
|
||||
case MYSQL_TYPE_NULL:
|
||||
|
|
@ -6665,7 +6734,7 @@ bool ha_connect::FileExists(const char *fn, bool bf)
|
|||
} // end of FileExists
|
||||
|
||||
// Called by SameString and NoFieldOptionChange
|
||||
bool ha_connect::CheckString(const char *str1, const char *str2)
|
||||
bool ha_connect::CheckString(PCSZ str1, PCSZ str2)
|
||||
{
|
||||
bool b1= (!str1 || !*str1), b2= (!str2 || !*str2);
|
||||
|
||||
|
|
@ -7114,13 +7183,16 @@ static struct st_mysql_sys_var* connect_system_variables[]= {
|
|||
MYSQL_SYSVAR(errmsg_dir_path),
|
||||
#endif // XMSG
|
||||
MYSQL_SYSVAR(json_null),
|
||||
MYSQL_SYSVAR(json_grp_size),
|
||||
MYSQL_SYSVAR(json_grp_size),
|
||||
#if defined(JDBC_SUPPORT)
|
||||
MYSQL_SYSVAR(jvm_path),
|
||||
MYSQL_SYSVAR(class_path),
|
||||
MYSQL_SYSVAR(java_wrapper),
|
||||
#endif // JDBC_SUPPORT
|
||||
NULL
|
||||
#if defined(MONGO_SUPPORT)
|
||||
MYSQL_SYSVAR(enable_mongo),
|
||||
#endif // MONGO_SUPPORT
|
||||
NULL
|
||||
};
|
||||
|
||||
maria_declare_plugin(connect)
|
||||
|
|
@ -7129,14 +7201,14 @@ maria_declare_plugin(connect)
|
|||
&connect_storage_engine,
|
||||
"CONNECT",
|
||||
"Olivier Bertrand",
|
||||
"Management of External Data (SQL/MED), including many file formats",
|
||||
"Management of External Data (SQL/NOSQL/MED), including many file formats",
|
||||
PLUGIN_LICENSE_GPL,
|
||||
connect_init_func, /* Plugin Init */
|
||||
connect_done_func, /* Plugin Deinit */
|
||||
0x0106, /* version number (1.05) */
|
||||
NULL, /* status variables */
|
||||
connect_system_variables, /* system variables */
|
||||
"1.06.0001", /* string version */
|
||||
MariaDB_PLUGIN_MATURITY_BETA /* maturity */
|
||||
"1.06.0004", /* string version */
|
||||
MariaDB_PLUGIN_MATURITY_STABLE /* maturity */
|
||||
}
|
||||
maria_declare_plugin_end;
|
||||
|
|
|
|||
|
|
@ -166,8 +166,8 @@ public:
|
|||
~ha_connect();
|
||||
|
||||
// CONNECT Implementation
|
||||
static bool connect_init(void);
|
||||
static bool connect_end(void);
|
||||
//static bool connect_init(void);
|
||||
//static bool connect_end(void);
|
||||
TABTYPE GetRealType(PTOS pos= NULL);
|
||||
char *GetRealString(PCSZ s);
|
||||
PCSZ GetStringOption(PCSZ opname, PCSZ sdef= NULL);
|
||||
|
|
@ -348,6 +348,13 @@ const char *GetValStr(OPVAL vop, bool neg);
|
|||
PFIL CondFilter(PGLOBAL g, Item *cond);
|
||||
//PFIL CheckFilter(PGLOBAL g);
|
||||
|
||||
/** admin commands - called from mysql_admin_table */
|
||||
virtual int check(THD* thd, HA_CHECK_OPT* check_opt)
|
||||
{
|
||||
// TODO: implement it
|
||||
return HA_ADMIN_OK; // Just to avoid error message with checktables
|
||||
} // end of check
|
||||
|
||||
/**
|
||||
Number of rows in table. It will only be called if
|
||||
(table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0
|
||||
|
|
|
|||
621
storage/connect/javaconn.cpp
Normal file
621
storage/connect/javaconn.cpp
Normal file
|
|
@ -0,0 +1,621 @@
|
|||
/************ Javaconn C++ Functions Source Code File (.CPP) ***********/
|
||||
/* Name: JAVAConn.CPP Version 1.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the JAVA connection classes functions. */
|
||||
/***********************************************************************/
|
||||
|
||||
#if defined(__WIN__)
|
||||
// This is needed for RegGetValue
|
||||
#define _WINVER 0x0601
|
||||
#undef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0601
|
||||
#endif // __WIN__
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant MariaDB header file. */
|
||||
/***********************************************************************/
|
||||
#include <my_global.h>
|
||||
#include <m_string.h>
|
||||
#if defined(__WIN__)
|
||||
#include <direct.h> // for getcwd
|
||||
#if defined(__BORLANDC__)
|
||||
#define __MFC_COMPAT__ // To define min/max as macro
|
||||
#endif // __BORLANDC__
|
||||
#else // !__WIN__
|
||||
#if defined(UNIX)
|
||||
#include <errno.h>
|
||||
#else // !UNIX
|
||||
#endif // !UNIX
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> // for getenv
|
||||
#define NODW
|
||||
#endif // !__WIN__
|
||||
|
||||
/***********************************************************************/
|
||||
/* Required objects includes. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "colblk.h"
|
||||
#include "xobject.h"
|
||||
#include "xtable.h"
|
||||
#include "tabext.h"
|
||||
#include "javaconn.h"
|
||||
#include "resource.h"
|
||||
#include "valblk.h"
|
||||
#include "osutil.h"
|
||||
|
||||
#if defined(__WIN__)
|
||||
extern "C" HINSTANCE s_hModule; // Saved module handle
|
||||
#endif // __WIN__
|
||||
#define nullptr 0
|
||||
|
||||
//TYPCONV GetTypeConv();
|
||||
//int GetConvSize();
|
||||
extern char *JvmPath; // The connect_jvm_path global variable value
|
||||
extern char *ClassPath; // The connect_class_path global variable value
|
||||
|
||||
char *GetJavaWrapper(void); // The connect_java_wrapper variable value
|
||||
|
||||
/***********************************************************************/
|
||||
/* Static JAVAConn objects. */
|
||||
/***********************************************************************/
|
||||
void *JAVAConn::LibJvm = NULL;
|
||||
CRTJVM JAVAConn::CreateJavaVM = NULL;
|
||||
GETJVM JAVAConn::GetCreatedJavaVMs = NULL;
|
||||
#if defined(_DEBUG)
|
||||
GETDEF JAVAConn::GetDefaultJavaVMInitArgs = NULL;
|
||||
#endif // _DEBUG
|
||||
|
||||
/***********************************************************************/
|
||||
/* Some macro's (should be defined elsewhere to be more accessible) */
|
||||
/***********************************************************************/
|
||||
#if defined(_DEBUG)
|
||||
#define ASSERT(f) assert(f)
|
||||
#define DEBUG_ONLY(f) (f)
|
||||
#else // !_DEBUG
|
||||
#define ASSERT(f) ((void)0)
|
||||
#define DEBUG_ONLY(f) ((void)0)
|
||||
#endif // !_DEBUG
|
||||
|
||||
/***********************************************************************/
|
||||
/* Allocate the structure used to refer to the result set. */
|
||||
/***********************************************************************/
|
||||
static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, PCSZ db,
|
||||
PCSZ tab, PQRYRES qrp)
|
||||
{
|
||||
JCATPARM *cap;
|
||||
|
||||
#if defined(_DEBUG)
|
||||
assert(qrp);
|
||||
#endif
|
||||
|
||||
if ((cap = (JCATPARM *)PlgDBSubAlloc(g, NULL, sizeof(JCATPARM)))) {
|
||||
memset(cap, 0, sizeof(JCATPARM));
|
||||
cap->Id = fid;
|
||||
cap->Qrp = qrp;
|
||||
cap->DB = db;
|
||||
cap->Tab = tab;
|
||||
} // endif cap
|
||||
|
||||
return cap;
|
||||
} // end of AllocCatInfo
|
||||
|
||||
/***********************************************************************/
|
||||
/* JAVAConn construction/destruction. */
|
||||
/***********************************************************************/
|
||||
JAVAConn::JAVAConn(PGLOBAL g, PCSZ wrapper)
|
||||
{
|
||||
m_G = g;
|
||||
jvm = nullptr; // Pointer to the JVM (Java Virtual Machine)
|
||||
env = nullptr; // Pointer to native interface
|
||||
jdi = nullptr; // Pointer to the java wrapper class
|
||||
job = nullptr; // The java wrapper class object
|
||||
errid = nullptr;
|
||||
DiscFunc = "Disconnect";
|
||||
Msg = NULL;
|
||||
m_Wrap = (wrapper) ? wrapper : GetJavaWrapper();
|
||||
|
||||
if (!strchr(m_Wrap, '/')) {
|
||||
// Add the wrapper package name
|
||||
char *wn = (char*)PlugSubAlloc(g, NULL, strlen(m_Wrap) + 10);
|
||||
m_Wrap = strcat(strcpy(wn, "wrappers/"), m_Wrap);
|
||||
} // endif m_Wrap
|
||||
|
||||
fp = NULL;
|
||||
m_Opened = false;
|
||||
m_Connected = false;
|
||||
m_Rows = 0;
|
||||
//*m_ErrMsg = '\0';
|
||||
} // end of JAVAConn
|
||||
|
||||
//JAVAConn::~JAVAConn()
|
||||
// {
|
||||
//if (Connected())
|
||||
// EndCom();
|
||||
|
||||
// } // end of ~JAVAConn
|
||||
|
||||
/***********************************************************************/
|
||||
/* Screen for errors. */
|
||||
/***********************************************************************/
|
||||
bool JAVAConn::Check(jint rc)
|
||||
{
|
||||
jstring s;
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
jthrowable exc = env->ExceptionOccurred();
|
||||
jmethodID tid = env->GetMethodID(env->FindClass("java/lang/Object"),
|
||||
"toString", "()Ljava/lang/String;");
|
||||
|
||||
if (exc != nullptr && tid != nullptr) {
|
||||
jstring s = (jstring)env->CallObjectMethod(exc, tid);
|
||||
const char *utf = env->GetStringUTFChars(s, (jboolean)false);
|
||||
env->DeleteLocalRef(s);
|
||||
Msg = PlugDup(m_G, utf);
|
||||
} else
|
||||
Msg = "Exception occured";
|
||||
|
||||
env->ExceptionClear();
|
||||
} else if (rc < 0) {
|
||||
s = (jstring)env->CallObjectMethod(job, errid);
|
||||
Msg = (char*)env->GetStringUTFChars(s, (jboolean)false);
|
||||
} else
|
||||
Msg = NULL;
|
||||
|
||||
return (Msg != NULL);
|
||||
} // end of Check
|
||||
|
||||
/***********************************************************************/
|
||||
/* Get MethodID if not exists yet. */
|
||||
/***********************************************************************/
|
||||
bool JAVAConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig)
|
||||
{
|
||||
if (mid == nullptr) {
|
||||
mid = env->GetMethodID(jdi, name, sig);
|
||||
|
||||
if (Check()) {
|
||||
strcpy(g->Message, Msg);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
} else
|
||||
return false;
|
||||
|
||||
} // end of gmID
|
||||
|
||||
#if 0
|
||||
/***********************************************************************/
|
||||
/* Utility routine. */
|
||||
/***********************************************************************/
|
||||
int JAVAConn::GetMaxValue(int n)
|
||||
{
|
||||
jint m;
|
||||
jmethodID maxid = nullptr;
|
||||
|
||||
if (gmID(m_G, maxid, "GetMaxValue", "(I)I"))
|
||||
return -1;
|
||||
|
||||
// call method
|
||||
if (Check(m = env->CallIntMethod(job, maxid, n)))
|
||||
htrc("GetMaxValue: %s", Msg);
|
||||
|
||||
return (int)m;
|
||||
} // end of GetMaxValue
|
||||
#endif // 0
|
||||
|
||||
/***********************************************************************/
|
||||
/* Reset the JVM library. */
|
||||
/***********************************************************************/
|
||||
void JAVAConn::ResetJVM(void)
|
||||
{
|
||||
if (LibJvm) {
|
||||
#if defined(__WIN__)
|
||||
FreeLibrary((HMODULE)LibJvm);
|
||||
#else // !__WIN__
|
||||
dlclose(LibJvm);
|
||||
#endif // !__WIN__
|
||||
LibJvm = NULL;
|
||||
CreateJavaVM = NULL;
|
||||
GetCreatedJavaVMs = NULL;
|
||||
#if defined(_DEBUG)
|
||||
GetDefaultJavaVMInitArgs = NULL;
|
||||
#endif // _DEBUG
|
||||
} // endif LibJvm
|
||||
|
||||
} // end of ResetJVM
|
||||
|
||||
/***********************************************************************/
|
||||
/* Dynamically link the JVM library. */
|
||||
/* The purpose of this function is to allow using the CONNECT plugin */
|
||||
/* for other table types when the Java JDK is not installed. */
|
||||
/***********************************************************************/
|
||||
bool JAVAConn::GetJVM(PGLOBAL g)
|
||||
{
|
||||
int ntry;
|
||||
|
||||
if (!LibJvm) {
|
||||
char soname[512];
|
||||
|
||||
#if defined(__WIN__)
|
||||
for (ntry = 0; !LibJvm && ntry < 3; ntry++) {
|
||||
if (!ntry && JvmPath) {
|
||||
strcat(strcpy(soname, JvmPath), "\\jvm.dll");
|
||||
ntry = 3; // No other try
|
||||
} else if (ntry < 2 && getenv("JAVA_HOME")) {
|
||||
strcpy(soname, getenv("JAVA_HOME"));
|
||||
|
||||
if (ntry == 1)
|
||||
strcat(soname, "\\jre");
|
||||
|
||||
strcat(soname, "\\bin\\client\\jvm.dll");
|
||||
} else {
|
||||
// Try to find it through the registry
|
||||
char version[16];
|
||||
char javaKey[64] = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
|
||||
LONG rc;
|
||||
DWORD BufferSize = 16;
|
||||
|
||||
strcpy(soname, "jvm.dll"); // In case it fails
|
||||
|
||||
if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "CurrentVersion",
|
||||
RRF_RT_ANY, NULL, (PVOID)&version, &BufferSize)) == ERROR_SUCCESS) {
|
||||
strcat(strcat(javaKey, "\\"), version);
|
||||
BufferSize = sizeof(soname);
|
||||
|
||||
if ((rc = RegGetValue(HKEY_LOCAL_MACHINE, javaKey, "RuntimeLib",
|
||||
RRF_RT_ANY, NULL, (PVOID)&soname, &BufferSize)) != ERROR_SUCCESS)
|
||||
printf("RegGetValue: rc=%ld\n", rc);
|
||||
|
||||
} // endif rc
|
||||
|
||||
ntry = 3; // Try this only once
|
||||
} // endelse
|
||||
|
||||
// Load the desired shared library
|
||||
LibJvm = LoadLibrary(soname);
|
||||
} // endfor ntry
|
||||
|
||||
// Get the needed entries
|
||||
if (!LibJvm) {
|
||||
char buf[256];
|
||||
DWORD rc = GetLastError();
|
||||
|
||||
sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, soname);
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0,
|
||||
(LPTSTR)buf, sizeof(buf), NULL);
|
||||
strcat(strcat(g->Message, ": "), buf);
|
||||
} else if (!(CreateJavaVM = (CRTJVM)GetProcAddress((HINSTANCE)LibJvm,
|
||||
"JNI_CreateJavaVM"))) {
|
||||
sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_CreateJavaVM");
|
||||
FreeLibrary((HMODULE)LibJvm);
|
||||
LibJvm = NULL;
|
||||
} else if (!(GetCreatedJavaVMs = (GETJVM)GetProcAddress((HINSTANCE)LibJvm,
|
||||
"JNI_GetCreatedJavaVMs"))) {
|
||||
sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(), "JNI_GetCreatedJavaVMs");
|
||||
FreeLibrary((HMODULE)LibJvm);
|
||||
LibJvm = NULL;
|
||||
#if defined(_DEBUG)
|
||||
} else if (!(GetDefaultJavaVMInitArgs = (GETDEF)GetProcAddress((HINSTANCE)LibJvm,
|
||||
"JNI_GetDefaultJavaVMInitArgs"))) {
|
||||
sprintf(g->Message, MSG(PROCADD_ERROR), GetLastError(),
|
||||
"JNI_GetDefaultJavaVMInitArgs");
|
||||
FreeLibrary((HMODULE)LibJvm);
|
||||
LibJvm = NULL;
|
||||
#endif // _DEBUG
|
||||
} // endif LibJvm
|
||||
#else // !__WIN__
|
||||
const char *error = NULL;
|
||||
|
||||
for (ntry = 0; !LibJvm && ntry < 2; ntry++) {
|
||||
if (!ntry && JvmPath) {
|
||||
strcat(strcpy(soname, JvmPath), "/libjvm.so");
|
||||
ntry = 2;
|
||||
} else if (!ntry && getenv("JAVA_HOME")) {
|
||||
// TODO: Replace i386 by a better guess
|
||||
strcat(strcpy(soname, getenv("JAVA_HOME")), "/jre/lib/i386/client/libjvm.so");
|
||||
} else { // Will need LD_LIBRARY_PATH to be set
|
||||
strcpy(soname, "libjvm.so");
|
||||
ntry = 2;
|
||||
} // endelse
|
||||
|
||||
LibJvm = dlopen(soname, RTLD_LAZY);
|
||||
} // endfor ntry
|
||||
|
||||
// Load the desired shared library
|
||||
if (!LibJvm) {
|
||||
error = dlerror();
|
||||
sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error));
|
||||
} else if (!(CreateJavaVM = (CRTJVM)dlsym(LibJvm, "JNI_CreateJavaVM"))) {
|
||||
error = dlerror();
|
||||
sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_CreateJavaVM", SVP(error));
|
||||
dlclose(LibJvm);
|
||||
LibJvm = NULL;
|
||||
} else if (!(GetCreatedJavaVMs = (GETJVM)dlsym(LibJvm, "JNI_GetCreatedJavaVMs"))) {
|
||||
error = dlerror();
|
||||
sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetCreatedJavaVMs", SVP(error));
|
||||
dlclose(LibJvm);
|
||||
LibJvm = NULL;
|
||||
#if defined(_DEBUG)
|
||||
} else if (!(GetDefaultJavaVMInitArgs = (GETDEF)dlsym(LibJvm,
|
||||
"JNI_GetDefaultJavaVMInitArgs"))) {
|
||||
error = dlerror();
|
||||
sprintf(g->Message, MSG(GET_FUNC_ERR), "JNI_GetDefaultJavaVMInitArgs", SVP(error));
|
||||
dlclose(LibJvm);
|
||||
LibJvm = NULL;
|
||||
#endif // _DEBUG
|
||||
} // endif LibJvm
|
||||
#endif // !__WIN__
|
||||
|
||||
} // endif LibJvm
|
||||
|
||||
return LibJvm == NULL;
|
||||
} // end of GetJVM
|
||||
|
||||
/***********************************************************************/
|
||||
/* Open: connect to a data source. */
|
||||
/***********************************************************************/
|
||||
bool JAVAConn::Open(PGLOBAL g)
|
||||
{
|
||||
bool brc = true, err = false;
|
||||
jboolean jt = (trace > 0);
|
||||
|
||||
// Link or check whether jvm library was linked
|
||||
if (GetJVM(g))
|
||||
return true;
|
||||
|
||||
// Firstly check whether the jvm was already created
|
||||
JavaVM* jvms[1];
|
||||
jsize jsz;
|
||||
jint rc = GetCreatedJavaVMs(jvms, 1, &jsz);
|
||||
|
||||
if (rc == JNI_OK && jsz == 1) {
|
||||
// jvm already existing
|
||||
jvm = jvms[0];
|
||||
rc = jvm->AttachCurrentThread((void**)&env, nullptr);
|
||||
|
||||
if (rc != JNI_OK) {
|
||||
strcpy(g->Message, "Cannot attach jvm to the current thread");
|
||||
return true;
|
||||
} // endif rc
|
||||
|
||||
} else {
|
||||
/*******************************************************************/
|
||||
/* Create a new jvm */
|
||||
/*******************************************************************/
|
||||
PSTRG jpop = new(g)STRING(g, 512, "-Djava.class.path=.");
|
||||
char *cp = NULL;
|
||||
char sep;
|
||||
|
||||
#if defined(__WIN__)
|
||||
sep = ';';
|
||||
#define N 1
|
||||
//#define N 2
|
||||
//#define N 3
|
||||
#else
|
||||
sep = ':';
|
||||
#define N 1
|
||||
#endif
|
||||
|
||||
// Add wrappers jar files
|
||||
AddJars(jpop, sep);
|
||||
|
||||
//================== prepare loading of Java VM ============================
|
||||
JavaVMInitArgs vm_args; // Initialization arguments
|
||||
JavaVMOption* options = new JavaVMOption[N]; // JVM invocation options
|
||||
|
||||
// where to find java .class
|
||||
if (ClassPath && *ClassPath) {
|
||||
jpop->Append(sep);
|
||||
jpop->Append(ClassPath);
|
||||
} // endif ClassPath
|
||||
|
||||
// Java source will be compiled as a jar file installed in the plugin dir
|
||||
jpop->Append(sep);
|
||||
jpop->Append(GetPluginDir());
|
||||
jpop->Append("JdbcInterface.jar");
|
||||
|
||||
// All wrappers are pre-compiled in JavaWrappers.jar in the plugin dir
|
||||
jpop->Append(sep);
|
||||
jpop->Append(GetPluginDir());
|
||||
jpop->Append("JavaWrappers.jar");
|
||||
|
||||
if ((cp = getenv("CLASSPATH"))) {
|
||||
jpop->Append(sep);
|
||||
jpop->Append(cp);
|
||||
} // endif cp
|
||||
|
||||
if (trace) {
|
||||
htrc("ClassPath=%s\n", ClassPath);
|
||||
htrc("CLASSPATH=%s\n", cp);
|
||||
htrc("%s\n", jpop->GetStr());
|
||||
} // endif trace
|
||||
|
||||
options[0].optionString = jpop->GetStr();
|
||||
#if N == 2
|
||||
options[1].optionString = "-Xcheck:jni";
|
||||
#endif
|
||||
#if N == 3
|
||||
options[1].optionString = "-Xms256M";
|
||||
options[2].optionString = "-Xmx512M";
|
||||
#endif
|
||||
#if defined(_DEBUG)
|
||||
vm_args.version = JNI_VERSION_1_2; // minimum Java version
|
||||
rc = GetDefaultJavaVMInitArgs(&vm_args);
|
||||
#else
|
||||
vm_args.version = JNI_VERSION_1_6; // minimum Java version
|
||||
#endif // _DEBUG
|
||||
vm_args.nOptions = N; // number of options
|
||||
vm_args.options = options;
|
||||
vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail
|
||||
|
||||
//=============== load and initialize Java VM and JNI interface =============
|
||||
rc = CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !!
|
||||
delete options; // we then no longer need the initialisation options.
|
||||
|
||||
switch (rc) {
|
||||
case JNI_OK:
|
||||
strcpy(g->Message, "VM successfully created");
|
||||
brc = false;
|
||||
break;
|
||||
case JNI_ERR:
|
||||
strcpy(g->Message, "Initialising JVM failed: unknown error");
|
||||
break;
|
||||
case JNI_EDETACHED:
|
||||
strcpy(g->Message, "Thread detached from the VM");
|
||||
break;
|
||||
case JNI_EVERSION:
|
||||
strcpy(g->Message, "JNI version error");
|
||||
break;
|
||||
case JNI_ENOMEM:
|
||||
strcpy(g->Message, "Not enough memory");
|
||||
break;
|
||||
case JNI_EEXIST:
|
||||
strcpy(g->Message, "VM already created");
|
||||
break;
|
||||
case JNI_EINVAL:
|
||||
strcpy(g->Message, "Invalid arguments");
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, "Unknown return code %d", (int)rc);
|
||||
break;
|
||||
} // endswitch rc
|
||||
|
||||
if (trace)
|
||||
htrc("%s\n", g->Message);
|
||||
|
||||
if (brc)
|
||||
return true;
|
||||
|
||||
//=============== Display JVM version ===============
|
||||
jint ver = env->GetVersion();
|
||||
printf("JVM Version %d.%d\n", ((ver >> 16) & 0x0f), (ver & 0x0f));
|
||||
} // endif rc
|
||||
|
||||
// try to find the java wrapper class
|
||||
jdi = env->FindClass(m_Wrap);
|
||||
|
||||
if (jdi == nullptr) {
|
||||
sprintf(g->Message, "ERROR: class %s not found!", m_Wrap);
|
||||
return true;
|
||||
} // endif jdi
|
||||
|
||||
#if 0 // Suppressed because it does not make any usable change
|
||||
if (b && jpath && *jpath) {
|
||||
// Try to add that path the the jvm class path
|
||||
jmethodID alp = env->GetStaticMethodID(jdi, "addLibraryPath",
|
||||
"(Ljava/lang/String;)I");
|
||||
|
||||
if (alp == nullptr) {
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
} else {
|
||||
char *msg;
|
||||
jstring path = env->NewStringUTF(jpath);
|
||||
rc = env->CallStaticIntMethod(jdi, alp, path);
|
||||
|
||||
if ((msg = Check(rc))) {
|
||||
strcpy(g->Message, msg);
|
||||
env->DeleteLocalRef(path);
|
||||
return RC_FX;
|
||||
} else switch (rc) {
|
||||
case JNI_OK:
|
||||
printf("jpath added\n");
|
||||
break;
|
||||
case JNI_EEXIST:
|
||||
printf("jpath already exist\n");
|
||||
break;
|
||||
case JNI_ERR:
|
||||
default:
|
||||
strcpy(g->Message, "Error adding jpath");
|
||||
env->DeleteLocalRef(path);
|
||||
return RC_FX;
|
||||
} // endswitch rc
|
||||
|
||||
env->DeleteLocalRef(path);
|
||||
} // endif alp
|
||||
|
||||
} // endif jpath
|
||||
#endif // 0
|
||||
|
||||
// if class found, continue
|
||||
jmethodID ctor = env->GetMethodID(jdi, "<init>", "(Z)V");
|
||||
|
||||
if (ctor == nullptr) {
|
||||
sprintf(g->Message, "ERROR: %s constructor not found!", m_Wrap);
|
||||
return true;
|
||||
} else
|
||||
job = env->NewObject(jdi, ctor, jt);
|
||||
|
||||
if (job == nullptr) {
|
||||
sprintf(g->Message, "%s class object not constructed!", m_Wrap);
|
||||
return true;
|
||||
} // endif job
|
||||
|
||||
// If the object is successfully constructed,
|
||||
// we can then search for the method we want to call,
|
||||
// and invoke it for the object:
|
||||
errid = env->GetMethodID(jdi, "GetErrmsg", "()Ljava/lang/String;");
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
strcpy(g->Message, "ERROR: method GetErrmsg() not found!");
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
return true;
|
||||
} // endif Check
|
||||
|
||||
/*********************************************************************/
|
||||
/* Link a Fblock. This make possible to automatically close it */
|
||||
/* in case of error (throw). */
|
||||
/*********************************************************************/
|
||||
PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr;
|
||||
|
||||
fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK));
|
||||
fp->Type = TYPE_FB_JAVA;
|
||||
fp->Fname = NULL;
|
||||
fp->Next = dbuserp->Openlist;
|
||||
dbuserp->Openlist = fp;
|
||||
fp->Count = 1;
|
||||
fp->Length = 0;
|
||||
fp->Memory = NULL;
|
||||
fp->Mode = MODE_ANY;
|
||||
fp->File = this;
|
||||
fp->Handle = 0;
|
||||
|
||||
m_Opened = true;
|
||||
return false;
|
||||
} // end of Open
|
||||
|
||||
/***********************************************************************/
|
||||
/* Disconnect connection */
|
||||
/***********************************************************************/
|
||||
void JAVAConn::Close()
|
||||
{
|
||||
jint rc;
|
||||
|
||||
if (m_Connected) {
|
||||
jmethodID did = nullptr;
|
||||
|
||||
// Could have been detached in case of join
|
||||
rc = jvm->AttachCurrentThread((void**)&env, nullptr);
|
||||
|
||||
if (gmID(m_G, did, DiscFunc, "()I"))
|
||||
printf("%s\n", Msg);
|
||||
else if (Check(env->CallIntMethod(job, did)))
|
||||
printf("%s: %s\n", DiscFunc, Msg);
|
||||
|
||||
m_Connected = false;
|
||||
} // endif m_Connected
|
||||
|
||||
if ((rc = jvm->DetachCurrentThread()) != JNI_OK)
|
||||
printf("DetachCurrentThread: rc=%d\n", (int)rc);
|
||||
|
||||
if (fp)
|
||||
fp->Count = 0;
|
||||
|
||||
m_Opened = false;
|
||||
} // end of Close
|
||||
129
storage/connect/javaconn.h
Normal file
129
storage/connect/javaconn.h
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/***********************************************************************/
|
||||
/* JavaConn.h : header file for the Java connection classes. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Included C-definition files required by the interface. */
|
||||
/***********************************************************************/
|
||||
#include "block.h"
|
||||
#include "jdbccat.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* Java native interface. */
|
||||
/***********************************************************************/
|
||||
#include <jni.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constants and defines. */
|
||||
/***********************************************************************/
|
||||
// Miscellaneous sizing info
|
||||
#define MAX_NUM_OF_MSG 10 // Max number of error messages
|
||||
//efine MAX_CURRENCY 30 // Max size of Currency($) string
|
||||
#define MAX_TNAME_LEN 32 // Max size of table names
|
||||
//efine MAX_FNAME_LEN 256 // Max size of field names
|
||||
//efine MAX_STRING_INFO 256 // Max size of string from SQLGetInfo
|
||||
//efine MAX_DNAME_LEN 256 // Max size of Recordset names
|
||||
//efine MAX_CONNECT_LEN 512 // Max size of Connect string
|
||||
//efine MAX_CURSOR_NAME 18 // Max size of a cursor name
|
||||
//efine DEFAULT_FIELD_TYPE 0 // TYPE_NULL
|
||||
|
||||
#if !defined(__WIN__)
|
||||
typedef unsigned char *PUCHAR;
|
||||
#endif // !__WIN__
|
||||
|
||||
enum JCATINFO {
|
||||
JCAT_TAB = 1, // JDBC Tables
|
||||
JCAT_COL = 2, // JDBC Columns
|
||||
JCAT_KEY = 3, // JDBC PrimaryKeys
|
||||
};
|
||||
|
||||
/***********************************************************************/
|
||||
/* This structure is used to control the catalog functions. */
|
||||
/***********************************************************************/
|
||||
typedef struct tagJCATPARM {
|
||||
JCATINFO Id; // Id to indicate function
|
||||
PQRYRES Qrp; // Result set pointer
|
||||
PCSZ DB; // Database (Schema)
|
||||
PCSZ Tab; // Table name or pattern
|
||||
PCSZ Pat; // Table type or column pattern
|
||||
} JCATPARM;
|
||||
|
||||
typedef jint(JNICALL *CRTJVM) (JavaVM **, void **, void *);
|
||||
typedef jint(JNICALL *GETJVM) (JavaVM **, jsize, jsize *);
|
||||
#if defined(_DEBUG)
|
||||
typedef jint(JNICALL *GETDEF) (void *);
|
||||
#endif // _DEBUG
|
||||
|
||||
class JAVAConn;
|
||||
|
||||
/***********************************************************************/
|
||||
/* JAVAConn class. */
|
||||
/***********************************************************************/
|
||||
class JAVAConn : public BLOCK {
|
||||
friend class TDBJMG;
|
||||
friend class JMGDISC;
|
||||
private:
|
||||
JAVAConn(); // Standard (unused) constructor
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
JAVAConn(PGLOBAL g, PCSZ wrapper);
|
||||
|
||||
// Set static variables
|
||||
static void SetJVM(void) {
|
||||
LibJvm = NULL;
|
||||
CreateJavaVM = NULL;
|
||||
GetCreatedJavaVMs = NULL;
|
||||
#if defined(_DEBUG)
|
||||
GetDefaultJavaVMInitArgs = NULL;
|
||||
#endif // _DEBUG
|
||||
} // end of SetJVM
|
||||
|
||||
static void ResetJVM(void);
|
||||
static bool GetJVM(PGLOBAL g);
|
||||
|
||||
// Implementation
|
||||
public:
|
||||
//virtual ~JAVAConn();
|
||||
bool IsOpen(void) { return m_Opened; }
|
||||
bool IsConnected(void) { return m_Connected; }
|
||||
|
||||
// Java operations
|
||||
protected:
|
||||
bool gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig);
|
||||
bool Check(jint rc = 0);
|
||||
|
||||
public:
|
||||
virtual void AddJars(PSTRG jpop, char sep) = 0;
|
||||
virtual bool Connect(PJPARM sop) = 0;
|
||||
virtual bool Open(PGLOBAL g);
|
||||
virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options,
|
||||
PCSZ filter, bool pipe) = 0;
|
||||
virtual void Close(void);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
#if defined(__WIN__)
|
||||
static HANDLE LibJvm; // Handle to the jvm DLL
|
||||
#else // !__WIN__
|
||||
static void *LibJvm; // Handle for the jvm shared library
|
||||
#endif // !__WIN__
|
||||
static CRTJVM CreateJavaVM;
|
||||
static GETJVM GetCreatedJavaVMs;
|
||||
#if defined(_DEBUG)
|
||||
static GETDEF GetDefaultJavaVMInitArgs;
|
||||
#endif // _DEBUG
|
||||
PGLOBAL m_G;
|
||||
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
|
||||
JNIEnv *env; // Pointer to native interface
|
||||
jclass jdi; // Pointer to the java wrapper class
|
||||
jobject job; // The java wrapper class object
|
||||
jmethodID errid; // The GetErrmsg method ID
|
||||
PFBLOCK fp;
|
||||
bool m_Opened;
|
||||
bool m_Connected;
|
||||
PCSZ DiscFunc;
|
||||
PCSZ Msg;
|
||||
PCSZ m_Wrap;
|
||||
int m_Rows;
|
||||
}; // end of JAVAConn class definition
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
#ifndef __JDBCCAT_H
|
||||
#define __JDBCCAT_H
|
||||
|
||||
// Timeout and net wait defaults
|
||||
#define DEFAULT_LOGIN_TIMEOUT -1 // means do not set
|
||||
#define DEFAULT_QUERY_TIMEOUT -1 // means do not set
|
||||
|
|
@ -8,9 +11,9 @@ typedef struct jdbc_parms {
|
|||
PCSZ Url; // Driver URL
|
||||
PCSZ User; // User connect info
|
||||
PCSZ Pwd; // Password connect info
|
||||
//char *Properties; // Connection property list
|
||||
//int Cto; // Connect timeout
|
||||
//int Qto; // Query timeout
|
||||
int Version; // Driver version
|
||||
int Fsize; // Fetch size
|
||||
bool Scrollable; // Scrollable cursor
|
||||
} JDBCPARM, *PJPARM;
|
||||
|
|
@ -28,3 +31,5 @@ PQRYRES JDBCSrcCols(PGLOBAL g, PCSZ src, PJPARM sop);
|
|||
PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat,
|
||||
PCSZ tabtyp, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info);
|
||||
|
||||
#endif // __JDBCCAT_H
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,61 +1,7 @@
|
|||
/***********************************************************************/
|
||||
/* JDBConn.h : header file for the JDBC connection classes. */
|
||||
/***********************************************************************/
|
||||
//nclude <windows.h> /* Windows include file */
|
||||
//nclude <windowsx.h> /* Message crackers */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Included C-definition files required by the interface. */
|
||||
/***********************************************************************/
|
||||
#include "block.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* JDBC interface. */
|
||||
/***********************************************************************/
|
||||
#include <jni.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constants and defines. */
|
||||
/***********************************************************************/
|
||||
// Miscellaneous sizing info
|
||||
#define MAX_NUM_OF_MSG 10 // Max number of error messages
|
||||
//efine MAX_CURRENCY 30 // Max size of Currency($) string
|
||||
#define MAX_TNAME_LEN 32 // Max size of table names
|
||||
//efine MAX_FNAME_LEN 256 // Max size of field names
|
||||
//efine MAX_STRING_INFO 256 // Max size of string from SQLGetInfo
|
||||
//efine MAX_DNAME_LEN 256 // Max size of Recordset names
|
||||
//efine MAX_CONNECT_LEN 512 // Max size of Connect string
|
||||
//efine MAX_CURSOR_NAME 18 // Max size of a cursor name
|
||||
#define DEFAULT_FIELD_TYPE 0 // TYPE_NULL
|
||||
|
||||
#if !defined(__WIN__)
|
||||
typedef unsigned char *PUCHAR;
|
||||
#endif // !__WIN__
|
||||
|
||||
enum JCATINFO {
|
||||
CAT_TAB = 1, // JDBC Tables
|
||||
CAT_COL = 2, // JDBC Columns
|
||||
CAT_KEY = 3, // JDBC PrimaryKeys
|
||||
//CAT_STAT = 4, // SQLStatistics
|
||||
//CAT_SPC = 5 // SQLSpecialColumns
|
||||
};
|
||||
|
||||
/***********************************************************************/
|
||||
/* This structure is used to control the catalog functions. */
|
||||
/***********************************************************************/
|
||||
typedef struct tagJCATPARM {
|
||||
JCATINFO Id; // Id to indicate function
|
||||
PQRYRES Qrp; // Result set pointer
|
||||
PCSZ DB; // Database (Schema)
|
||||
PCSZ Tab; // Table name or pattern
|
||||
PCSZ Pat; // Table type or column pattern
|
||||
} JCATPARM;
|
||||
|
||||
typedef jint(JNICALL *CRTJVM) (JavaVM **, void **, void *);
|
||||
typedef jint(JNICALL *GETJVM) (JavaVM **, jsize, jsize *);
|
||||
#if defined(_DEBUG)
|
||||
typedef jint(JNICALL *GETDEF) (void *);
|
||||
#endif // _DEBUG
|
||||
#include "javaconn.h"
|
||||
|
||||
// JDBC connection to a data source
|
||||
class TDBJDBC;
|
||||
|
|
@ -66,7 +12,7 @@ class TDBXJDC;
|
|||
/***********************************************************************/
|
||||
/* JDBConn class. */
|
||||
/***********************************************************************/
|
||||
class JDBConn : public BLOCK {
|
||||
class JDBConn : public JAVAConn {
|
||||
friend class TDBJDBC;
|
||||
friend class TDBXJDC;
|
||||
//friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&);
|
||||
|
|
@ -74,118 +20,80 @@ private:
|
|||
JDBConn(); // Standard (unused) constructor
|
||||
|
||||
public:
|
||||
JDBConn(PGLOBAL g, TDBJDBC *tdbp);
|
||||
// Constructor
|
||||
JDBConn(PGLOBAL g, PCSZ wrapper);
|
||||
|
||||
int Open(PJPARM sop);
|
||||
int Rewind(PCSZ sql);
|
||||
void Close(void);
|
||||
PQRYRES AllocateResult(PGLOBAL g);
|
||||
virtual void AddJars(PSTRG jpop, char sep);
|
||||
PQRYRES AllocateResult(PGLOBAL g, PTDB tdbp);
|
||||
|
||||
// Attributes
|
||||
public:
|
||||
char *GetQuoteChar(void) { return m_IDQuoteChar; }
|
||||
// Database successfully opened?
|
||||
bool IsOpen(void) { return m_Opened; }
|
||||
//PSZ GetStringInfo(ushort infotype);
|
||||
int GetMaxValue(int infotype);
|
||||
//PSZ GetConnect(void) { return m_Connect; }
|
||||
char *GetQuoteChar(void) { return m_IDQuoteChar; }
|
||||
virtual int GetMaxValue(int infotype);
|
||||
|
||||
public:
|
||||
// Operations
|
||||
//void SetLoginTimeout(DWORD sec) {m_LoginTimeout = sec;}
|
||||
//void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;}
|
||||
//void SetUserName(PSZ user) {m_User = user;}
|
||||
//void SetUserPwd(PSZ pwd) {m_Pwd = pwd;}
|
||||
int GetResultSize(PCSZ sql, JDBCCOL *colp);
|
||||
int ExecuteQuery(PCSZ sql);
|
||||
int ExecuteUpdate(PCSZ sql);
|
||||
int Fetch(int pos = 0);
|
||||
virtual bool Connect(PJPARM sop);
|
||||
virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options,
|
||||
PCSZ filter, bool pipe) {return true;}
|
||||
virtual int GetResultSize(PCSZ sql, PCOL colp);
|
||||
virtual int ExecuteCommand(PCSZ sql);
|
||||
virtual int ExecuteQuery(PCSZ sql);
|
||||
virtual int ExecuteUpdate(PCSZ sql);
|
||||
virtual int Fetch(int pos = 0);
|
||||
virtual void SetColumnValue(int rank, PSZ name, PVAL val);
|
||||
|
||||
// Jdbc operations
|
||||
bool PrepareSQL(PCSZ sql);
|
||||
int ExecuteSQL(void);
|
||||
int ExecuteSQL(void); // Prepared statement
|
||||
bool SetParam(JDBCCOL *colp);
|
||||
int ExecSQLcommand(PCSZ sql);
|
||||
void SetColumnValue(int rank, PSZ name, PVAL val);
|
||||
int GetCatInfo(JCATPARM *cap);
|
||||
//bool GetDataSources(PQRYRES qrp);
|
||||
bool GetDrivers(PQRYRES qrp);
|
||||
PQRYRES GetMetaData(PGLOBAL g, PCSZ src);
|
||||
|
||||
public:
|
||||
// Set static variables
|
||||
static void SetJVM(void) {
|
||||
LibJvm = NULL;
|
||||
CreateJavaVM = NULL;
|
||||
GetCreatedJavaVMs = NULL;
|
||||
#if defined(_DEBUG)
|
||||
GetDefaultJavaVMInitArgs = NULL;
|
||||
#endif // _DEBUG
|
||||
} // end of SetJVM
|
||||
|
||||
static void ResetJVM(void);
|
||||
static bool GetJVM(PGLOBAL g);
|
||||
int Rewind(PCSZ sql);
|
||||
|
||||
// Implementation
|
||||
public:
|
||||
//virtual ~JDBConn();
|
||||
|
||||
// JDBC operations
|
||||
protected:
|
||||
bool gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig);
|
||||
bool Check(jint rc = 0);
|
||||
//void ThrowDJX(int rc, PSZ msg/*, HSTMT hstmt = SQL_NULL_HSTMT*/);
|
||||
//void ThrowDJX(PSZ msg);
|
||||
//void Free(void);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
#if defined(__WIN__)
|
||||
static HANDLE LibJvm; // Handle to the jvm DLL
|
||||
#else // !__WIN__
|
||||
static void *LibJvm; // Handle for the jvm shared library
|
||||
#endif // !__WIN__
|
||||
static CRTJVM CreateJavaVM;
|
||||
static GETJVM GetCreatedJavaVMs;
|
||||
#if defined(_DEBUG)
|
||||
static GETDEF GetDefaultJavaVMInitArgs;
|
||||
#endif // _DEBUG
|
||||
PGLOBAL m_G;
|
||||
TDBJDBC *m_Tdb;
|
||||
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
|
||||
JNIEnv *env; // Pointer to native interface
|
||||
jclass jdi; // Pointer to the java wrapper class
|
||||
jobject job; // The java wrapper class object
|
||||
jmethodID xqid; // The ExecuteQuery method ID
|
||||
jmethodID xuid; // The ExecuteUpdate method ID
|
||||
jmethodID xid; // The Execute method ID
|
||||
jmethodID grs; // The GetResult method ID
|
||||
jmethodID readid; // The ReadNext method ID
|
||||
jmethodID fetchid; // The Fetch method ID
|
||||
jmethodID typid; // The ColumnType method ID
|
||||
jmethodID prepid; // The CreatePrepStmt method ID
|
||||
jmethodID xpid; // The ExecutePrep method ID
|
||||
jmethodID pcid; // The ClosePrepStmt method ID
|
||||
jmethodID errid; // The GetErrmsg method ID
|
||||
jmethodID objfldid; // The ObjectField method ID
|
||||
jmethodID chrfldid; // The StringField method ID
|
||||
jmethodID intfldid; // The IntField method ID
|
||||
jmethodID dblfldid; // The DoubleField method ID
|
||||
jmethodID fltfldid; // The FloatField method ID
|
||||
jmethodID datfldid; // The DateField method ID
|
||||
jmethodID timfldid; // The TimeField method ID
|
||||
jmethodID tspfldid; // The TimestampField method ID
|
||||
jmethodID bigfldid; // The BigintField method ID
|
||||
PCSZ Msg;
|
||||
char *m_Wrap;
|
||||
#if 0
|
||||
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
|
||||
JNIEnv *env; // Pointer to native interface
|
||||
jclass jdi; // Pointer to the java wrapper class
|
||||
jobject job; // The java wrapper class object
|
||||
jmethodID errid; // The GetErrmsg method ID
|
||||
#endif // 0
|
||||
jmethodID xqid; // The ExecuteQuery method ID
|
||||
jmethodID xuid; // The ExecuteUpdate method ID
|
||||
jmethodID xid; // The Execute method ID
|
||||
jmethodID grs; // The GetResult method ID
|
||||
jmethodID readid; // The ReadNext method ID
|
||||
jmethodID fetchid; // The Fetch method ID
|
||||
jmethodID typid; // The ColumnType method ID
|
||||
jmethodID prepid; // The CreatePrepStmt method ID
|
||||
jmethodID xpid; // The ExecutePrep method ID
|
||||
jmethodID pcid; // The ClosePrepStmt method ID
|
||||
jmethodID objfldid; // The ObjectField method ID
|
||||
jmethodID chrfldid; // The StringField method ID
|
||||
jmethodID intfldid; // The IntField method ID
|
||||
jmethodID dblfldid; // The DoubleField method ID
|
||||
jmethodID fltfldid; // The FloatField method ID
|
||||
jmethodID datfldid; // The DateField method ID
|
||||
jmethodID timfldid; // The TimeField method ID
|
||||
jmethodID tspfldid; // The TimestampField method ID
|
||||
jmethodID bigfldid; // The BigintField method ID
|
||||
// PCSZ Msg;
|
||||
// PCSZ m_Wrap;
|
||||
char m_IDQuoteChar[2];
|
||||
PCSZ m_Pwd;
|
||||
int m_Ncol;
|
||||
int m_Aff;
|
||||
int m_Rows;
|
||||
int m_Fetch;
|
||||
int m_RowsetSize;
|
||||
jboolean m_Updatable;
|
||||
jboolean m_Transact;
|
||||
jboolean m_Scrollable;
|
||||
bool m_Opened;
|
||||
bool m_Full;
|
||||
}; // end of JDBConn class definition
|
||||
|
|
|
|||
357
storage/connect/jmgfam.cpp
Normal file
357
storage/connect/jmgfam.cpp
Normal file
|
|
@ -0,0 +1,357 @@
|
|||
/************ JMONGO FAM C++ Program Source Code File (.CPP) ***********/
|
||||
/* PROGRAM NAME: jmgfam.cpp */
|
||||
/* ------------- */
|
||||
/* Version 1.0 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 20017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
/* This program are the Java MongoDB access method classes. */
|
||||
/* */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant sections of the System header files. */
|
||||
/***********************************************************************/
|
||||
#include "my_global.h"
|
||||
#if defined(__WIN__)
|
||||
//#include <io.h>
|
||||
//#include <fcntl.h>
|
||||
//#include <errno.h>
|
||||
#if defined(__BORLANDC__)
|
||||
#define __MFC_COMPAT__ // To define min/max as macro
|
||||
#endif // __BORLANDC__
|
||||
//#include <windows.h>
|
||||
#else // !__WIN__
|
||||
#if defined(UNIX) || defined(UNIV_LINUX)
|
||||
//#include <errno.h>
|
||||
#include <unistd.h>
|
||||
//#if !defined(sun) // Sun has the ftruncate fnc.
|
||||
//#define USETEMP // Force copy mode for DELETE
|
||||
//#endif // !sun
|
||||
#else // !UNIX
|
||||
//#include <io.h>
|
||||
#endif // !UNIX
|
||||
//#include <fcntl.h>
|
||||
#endif // !__WIN__
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include application header files: */
|
||||
/* global.h is header containing all global declarations. */
|
||||
/* plgdbsem.h is header containing the DB application declarations. */
|
||||
/* filamtxt.h is header containing the file AM classes declarations. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "reldef.h"
|
||||
#include "filamtxt.h"
|
||||
#include "tabdos.h"
|
||||
#include "tabjson.h"
|
||||
#include "jmgfam.h"
|
||||
|
||||
#if defined(UNIX) || defined(UNIV_LINUX)
|
||||
#include "osutil.h"
|
||||
//#define _fileno fileno
|
||||
//#define _O_RDONLY O_RDONLY
|
||||
#endif
|
||||
|
||||
/* --------------------------- Class JMGFAM -------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constructors. */
|
||||
/***********************************************************************/
|
||||
JMGFAM::JMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
|
||||
{
|
||||
Jcp = NULL;
|
||||
//Client = NULL;
|
||||
//Database = NULL;
|
||||
//Collection = NULL;
|
||||
//Cursor = NULL;
|
||||
//Query = NULL;
|
||||
//Opts = NULL;
|
||||
Ops.Driver = tdp->Schema;
|
||||
Ops.Url = tdp->Uri;
|
||||
Ops.User = NULL;
|
||||
Ops.Pwd = NULL;
|
||||
Ops.Scrollable = false;
|
||||
Ops.Fsize = 0;
|
||||
Ops.Version = tdp->Version;
|
||||
To_Fbt = NULL;
|
||||
Mode = MODE_ANY;
|
||||
Uristr = tdp->Uri;
|
||||
Db_name = tdp->Schema;
|
||||
Coll_name = tdp->Collname;
|
||||
Options = tdp->Options;
|
||||
Filter = tdp->Filter;
|
||||
Wrapname = tdp->Wrapname;
|
||||
Done = false;
|
||||
Pipe = tdp->Pipe;
|
||||
Version = tdp->Version;
|
||||
Lrecl = tdp->Lrecl + tdp->Ending;
|
||||
Curpos = 0;
|
||||
} // end of JMGFAM standard constructor
|
||||
|
||||
JMGFAM::JMGFAM(PJMGFAM tdfp) : DOSFAM(tdfp)
|
||||
{
|
||||
//Client = tdfp->Client;
|
||||
//Database = NULL;
|
||||
//Collection = tdfp->Collection;
|
||||
//Cursor = tdfp->Cursor;
|
||||
//Query = tdfp->Query;
|
||||
//Opts = tdfp->Opts;
|
||||
Ops = tdfp->Ops;
|
||||
To_Fbt = tdfp->To_Fbt;
|
||||
Mode = tdfp->Mode;
|
||||
Uristr = tdfp->Uristr;
|
||||
Db_name = tdfp->Db_name;
|
||||
Coll_name = tdfp->Coll_name;
|
||||
Options = tdfp->Options;
|
||||
Filter = NULL;
|
||||
Wrapname = tdfp->Wrapname;
|
||||
Done = tdfp->Done;
|
||||
Pipe = tdfp->Pipe;
|
||||
Version = tdfp->Version;
|
||||
} // end of JMGFAM copy constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Reset: reset position values at the beginning of file. */
|
||||
/***********************************************************************/
|
||||
void JMGFAM::Reset(void)
|
||||
{
|
||||
TXTFAM::Reset();
|
||||
Fpos = Tpos = Spos = 0;
|
||||
} // end of Reset
|
||||
|
||||
/***********************************************************************/
|
||||
/* MGO GetFileLength: returns file size in number of bytes. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::GetFileLength(PGLOBAL g)
|
||||
{
|
||||
return 0;
|
||||
} // end of GetFileLength
|
||||
|
||||
/***********************************************************************/
|
||||
/* Cardinality: returns table cardinality in number of rows. */
|
||||
/* This function can be called with a null argument to test the */
|
||||
/* availability of Cardinality implementation (1 yes, 0 no). */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::Cardinality(PGLOBAL g)
|
||||
{
|
||||
if (!g)
|
||||
return 1;
|
||||
|
||||
return (!Init(g)) ? Jcp->CollSize(g) : 0;
|
||||
} // end of Cardinality
|
||||
|
||||
/***********************************************************************/
|
||||
/* Note: This function is not really implemented yet. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::MaxBlkSize(PGLOBAL, int s)
|
||||
{
|
||||
return s;
|
||||
} // end of MaxBlkSize
|
||||
|
||||
/***********************************************************************/
|
||||
/* Init: initialize MongoDB processing. */
|
||||
/***********************************************************************/
|
||||
bool JMGFAM::Init(PGLOBAL g)
|
||||
{
|
||||
if (Done)
|
||||
return false;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Open an JDBC connection for this table. */
|
||||
/* Note: this may not be the proper way to do. Perhaps it is better */
|
||||
/* to test whether a connection is already open for this datasource */
|
||||
/* and if so to allocate just a new result set. But this only for */
|
||||
/* drivers allowing concurency in getting results ??? */
|
||||
/*********************************************************************/
|
||||
if (!Jcp)
|
||||
Jcp = new(g) JMgoConn(g, Coll_name, Wrapname);
|
||||
else if (Jcp->IsOpen())
|
||||
Jcp->Close();
|
||||
|
||||
if (Jcp->Connect(&Ops))
|
||||
return true;
|
||||
|
||||
Done = true;
|
||||
return false;
|
||||
} // end of Init
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a MongoDB table. */
|
||||
/***********************************************************************/
|
||||
bool JMGFAM::OpenTableFile(PGLOBAL g)
|
||||
{
|
||||
Mode = Tdbp->GetMode();
|
||||
|
||||
if (Pipe && Mode != MODE_READ) {
|
||||
strcpy(g->Message, "Pipeline tables are read only");
|
||||
return true;
|
||||
} // endif Pipe
|
||||
|
||||
if (Init(g))
|
||||
return true;
|
||||
|
||||
if (Jcp->GetMethodId(g, Mode))
|
||||
return true;
|
||||
|
||||
if (Mode == MODE_DELETE && !Tdbp->GetNext()) {
|
||||
// Delete all documents
|
||||
if (!Jcp->MakeCursor(g, Tdbp, "all", Filter, false))
|
||||
if (Jcp->DocDelete(g, true) == RC_OK)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
} // endif Mode
|
||||
|
||||
if (Mode == MODE_INSERT)
|
||||
Jcp->MakeColumnGroups(g, Tdbp);
|
||||
|
||||
if (Mode != MODE_UPDATE)
|
||||
return Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe);
|
||||
|
||||
return false;
|
||||
} // end of OpenTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetRowID: return the RowID of last read record. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::GetRowID(void)
|
||||
{
|
||||
return Rows;
|
||||
} // end of GetRowID
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetPos: return the position of last read record. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::GetPos(void)
|
||||
{
|
||||
return Fpos;
|
||||
} // end of GetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetNextPos: return the position of next record. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::GetNextPos(void)
|
||||
{
|
||||
return Fpos; // TODO
|
||||
} // end of GetNextPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* SetPos: Replace the table at the specified position. */
|
||||
/***********************************************************************/
|
||||
bool JMGFAM::SetPos(PGLOBAL g, int pos)
|
||||
{
|
||||
Fpos = pos;
|
||||
Placed = true;
|
||||
return false;
|
||||
} // end of SetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Record file position in case of UPDATE or DELETE. */
|
||||
/***********************************************************************/
|
||||
bool JMGFAM::RecordPos(PGLOBAL g)
|
||||
{
|
||||
strcpy(g->Message, "JMGFAM::RecordPos NIY");
|
||||
return true;
|
||||
} // end of RecordPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Initialize Fpos and the current position for indexed DELETE. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::InitDelete(PGLOBAL g, int fpos, int spos)
|
||||
{
|
||||
strcpy(g->Message, "JMGFAM::InitDelete NIY");
|
||||
return RC_FX;
|
||||
} // end of InitDelete
|
||||
|
||||
/***********************************************************************/
|
||||
/* Skip one record in file. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::SkipRecord(PGLOBAL g, bool header)
|
||||
{
|
||||
return RC_OK; // Dummy
|
||||
} // end of SkipRecord
|
||||
|
||||
/***********************************************************************/
|
||||
/* ReadBuffer: Get next document from a collection. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::ReadBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_FX;
|
||||
|
||||
if (!Curpos && Mode == MODE_UPDATE)
|
||||
if (Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe))
|
||||
return RC_FX;
|
||||
|
||||
if (++CurNum >= Rbuf) {
|
||||
Rbuf = Jcp->Fetch();
|
||||
Curpos++;
|
||||
CurNum = 0;
|
||||
} // endif CurNum
|
||||
|
||||
if (Rbuf > 0) {
|
||||
PSZ str = Jcp->GetDocument();
|
||||
|
||||
if (str) {
|
||||
if (trace == 1)
|
||||
htrc("%s\n", str);
|
||||
|
||||
strncpy(Tdbp->GetLine(), str, Lrecl);
|
||||
rc = RC_OK;
|
||||
} else
|
||||
strcpy(g->Message, "Null document");
|
||||
|
||||
} else if (!Rbuf)
|
||||
rc = RC_EF;
|
||||
|
||||
return rc;
|
||||
} // end of ReadBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteBuffer: File write routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::WriteBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
|
||||
if (Mode == MODE_INSERT) {
|
||||
rc = Jcp->DocWrite(g);
|
||||
} else if (Mode == MODE_DELETE) {
|
||||
rc = Jcp->DocDelete(g, false);
|
||||
} else if (Mode == MODE_UPDATE) {
|
||||
rc = Jcp->DocUpdate(g, Tdbp);
|
||||
} // endif Mode
|
||||
|
||||
return rc;
|
||||
} // end of WriteBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* Data Base delete line routine for MGO and BLK access methods. */
|
||||
/***********************************************************************/
|
||||
int JMGFAM::DeleteRecords(PGLOBAL g, int irc)
|
||||
{
|
||||
return (irc == RC_OK) ? WriteBuffer(g) : RC_OK;
|
||||
} // end of DeleteRecords
|
||||
|
||||
/***********************************************************************/
|
||||
/* Table file close routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void JMGFAM::CloseTableFile(PGLOBAL g, bool)
|
||||
{
|
||||
Jcp->Close();
|
||||
Done = false;
|
||||
} // end of CloseTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* Rewind routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void JMGFAM::Rewind(void)
|
||||
{
|
||||
Jcp->Rewind();
|
||||
} // end of Rewind
|
||||
|
||||
79
storage/connect/jmgfam.h
Normal file
79
storage/connect/jmgfam.h
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
/************** MongoFam H Declares Source Code File (.H) **************/
|
||||
/* Name: jmgfam.h Version 1.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the JAVA MongoDB access method classes declares */
|
||||
/***********************************************************************/
|
||||
#pragma once
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include MongoDB library header files. */
|
||||
/***********************************************************************/
|
||||
#include "block.h"
|
||||
//#include "mongo.h"
|
||||
#include "jmgoconn.h"
|
||||
|
||||
typedef class JMGFAM *PJMGFAM;
|
||||
typedef class MGODEF *PMGODEF;
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the Java MongoDB Access Method class declaration. */
|
||||
/***********************************************************************/
|
||||
class DllExport JMGFAM : public DOSFAM {
|
||||
friend void mongo_init(bool);
|
||||
public:
|
||||
// Constructor
|
||||
JMGFAM(PJDEF tdp);
|
||||
JMGFAM(PJMGFAM txfp);
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) { return TYPE_AM_MGO; }
|
||||
virtual bool GetUseTemp(void) { return false; }
|
||||
virtual int GetPos(void);
|
||||
virtual int GetNextPos(void);
|
||||
virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) JMGFAM(this); }
|
||||
void SetLrecl(int lrecl) { Lrecl = lrecl; }
|
||||
|
||||
// Methods
|
||||
virtual void Reset(void);
|
||||
virtual int GetFileLength(PGLOBAL g);
|
||||
virtual int Cardinality(PGLOBAL g);
|
||||
virtual int MaxBlkSize(PGLOBAL g, int s);
|
||||
virtual bool AllocateBuffer(PGLOBAL g) { return false; }
|
||||
virtual int GetRowID(void);
|
||||
virtual bool RecordPos(PGLOBAL g);
|
||||
virtual bool SetPos(PGLOBAL g, int recpos);
|
||||
virtual int SkipRecord(PGLOBAL g, bool header);
|
||||
virtual bool OpenTableFile(PGLOBAL g);
|
||||
virtual int ReadBuffer(PGLOBAL g);
|
||||
virtual int WriteBuffer(PGLOBAL g);
|
||||
virtual int DeleteRecords(PGLOBAL g, int irc);
|
||||
virtual void CloseTableFile(PGLOBAL g, bool abort);
|
||||
virtual void Rewind(void);
|
||||
|
||||
protected:
|
||||
virtual bool OpenTempFile(PGLOBAL g) { return false; }
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; }
|
||||
virtual int RenameTempFile(PGLOBAL g) { return RC_OK; }
|
||||
virtual int InitDelete(PGLOBAL g, int fpos, int spos);
|
||||
bool Init(PGLOBAL g);
|
||||
//bool MakeCursor(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
JMgoConn *Jcp; // Points to a Mongo connection class
|
||||
JDBCPARM Ops; // Additional parameters
|
||||
PFBLOCK To_Fbt; // Pointer to temp file block
|
||||
MODE Mode;
|
||||
PCSZ Uristr;
|
||||
PCSZ Db_name;
|
||||
PCSZ Coll_name;
|
||||
PCSZ Options;
|
||||
PCSZ Filter;
|
||||
PSZ Wrapname;
|
||||
bool Done; // Init done
|
||||
bool Pipe;
|
||||
int Version;
|
||||
int Curpos; // Cursor position of last fetch
|
||||
}; // end of class JMGFAM
|
||||
|
||||
813
storage/connect/jmgoconn.cpp
Normal file
813
storage/connect/jmgoconn.cpp
Normal file
|
|
@ -0,0 +1,813 @@
|
|||
/************ JMgoConn C++ Functions Source Code File (.CPP) ***********/
|
||||
/* Name: JMgoConn.CPP Version 1.1 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the MongoDB Java connection classes functions. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant MariaDB header file. */
|
||||
/***********************************************************************/
|
||||
#include <my_global.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Required objects includes. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "colblk.h"
|
||||
#include "xobject.h"
|
||||
#include "xtable.h"
|
||||
#include "filter.h"
|
||||
#include "jmgoconn.h"
|
||||
|
||||
#define nullptr 0
|
||||
|
||||
bool IsNum(PSZ s);
|
||||
|
||||
/* --------------------------- Class JNCOL --------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Add a column in the column list. */
|
||||
/***********************************************************************/
|
||||
void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp)
|
||||
{
|
||||
char *p;
|
||||
PJKC kp, kcp;
|
||||
|
||||
if ((p = strchr(jp, '.'))) {
|
||||
PJNCOL icp;
|
||||
|
||||
*p++ = 0;
|
||||
|
||||
for (kp = Klist; kp; kp = kp->Next)
|
||||
if (kp->Jncolp && !strcmp(jp, kp->Key))
|
||||
break;
|
||||
|
||||
if (!kp) {
|
||||
icp = new(g) JNCOL(IsNum(p));
|
||||
kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL));
|
||||
kcp->Next = NULL;
|
||||
kcp->Jncolp = icp;
|
||||
kcp->Colp = NULL;
|
||||
|
||||
if (Array) {
|
||||
kcp->Key = NULL;
|
||||
kcp->N = atoi(p);
|
||||
} else {
|
||||
kcp->Key = PlugDup(g, jp);
|
||||
kcp->N = 0;
|
||||
} // endif Array
|
||||
|
||||
if (Klist) {
|
||||
for (kp = Klist; kp->Next; kp = kp->Next);
|
||||
|
||||
kp->Next = kcp;
|
||||
} else
|
||||
Klist = kcp;
|
||||
|
||||
} else
|
||||
icp = kp->Jncolp;
|
||||
|
||||
*(p - 1) = '.';
|
||||
icp->AddCol(g, colp, p);
|
||||
} else {
|
||||
kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL));
|
||||
|
||||
kcp->Next = NULL;
|
||||
kcp->Jncolp = NULL;
|
||||
kcp->Colp = colp;
|
||||
|
||||
if (Array) {
|
||||
kcp->Key = NULL;
|
||||
kcp->N = atoi(jp);
|
||||
} else {
|
||||
kcp->Key = jp;
|
||||
kcp->N = 0;
|
||||
} // endif Array
|
||||
|
||||
if (Klist) {
|
||||
for (kp = Klist; kp->Next; kp = kp->Next);
|
||||
|
||||
kp->Next = kcp;
|
||||
} else
|
||||
Klist = kcp;
|
||||
|
||||
} // endif jp
|
||||
|
||||
} // end of AddCol
|
||||
|
||||
/***********************************************************************/
|
||||
/* JMgoConn construction/destruction. */
|
||||
/***********************************************************************/
|
||||
JMgoConn::JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper)
|
||||
: JAVAConn(g, wrapper)
|
||||
{
|
||||
CollName = collname;
|
||||
readid = fetchid = getdocid = objfldid = fcollid = acollid =
|
||||
mkdocid = docaddid = mkarid = araddid = insertid = updateid =
|
||||
deleteid = gcollid = countid = rewindid = nullptr;
|
||||
DiscFunc = "MongoDisconnect";
|
||||
Fpc = NULL;
|
||||
m_Fetch = 0;
|
||||
m_Ncol = 0;
|
||||
m_Version = 0;
|
||||
} // end of JMgoConn
|
||||
|
||||
/***********************************************************************/
|
||||
/* AddJars: add some jar file to the Class path. */
|
||||
/***********************************************************************/
|
||||
void JMgoConn::AddJars(PSTRG jpop, char sep)
|
||||
{
|
||||
#if defined(DEVELOPMENT)
|
||||
if (m_Version == 2) {
|
||||
jpop->Append(sep);
|
||||
jpop->Append("C:/Eclipse/workspace/MongoWrap2/bin");
|
||||
jpop->Append(sep);
|
||||
jpop->Append("C:/mongo-java-driver/mongo-java-driver-2.13.3.jar");
|
||||
} else {
|
||||
jpop->Append(sep);
|
||||
jpop->Append("C:/Eclipse/workspace/MongoWrap3/bin");
|
||||
jpop->Append(sep);
|
||||
jpop->Append("C:/mongo-java-driver/mongo-java-driver-3.4.2.jar");
|
||||
} // endif m_Version
|
||||
#endif // DEVELOPMENT
|
||||
} // end of AddJars
|
||||
|
||||
/***********************************************************************/
|
||||
/* Connect: connect to a data source. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::Connect(PJPARM sop)
|
||||
{
|
||||
bool err = false;
|
||||
jint rc;
|
||||
jboolean brc;
|
||||
jstring cln;
|
||||
PGLOBAL& g = m_G;
|
||||
|
||||
m_Version = sop->Version;
|
||||
|
||||
/*******************************************************************/
|
||||
/* Create or attach a JVM. */
|
||||
/*******************************************************************/
|
||||
if (Open(g))
|
||||
return true;
|
||||
|
||||
/*******************************************************************/
|
||||
/* Connect to MongoDB. */
|
||||
/*******************************************************************/
|
||||
jmethodID cid = nullptr;
|
||||
|
||||
if (gmID(g, cid, "MongoConnect", "([Ljava/lang/String;)I"))
|
||||
return true;
|
||||
|
||||
// Build the java string array
|
||||
jobjectArray parms = env->NewObjectArray(4, // constructs java array of 4
|
||||
env->FindClass("java/lang/String"), NULL); // Strings
|
||||
|
||||
//m_Scrollable = sop->Scrollable;
|
||||
//m_RowsetSize = sop->Fsize;
|
||||
|
||||
// change some elements
|
||||
if (sop->Driver)
|
||||
env->SetObjectArrayElement(parms, 0, env->NewStringUTF(sop->Url));
|
||||
|
||||
if (sop->Url)
|
||||
env->SetObjectArrayElement(parms, 1, env->NewStringUTF(sop->Driver));
|
||||
|
||||
if (sop->User)
|
||||
env->SetObjectArrayElement(parms, 2, env->NewStringUTF(sop->User));
|
||||
|
||||
if (sop->Pwd)
|
||||
env->SetObjectArrayElement(parms, 3, env->NewStringUTF(sop->Pwd));
|
||||
|
||||
// call method
|
||||
rc = env->CallIntMethod(job, cid, parms);
|
||||
err = Check(rc);
|
||||
env->DeleteLocalRef(parms); // Not used anymore
|
||||
|
||||
if (err) {
|
||||
sprintf(g->Message, "Connecting: %s rc=%d", Msg, (int)rc);
|
||||
return true;
|
||||
} // endif Msg
|
||||
|
||||
/*********************************************************************/
|
||||
/* Get the collection. */
|
||||
/*********************************************************************/
|
||||
if (gmID(g, gcollid, "GetCollection", "(Ljava/lang/String;)Z"))
|
||||
return true;
|
||||
|
||||
cln = env->NewStringUTF(CollName);
|
||||
brc = env->CallBooleanMethod(job, gcollid, cln);
|
||||
env->DeleteLocalRef(cln);
|
||||
|
||||
if (Check(brc ? -1 : 0)) {
|
||||
sprintf(g->Message, "GetCollection: %s", Msg);
|
||||
return true;
|
||||
} // endif Msg
|
||||
|
||||
m_Connected = true;
|
||||
return false;
|
||||
} // end of Connect
|
||||
|
||||
/***********************************************************************/
|
||||
/* CollSize: returns the number of documents in the collection. */
|
||||
/***********************************************************************/
|
||||
int JMgoConn::CollSize(PGLOBAL g)
|
||||
{
|
||||
if (!gmID(g, countid, "GetCollSize", "()J")) {
|
||||
jlong card = env->CallLongMethod(job, countid);
|
||||
|
||||
return (int)card;
|
||||
} else
|
||||
return 2; // Make MariaDB happy
|
||||
|
||||
} // end of CollSize
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenDB: Data Base open routine for MONGO access method. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options,
|
||||
PCSZ filter, bool pipe)
|
||||
{
|
||||
const char *p;
|
||||
bool b = false, id = (tdbp->GetMode() != MODE_READ), all = false;
|
||||
uint len;
|
||||
PCOL cp;
|
||||
PSZ jp;
|
||||
PCSZ op = NULL, sf = NULL, Options = options;
|
||||
PSTRG s = NULL;
|
||||
|
||||
if (Options && !stricmp(Options, "all")) {
|
||||
Options = NULL;
|
||||
all = true;
|
||||
} // endif Options
|
||||
|
||||
for (cp = tdbp->GetColumns(); cp; cp = cp->GetNext())
|
||||
if (!strcmp(cp->GetName(), "_id"))
|
||||
id = true;
|
||||
else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe))
|
||||
all = true;
|
||||
|
||||
if (pipe && Options) {
|
||||
if (trace)
|
||||
htrc("Pipeline: %s\n", Options);
|
||||
|
||||
p = strrchr(Options, ']');
|
||||
|
||||
if (!p) {
|
||||
strcpy(g->Message, "Missing ] in pipeline");
|
||||
return true;
|
||||
} else
|
||||
*(char*)p = 0;
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)Options);
|
||||
|
||||
if (tdbp->GetFilter()) {
|
||||
s->Append(",{\"$match\":");
|
||||
|
||||
if (tdbp->GetFilter()->MakeSelector(g, s)) {
|
||||
strcpy(g->Message, "Failed making selector");
|
||||
return NULL;
|
||||
} else
|
||||
s->Append('}');
|
||||
|
||||
tdbp->SetFilter(NULL); // Not needed anymore
|
||||
} // endif To_Filter
|
||||
|
||||
if (!all && tdbp->GetColumns()) {
|
||||
// Project list
|
||||
len = s->GetLength();
|
||||
s->Append(",{\"$project\":{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (PCOL cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
if ((jp = cp->GetJpath(g, true)))
|
||||
s->Append(jp);
|
||||
else {
|
||||
s->Truncate(len);
|
||||
goto nop;
|
||||
} // endif Jpath
|
||||
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
s->Append("}}");
|
||||
} // endif all
|
||||
|
||||
nop:
|
||||
s->Append("]}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
*(char*)p = ']'; // Restore Colist for discovery
|
||||
p = s->GetStr();
|
||||
|
||||
if (trace)
|
||||
htrc("New Pipeline: %s\n", p);
|
||||
|
||||
return AggregateCollection(p);
|
||||
} else {
|
||||
if (filter || tdbp->GetFilter()) {
|
||||
if (trace) {
|
||||
if (filter)
|
||||
htrc("Filter: %s\n", filter);
|
||||
|
||||
if (tdbp->GetFilter()) {
|
||||
char buf[512];
|
||||
|
||||
tdbp->GetFilter()->Prints(g, buf, 511);
|
||||
htrc("To_Filter: %s\n", buf);
|
||||
} // endif To_Filter
|
||||
|
||||
} // endif trace
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)filter);
|
||||
len = s->GetLength();
|
||||
|
||||
if (tdbp->GetFilter()) {
|
||||
if (filter)
|
||||
s->Append(',');
|
||||
|
||||
if (tdbp->GetFilter()->MakeSelector(g, s)) {
|
||||
strcpy(g->Message, "Failed making selector");
|
||||
return NULL;
|
||||
} // endif Selector
|
||||
|
||||
tdbp->SetFilter(NULL); // Not needed anymore
|
||||
} // endif To_Filter
|
||||
|
||||
if (trace)
|
||||
htrc("selector: %s\n", s->GetStr());
|
||||
|
||||
s->Resize(s->GetLength() + 1);
|
||||
sf = PlugDup(g, s->GetStr());
|
||||
} // endif Filter
|
||||
|
||||
if (!all) {
|
||||
if (Options && *Options) {
|
||||
if (trace)
|
||||
htrc("options=%s\n", Options);
|
||||
|
||||
op = Options;
|
||||
} else if (tdbp->GetColumns()) {
|
||||
// Projection list
|
||||
if (s)
|
||||
s->Set("{\"");
|
||||
else
|
||||
s = new(g) STRING(g, 511, "{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (PCOL cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
if ((jp = cp->GetJpath(g, true)))
|
||||
s->Append(jp);
|
||||
else {
|
||||
// Can this happen?
|
||||
htrc("Fail getting projection path of %s\n", cp->GetName());
|
||||
goto nope;
|
||||
} // endif Jpath
|
||||
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
s->Append("}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
op = s->GetStr();
|
||||
} else {
|
||||
// count(*) ?
|
||||
op = "{\"_id\":1}";
|
||||
} // endif Options
|
||||
|
||||
} // endif all
|
||||
|
||||
nope:
|
||||
return FindCollection(sf, op);
|
||||
} // endif Pipe
|
||||
|
||||
} // end of MakeCursor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Find a collection and make cursor. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::FindCollection(PCSZ query, PCSZ proj)
|
||||
{
|
||||
bool rc = true;
|
||||
jboolean brc;
|
||||
jstring qry = nullptr, prj = nullptr;
|
||||
PGLOBAL& g = m_G;
|
||||
|
||||
// Get the methods used to execute a query and get the result
|
||||
if (!gmID(g, fcollid, "FindColl", "(Ljava/lang/String;Ljava/lang/String;)Z")) {
|
||||
if (query)
|
||||
qry = env->NewStringUTF(query);
|
||||
|
||||
if (proj)
|
||||
prj = env->NewStringUTF(proj);
|
||||
|
||||
brc = env->CallBooleanMethod(job, fcollid, qry, prj);
|
||||
|
||||
if (!Check(brc ? -1 : 0)) {
|
||||
rc = false;
|
||||
} else
|
||||
sprintf(g->Message, "FindColl: %s", Msg);
|
||||
|
||||
if (query)
|
||||
env->DeleteLocalRef(qry);
|
||||
|
||||
if (proj)
|
||||
env->DeleteLocalRef(prj);
|
||||
|
||||
} // endif xqid
|
||||
|
||||
return rc;
|
||||
} // end of FindCollection
|
||||
|
||||
/***********************************************************************/
|
||||
/* Find a collection and make cursor. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::AggregateCollection(PCSZ pipeline)
|
||||
{
|
||||
bool rc = true;
|
||||
jboolean brc;
|
||||
jstring pip = nullptr;
|
||||
PGLOBAL& g = m_G;
|
||||
|
||||
// Get the methods used to execute a query and get the result
|
||||
if (!gmID(g, acollid, "AggregateColl", "(Ljava/lang/String;)Z")) {
|
||||
pip = env->NewStringUTF(pipeline);
|
||||
|
||||
brc = env->CallBooleanMethod(job, acollid, pip);
|
||||
|
||||
if (!Check(brc ? -1 : 0)) {
|
||||
rc = false;
|
||||
} else
|
||||
sprintf(g->Message, "AggregateColl: %s", Msg);
|
||||
|
||||
env->DeleteLocalRef(pip);
|
||||
} // endif acollid
|
||||
|
||||
return rc;
|
||||
} // end of AggregateCollection
|
||||
|
||||
/***********************************************************************/
|
||||
/* Fetch next row. */
|
||||
/***********************************************************************/
|
||||
int JMgoConn::Fetch(int pos)
|
||||
{
|
||||
jint rc = JNI_ERR;
|
||||
PGLOBAL& g = m_G;
|
||||
|
||||
//if (m_Full) // Result set has one row
|
||||
// return 1;
|
||||
|
||||
//if (pos) {
|
||||
// if (!m_Scrollable) {
|
||||
// strcpy(g->Message, "Cannot fetch(pos) if FORWARD ONLY");
|
||||
// return rc;
|
||||
// } else if (gmID(m_G, fetchid, "Fetch", "(I)Z"))
|
||||
// return rc;
|
||||
|
||||
// if (env->CallBooleanMethod(job, fetchid, pos))
|
||||
// rc = m_Rows;
|
||||
|
||||
//} else {
|
||||
if (gmID(g, readid, "ReadNext", "()I"))
|
||||
return (int)rc;
|
||||
|
||||
rc = env->CallIntMethod(job, readid);
|
||||
|
||||
if (!Check(rc)) {
|
||||
//if (rc == 0)
|
||||
// m_Full = (m_Fetch == 1);
|
||||
//else
|
||||
// m_Fetch++;
|
||||
|
||||
m_Ncol = (int)rc;
|
||||
rc = MY_MIN(rc, 1);
|
||||
m_Rows += rc;
|
||||
} else
|
||||
sprintf(g->Message, "Fetch: %s", Msg);
|
||||
|
||||
//} // endif pos
|
||||
|
||||
return rc;
|
||||
} // end of Fetch
|
||||
|
||||
/***********************************************************************/
|
||||
/* Get the Json string of the current document. */
|
||||
/***********************************************************************/
|
||||
PSZ JMgoConn::GetDocument(void)
|
||||
{
|
||||
PGLOBAL& g = m_G;
|
||||
PSZ doc = NULL;
|
||||
jstring jdc;
|
||||
|
||||
if (!gmID(g, getdocid, "GetDoc", "()Ljava/lang/String;")) {
|
||||
jdc = (jstring)env->CallObjectMethod(job, getdocid);
|
||||
|
||||
if (jdc)
|
||||
doc = (PSZ)env->GetStringUTFChars(jdc, (jboolean)false);
|
||||
|
||||
} // endif getdocid
|
||||
|
||||
return doc;
|
||||
} // end of GetDocument
|
||||
|
||||
/***********************************************************************/
|
||||
/* Group columns for inserting or updating. */
|
||||
/***********************************************************************/
|
||||
void JMgoConn::MakeColumnGroups(PGLOBAL g, PTDB tdbp)
|
||||
{
|
||||
Fpc = new(g) JNCOL(false);
|
||||
|
||||
for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext())
|
||||
if (!colp->IsSpecial())
|
||||
Fpc->AddCol(g, colp, colp->GetJpath(g, false));
|
||||
|
||||
} // end of MakeColumnGroups
|
||||
|
||||
/***********************************************************************/
|
||||
/* Get additional method ID. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode)
|
||||
{
|
||||
if (mode == MODE_UPDATE) {
|
||||
if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, docaddid, "DocAdd",
|
||||
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, updateid, "CollUpdate", "(Ljava/lang/Object;)J"))
|
||||
return true;
|
||||
|
||||
} else if (mode == MODE_INSERT) {
|
||||
if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, docaddid, "DocAdd",
|
||||
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, mkarid, "MakeArray", "()Ljava/lang/Object;"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, araddid, "ArrayAdd", "(Ljava/lang/Object;ILjava/lang/Object;)Z"))
|
||||
return true;
|
||||
|
||||
if (gmID(g, insertid, "CollInsert", "(Ljava/lang/Object;)Z"))
|
||||
return true;
|
||||
|
||||
} else if (mode == MODE_DELETE)
|
||||
if (gmID(g, deleteid, "CollDelete", "(Z)J"))
|
||||
return true;
|
||||
|
||||
return gmID(g, rewindid, "Rewind", "()Z");
|
||||
} // end of GetMethodId
|
||||
|
||||
/***********************************************************************/
|
||||
/* MakeObject. */
|
||||
/***********************************************************************/
|
||||
jobject JMgoConn::MakeObject(PGLOBAL g, PCOL colp, bool&error )
|
||||
{
|
||||
jclass cls;
|
||||
jmethodID cns = nullptr; // Constructor
|
||||
jobject val = nullptr;
|
||||
PVAL valp = colp->GetValue();
|
||||
|
||||
error = false;
|
||||
|
||||
if (valp->IsNull())
|
||||
return NULL;
|
||||
|
||||
try {
|
||||
switch (valp->GetType()) {
|
||||
case TYPE_STRING:
|
||||
val = env->NewStringUTF(valp->GetCharValue());
|
||||
break;
|
||||
case TYPE_INT:
|
||||
case TYPE_SHORT:
|
||||
cls = env->FindClass("java/lang/Integer");
|
||||
cns = env->GetMethodID(cls, "<init>", "(I)V");
|
||||
val = env->NewObject(cls, cns, valp->GetIntValue());
|
||||
break;
|
||||
case TYPE_TINY:
|
||||
cls = env->FindClass("java/lang/Boolean");
|
||||
cns = env->GetMethodID(cls, "<init>", "(Z)V");
|
||||
val = env->NewObject(cls, cns, (valp->GetIntValue() != 0));
|
||||
break;
|
||||
case TYPE_BIGINT:
|
||||
cls = env->FindClass("java/lang/Long");
|
||||
cns = env->GetMethodID(cls, "<init>", "(J)V");
|
||||
val = env->NewObject(cls, cns, valp->GetBigintValue());
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
cls = env->FindClass("java/lang/Double");
|
||||
cns = env->GetMethodID(cls, "<init>", "(D)V");
|
||||
val = env->NewObject(cls, cns, valp->GetFloatValue());
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, "Cannot make object from %d type", valp->GetType());
|
||||
error = true;
|
||||
break;
|
||||
} // endswitch Type
|
||||
|
||||
} catch (...) {
|
||||
sprintf(g->Message, "Cannot make object from %s value", colp->GetName());
|
||||
error = true;
|
||||
} // end try/catch
|
||||
|
||||
return val;
|
||||
} // end of MakeObject
|
||||
|
||||
/***********************************************************************/
|
||||
/* MakeDoc. */
|
||||
/***********************************************************************/
|
||||
jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp)
|
||||
{
|
||||
bool error = false;
|
||||
jobject parent, child, val;
|
||||
jstring jkey;
|
||||
|
||||
if (jcp->Array)
|
||||
parent = env->CallObjectMethod(job, mkarid);
|
||||
else
|
||||
parent = env->CallObjectMethod(job, mkdocid);
|
||||
|
||||
for (PJKC kp = jcp->Klist; kp; kp = kp->Next)
|
||||
if (kp->Jncolp) {
|
||||
if (!(child = MakeDoc(g, kp->Jncolp)))
|
||||
return NULL;
|
||||
|
||||
if (!jcp->Array) {
|
||||
jkey = env->NewStringUTF(kp->Key);
|
||||
|
||||
if (env->CallBooleanMethod(job, docaddid, parent, jkey, child))
|
||||
return NULL;
|
||||
|
||||
env->DeleteLocalRef(jkey);
|
||||
} else
|
||||
if (env->CallBooleanMethod(job, araddid, parent, kp->N, child))
|
||||
return NULL;
|
||||
|
||||
} else {
|
||||
if (!(val = MakeObject(g, kp->Colp, error))) {
|
||||
if (error)
|
||||
return NULL;
|
||||
|
||||
} else if (!jcp->Array) {
|
||||
jkey = env->NewStringUTF(kp->Key);
|
||||
|
||||
if (env->CallBooleanMethod(job, docaddid, parent, jkey, val))
|
||||
return NULL;
|
||||
|
||||
env->DeleteLocalRef(jkey);
|
||||
} else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val)) {
|
||||
if (Check(-1))
|
||||
sprintf(g->Message, "ArrayAdd: %s", Msg);
|
||||
else
|
||||
sprintf(g->Message, "ArrayAdd: unknown error");
|
||||
|
||||
return NULL;
|
||||
} // endif ArrayAdd
|
||||
|
||||
} // endif Jncolp
|
||||
|
||||
return parent;
|
||||
} // end of MakeDoc
|
||||
|
||||
/***********************************************************************/
|
||||
/* Insert a new document in the collation. */
|
||||
/***********************************************************************/
|
||||
int JMgoConn::DocWrite(PGLOBAL g)
|
||||
{
|
||||
jobject doc;
|
||||
|
||||
if (!Fpc || !(doc = MakeDoc(g, Fpc)))
|
||||
return RC_FX;
|
||||
|
||||
if (env->CallBooleanMethod(job, insertid, doc)) {
|
||||
if (Check(-1))
|
||||
sprintf(g->Message, "CollInsert: %s", Msg);
|
||||
else
|
||||
sprintf(g->Message, "CollInsert: unknown error");
|
||||
|
||||
return RC_FX;
|
||||
} // endif Insert
|
||||
|
||||
return RC_OK;
|
||||
} // end of DocWrite
|
||||
|
||||
/***********************************************************************/
|
||||
/* Update the current document from the collection. */
|
||||
/***********************************************************************/
|
||||
int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
bool error;
|
||||
PCOL colp;
|
||||
jstring jkey;
|
||||
jobject val, upd, updlist = env->CallObjectMethod(job, mkdocid);
|
||||
|
||||
// Make the list of changes to do
|
||||
for (colp = tdbp->GetSetCols(); colp; colp = colp->GetNext()) {
|
||||
jkey = env->NewStringUTF(colp->GetJpath(g, false));
|
||||
val = MakeObject(g, colp, error);
|
||||
|
||||
if (error)
|
||||
return RC_FX;
|
||||
|
||||
if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val))
|
||||
return RC_OK;
|
||||
|
||||
env->DeleteLocalRef(jkey);
|
||||
} // endfor colp
|
||||
|
||||
// Make the update parameter
|
||||
upd = env->CallObjectMethod(job, mkdocid);
|
||||
jkey = env->NewStringUTF("$set");
|
||||
|
||||
if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist))
|
||||
return RC_OK;
|
||||
|
||||
env->DeleteLocalRef(jkey);
|
||||
|
||||
jlong ar = env->CallLongMethod(job, updateid, upd);
|
||||
|
||||
if (trace)
|
||||
htrc("DocUpdate: ar = %ld\n", ar);
|
||||
|
||||
if (Check((int)ar)) {
|
||||
sprintf(g->Message, "CollUpdate: %s", Msg);
|
||||
rc = RC_FX;
|
||||
} // endif ar
|
||||
|
||||
return rc;
|
||||
} // end of DocUpdate
|
||||
|
||||
/***********************************************************************/
|
||||
/* Remove all or only the current document from the collection. */
|
||||
/***********************************************************************/
|
||||
int JMgoConn::DocDelete(PGLOBAL g, bool all)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
jlong ar = env->CallLongMethod(job, deleteid, all);
|
||||
|
||||
if (trace)
|
||||
htrc("DocDelete: ar = %ld\n", ar);
|
||||
|
||||
if (Check((int)ar)) {
|
||||
sprintf(g->Message, "CollDelete: %s", Msg);
|
||||
rc = RC_FX;
|
||||
} // endif ar
|
||||
|
||||
return rc;
|
||||
} // end of DocDelete
|
||||
|
||||
/***********************************************************************/
|
||||
/* Rewind the collection. */
|
||||
/***********************************************************************/
|
||||
bool JMgoConn::Rewind(void)
|
||||
{
|
||||
return env->CallBooleanMethod(job, rewindid);
|
||||
} // end of Rewind
|
||||
|
||||
/***********************************************************************/
|
||||
/* Retrieve the column string value from the document. */
|
||||
/***********************************************************************/
|
||||
PSZ JMgoConn::GetColumnValue(PSZ path)
|
||||
{
|
||||
PGLOBAL& g = m_G;
|
||||
PSZ fld = NULL;
|
||||
jstring fn, jn = nullptr;
|
||||
|
||||
if (!path || (jn = env->NewStringUTF(path)) == nullptr) {
|
||||
sprintf(g->Message, "Fail to allocate jstring %s", SVP(path));
|
||||
throw (int)TYPE_AM_MGO;
|
||||
} // endif name
|
||||
|
||||
if (!gmID(g, objfldid, "GetField", "(Ljava/lang/String;)Ljava/lang/String;")) {
|
||||
fn = (jstring)env->CallObjectMethod(job, objfldid, jn);
|
||||
|
||||
if (fn)
|
||||
fld = (PSZ)env->GetStringUTFChars(fn, (jboolean)false);
|
||||
|
||||
} // endif objfldid
|
||||
|
||||
return fld;
|
||||
} // end of GetColumnValue
|
||||
|
||||
113
storage/connect/jmgoconn.h
Normal file
113
storage/connect/jmgoconn.h
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/***********************************************************************/
|
||||
/* JMgoConn.h : header file for the MongoDB connection classes. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Java interface. */
|
||||
/***********************************************************************/
|
||||
#include "javaconn.h"
|
||||
|
||||
// Java connection to a MongoDB data source
|
||||
class TDBJMG;
|
||||
class JMGCOL;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include MongoDB library header files. */
|
||||
/***********************************************************************/
|
||||
typedef class JNCOL *PJNCOL;
|
||||
typedef class MGODEF *PMGODEF;
|
||||
typedef class TDBJMG *PTDBJMG;
|
||||
typedef class JMGCOL *PJMGCOL;
|
||||
|
||||
typedef struct JKCOL {
|
||||
JKCOL *Next;
|
||||
PJNCOL Jncolp;
|
||||
PCOL Colp;
|
||||
char *Key;
|
||||
int N;
|
||||
} *PJKC;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Used when inserting values in a MongoDB collection. */
|
||||
/***********************************************************************/
|
||||
class JNCOL : public BLOCK {
|
||||
public:
|
||||
// Constructor
|
||||
JNCOL(bool ar) { Klist = NULL; Array = ar; }
|
||||
|
||||
// Methods
|
||||
void AddCol(PGLOBAL g, PCOL colp, PSZ jp);
|
||||
|
||||
//Members
|
||||
PJKC Klist;
|
||||
bool Array;
|
||||
}; // end of JNCOL;
|
||||
|
||||
/***********************************************************************/
|
||||
/* JMgoConn class. */
|
||||
/***********************************************************************/
|
||||
class JMgoConn : public JAVAConn {
|
||||
friend class TDBJMG;
|
||||
friend class JMGDISC;
|
||||
//friend class TDBXJDC;
|
||||
//friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&);
|
||||
private:
|
||||
JMgoConn(); // Standard (unused) constructor
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper);
|
||||
|
||||
// Implementation
|
||||
public:
|
||||
virtual void AddJars(PSTRG jpop, char sep);
|
||||
virtual bool Connect(PJPARM sop);
|
||||
virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, PCSZ filter, bool pipe);
|
||||
// PQRYRES AllocateResult(PGLOBAL g, TDBEXT *tdbp, int n);
|
||||
|
||||
// Attributes
|
||||
public:
|
||||
// virtual int GetMaxValue(int infotype);
|
||||
|
||||
public:
|
||||
// Operations
|
||||
virtual int Fetch(int pos = 0);
|
||||
virtual PSZ GetColumnValue(PSZ name);
|
||||
|
||||
int CollSize(PGLOBAL g);
|
||||
bool FindCollection(PCSZ query, PCSZ proj);
|
||||
bool AggregateCollection(PCSZ pipeline);
|
||||
void MakeColumnGroups(PGLOBAL g, PTDB tdbp);
|
||||
bool GetMethodId(PGLOBAL g, MODE mode);
|
||||
jobject MakeObject(PGLOBAL g, PCOL colp, bool& error);
|
||||
jobject MakeDoc(PGLOBAL g, PJNCOL jcp);
|
||||
int DocWrite(PGLOBAL g);
|
||||
int DocUpdate(PGLOBAL g, PTDB tdbp);
|
||||
int DocDelete(PGLOBAL g, bool all);
|
||||
bool Rewind(void);
|
||||
PSZ GetDocument(void);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
PCSZ CollName; // The collation name
|
||||
jmethodID gcollid; // The GetCollection method ID
|
||||
jmethodID countid; // The GetCollSize method ID
|
||||
jmethodID fcollid; // The FindColl method ID
|
||||
jmethodID acollid; // The AggregateColl method ID
|
||||
jmethodID readid; // The ReadNext method ID
|
||||
jmethodID fetchid; // The Fetch method ID
|
||||
jmethodID rewindid; // The Rewind method ID
|
||||
jmethodID getdocid; // The GetDoc method ID
|
||||
jmethodID objfldid; // The ObjectField method ID
|
||||
jmethodID mkdocid; // The MakeDocument method ID
|
||||
jmethodID docaddid; // The DocAdd method ID
|
||||
jmethodID mkarid; // The MakeArray method ID
|
||||
jmethodID araddid; // The ArrayAdd method ID
|
||||
jmethodID insertid; // The CollInsert method ID
|
||||
jmethodID updateid; // The CollUpdate method ID
|
||||
jmethodID deleteid; // The CollDelete method ID
|
||||
PJNCOL Fpc; // To JNCOL classes
|
||||
int m_Fetch;
|
||||
int m_Ncol;
|
||||
int m_Version; // Java driver version (2 or 3)
|
||||
}; // end of JMgoConn class definition
|
||||
|
|
@ -1403,10 +1403,20 @@ double JVALUE::GetFloat(void)
|
|||
/***********************************************************************/
|
||||
/* Return the Value's String value. */
|
||||
/***********************************************************************/
|
||||
PSZ JVALUE::GetString(void)
|
||||
PSZ JVALUE::GetString(PGLOBAL g)
|
||||
{
|
||||
char buf[32];
|
||||
return (Value) ? Value->GetCharString(buf) : NULL;
|
||||
char *p;
|
||||
|
||||
if (Value) {
|
||||
char buf[32];
|
||||
|
||||
if ((p = Value->GetCharString(buf)) == buf)
|
||||
p = PlugDup(g, buf);
|
||||
|
||||
} else
|
||||
p = NULL;
|
||||
|
||||
return p;
|
||||
} // end of GetString
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty);
|
|||
bool SerializeArray(JOUT *js, PJAR jarp, bool b);
|
||||
bool SerializeObject(JOUT *js, PJOB jobp);
|
||||
bool SerializeValue(JOUT *js, PJVAL jvp);
|
||||
bool IsNum(PSZ s);
|
||||
char *NextChr(PSZ s, char sep);
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class JOUT. Used by Serialize. */
|
||||
|
|
@ -165,7 +167,7 @@ class JSON : public BLOCK {
|
|||
virtual PJPR GetFirst(void) {X return NULL;}
|
||||
virtual int GetInteger(void) {X return 0;}
|
||||
virtual double GetFloat() {X return 0.0;}
|
||||
virtual PSZ GetString() {X return NULL;}
|
||||
virtual PSZ GetString(PGLOBAL g) {X return NULL;}
|
||||
virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;}
|
||||
virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; }
|
||||
virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) { X return true; }
|
||||
|
|
@ -275,7 +277,7 @@ class JVALUE : public JSON {
|
|||
virtual int GetInteger(void);
|
||||
virtual long long GetBigint(void);
|
||||
virtual double GetFloat(void);
|
||||
virtual PSZ GetString(void);
|
||||
virtual PSZ GetString(PGLOBAL g);
|
||||
virtual PSZ GetText(PGLOBAL g, PSZ text);
|
||||
virtual void SetValue(PJSON jsp);
|
||||
virtual void SetValue(PVAL valp) { Value = valp; Jsp = NULL; }
|
||||
|
|
|
|||
|
|
@ -27,10 +27,12 @@
|
|||
#endif
|
||||
#define M 7
|
||||
|
||||
bool IsNum(PSZ s);
|
||||
char *NextChr(PSZ s, char sep);
|
||||
char *GetJsonNull(void);
|
||||
uint GetJsonGrpSize(void);
|
||||
static int IsJson(UDF_ARGS *args, uint i);
|
||||
static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i);
|
||||
static int IsJson(UDF_ARGS *args, uint i);
|
||||
static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i);
|
||||
static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error);
|
||||
static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
|
|
@ -112,10 +114,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
PJNODE jnp = &Nodes[i];
|
||||
|
||||
if (*p) {
|
||||
if (p[--n] == ']') {
|
||||
p[n--] = 0;
|
||||
p++;
|
||||
} else {
|
||||
if (p[n - 1] == ']') {
|
||||
p[--n] = 0;
|
||||
} else if (!IsNum(p)) {
|
||||
// Wrong array specification
|
||||
sprintf(g->Message, "Invalid array specification %s", p);
|
||||
return true;
|
||||
|
|
@ -125,8 +126,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
b = true;
|
||||
|
||||
// To check whether a numeric Rank was specified
|
||||
for (int k = 0; dg && p[k]; k++)
|
||||
dg = isdigit(p[k]) > 0;
|
||||
dg = IsNum(p);
|
||||
|
||||
if (!n) {
|
||||
// Default specifications
|
||||
|
|
@ -143,7 +143,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
jnp->Rank = B;
|
||||
jnp->Op = OP_LE;
|
||||
} else if (!Value->IsTypeNum()) {
|
||||
jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING);
|
||||
jnp->CncVal = AllocateValue(g, PlugDup(g, ", "), TYPE_STRING);
|
||||
jnp->Op = OP_CNC;
|
||||
} else
|
||||
jnp->Op = OP_ADD;
|
||||
|
|
@ -161,13 +161,12 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
// Set the Op value;
|
||||
switch (*p) {
|
||||
case '+': jnp->Op = OP_ADD; break;
|
||||
case '*': jnp->Op = OP_MULT; break;
|
||||
case 'x': jnp->Op = OP_MULT; break;
|
||||
case '>': jnp->Op = OP_MAX; break;
|
||||
case '<': jnp->Op = OP_MIN; break;
|
||||
case '!': jnp->Op = OP_SEP; break; // Average
|
||||
case '#': jnp->Op = OP_NUM; break;
|
||||
case 'x':
|
||||
case 'X': // Expand this array
|
||||
case '*': // Expand this array
|
||||
strcpy(g->Message, "Expand not supported by this function");
|
||||
return true;
|
||||
default:
|
||||
|
|
@ -182,6 +181,10 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
if (n > 2) {
|
||||
// Set concat intermediate string
|
||||
p[n - 1] = 0;
|
||||
|
||||
if (trace)
|
||||
htrc("Concat string=%s\n", p + 1);
|
||||
|
||||
jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING);
|
||||
} // endif n
|
||||
|
||||
|
|
@ -233,9 +236,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
|||
/*********************************************************************************/
|
||||
my_bool JSNX::ParseJpath(PGLOBAL g)
|
||||
{
|
||||
char *p, *p2 = NULL, *pbuf = NULL;
|
||||
char *p, *p1 = NULL, *p2 = NULL, *pbuf = NULL;
|
||||
int i;
|
||||
my_bool mul = false;
|
||||
my_bool a, mul = false;
|
||||
|
||||
if (Parsed)
|
||||
return false; // Already done
|
||||
|
|
@ -243,11 +246,18 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
|||
// Jpath = Name;
|
||||
return true;
|
||||
|
||||
if (trace)
|
||||
htrc("ParseJpath %s\n", SVP(Jpath));
|
||||
|
||||
if (!(pbuf = PlgDBDup(g, Jpath)))
|
||||
return true;
|
||||
|
||||
// The Jpath must be analyzed
|
||||
for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++)
|
||||
if (*pbuf == '$') pbuf++;
|
||||
if (*pbuf == '.') pbuf++;
|
||||
if (*pbuf == '[') p1 = pbuf++;
|
||||
|
||||
// Estimate the required number of nodes
|
||||
for (i = 0, p = pbuf; (p = NextChr(p, '.')); i++, p++)
|
||||
Nod++; // One path node found
|
||||
|
||||
if (!(Nodes = (PJNODE)PlgDBSubAlloc(g, NULL, (++Nod) * sizeof(JNODE))))
|
||||
|
|
@ -256,12 +266,28 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
|||
memset(Nodes, 0, (Nod)* sizeof(JNODE));
|
||||
|
||||
// Analyze the Jpath for this column
|
||||
for (i = 0, p = pbuf; i < Nod; i++, p = (p2 ? p2 + 1 : p + strlen(p))) {
|
||||
if ((p2 = strchr(p, ':')))
|
||||
*p2 = 0;
|
||||
for (i = 0, p = pbuf; p && i < Nod; i++, p = (p2 ? p2 : NULL)) {
|
||||
a = (p1 != NULL);
|
||||
p1 = strchr(p, '[');
|
||||
p2 = strchr(p, '.');
|
||||
|
||||
if (!p2)
|
||||
p2 = p1;
|
||||
else if (p1) {
|
||||
if (p1 < p2)
|
||||
p2 = p1;
|
||||
else if (p1 == p2 + 1)
|
||||
*p2++ = 0; // Old syntax .[
|
||||
else
|
||||
p1 = NULL;
|
||||
|
||||
} // endif p1
|
||||
|
||||
if (p2)
|
||||
*p2++ = 0;
|
||||
|
||||
// Jpath must be explicit
|
||||
if (*p == 0 || *p == '[') {
|
||||
if (a || *p == 0 || *p == '[' || IsNum(p)) {
|
||||
// Analyse intermediate array processing
|
||||
if (SetArrayOptions(g, p, i, Nodes[i-1].Key))
|
||||
return true;
|
||||
|
|
@ -280,7 +306,14 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
|||
|
||||
} // endfor i, p
|
||||
|
||||
Nod = i;
|
||||
MulVal = AllocateValue(g, Value);
|
||||
|
||||
if (trace)
|
||||
for (i = 0; i < Nod; i++)
|
||||
htrc("Node(%d) Key=%s Op=%d Rank=%d\n",
|
||||
i, SVP(Nodes[i].Key), Nodes[i].Op, Nodes[i].Rank);
|
||||
|
||||
Parsed = true;
|
||||
return false;
|
||||
} // end of ParseJpath
|
||||
|
|
@ -308,6 +341,8 @@ PVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp)
|
|||
void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n)
|
||||
{
|
||||
if (val) {
|
||||
vp->SetNull(false);
|
||||
|
||||
if (Jb) {
|
||||
vp->SetValue_psz(Serialize(g, val->GetJsp(), NULL, 0));
|
||||
} else switch (val->GetValType()) {
|
||||
|
|
@ -462,8 +497,8 @@ PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n)
|
|||
/*********************************************************************************/
|
||||
PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n)
|
||||
{
|
||||
//int i, ars, nv = 0, nextsame = Tjp->NextSame;
|
||||
int i, ars, nv = 0, nextsame = 0;
|
||||
//int i, ars, nv = 0, nextsame = Tjp->NextSame;
|
||||
int i, nv = 0, nextsame = 0;
|
||||
my_bool err;
|
||||
OPVAL op = Nodes[n].Op;
|
||||
PVAL val[2], vp = Nodes[n].Valp;
|
||||
|
|
@ -471,11 +506,20 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n)
|
|||
JVALUE jval;
|
||||
|
||||
vp->Reset();
|
||||
ars = arp->size();
|
||||
//ars = arp->size();
|
||||
|
||||
for (i = 0; i < ars; i++) {
|
||||
if (trace)
|
||||
htrc("CalculateArray size=%d\n", arp->size());
|
||||
// htrc("CalculateArray size=%d\n", ars);
|
||||
|
||||
for (i = 0; i < arp->size(); i++) {
|
||||
//for (i = 0; i < ars; i++) { because compiler bug
|
||||
jvrp = arp->GetValue(i);
|
||||
|
||||
if (trace)
|
||||
htrc("Value %s null=%d nv=%d\n",
|
||||
jvrp->GetString(g), jvrp->IsNull() ? 1 : 0, nv);
|
||||
|
||||
if (!jvrp->IsNull() || (op == OP_CNC && GetJsonNull())) {
|
||||
if (jvrp->IsNull()) {
|
||||
jvrp->Value = AllocateValue(g, GetJsonNull(), TYPE_STRING);
|
||||
|
|
@ -492,7 +536,7 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n)
|
|||
} else
|
||||
SetJsonValue(g, MulVal, jvp, n);
|
||||
|
||||
if (!MulVal->IsZero()) {
|
||||
if (!MulVal->IsNull()) {
|
||||
switch (op) {
|
||||
case OP_CNC:
|
||||
if (Nodes[n].CncVal) {
|
||||
|
|
@ -503,7 +547,7 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n)
|
|||
val[0] = MulVal;
|
||||
err = vp->Compute(g, val, 1, op);
|
||||
break;
|
||||
// case OP_NUM:
|
||||
// case OP_NUM:
|
||||
case OP_SEP:
|
||||
val[0] = Nodes[n].Valp;
|
||||
val[1] = MulVal;
|
||||
|
|
@ -715,6 +759,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k)
|
|||
|
||||
// Write to the path string
|
||||
Jp = new(g) JOUTSTR(g);
|
||||
Jp->WriteChr('$');
|
||||
Jvalp = jvp;
|
||||
K = k;
|
||||
|
||||
|
|
@ -773,7 +818,12 @@ my_bool JSNX::LocateArray(PJAR jarp)
|
|||
/*********************************************************************************/
|
||||
my_bool JSNX::LocateObject(PJOB jobp)
|
||||
{
|
||||
size_t m = Jp->N;
|
||||
size_t m;
|
||||
|
||||
if (Jp->WriteChr('.'))
|
||||
return true;
|
||||
|
||||
m = Jp->N;
|
||||
|
||||
for (PJPR pair = jobp->First; pair && !Found; pair = pair->Next) {
|
||||
Jp->N = m;
|
||||
|
|
@ -794,19 +844,12 @@ my_bool JSNX::LocateObject(PJOB jobp)
|
|||
/*********************************************************************************/
|
||||
my_bool JSNX::LocateValue(PJVAL jvp)
|
||||
{
|
||||
if (CompareTree(Jvalp, jvp)) {
|
||||
if (CompareTree(Jvalp, jvp))
|
||||
Found = (--K == 0);
|
||||
} else if (jvp->GetArray()) {
|
||||
if (Jp->WriteChr(':'))
|
||||
return true;
|
||||
|
||||
else if (jvp->GetArray())
|
||||
return LocateArray(jvp->GetArray());
|
||||
} else if (jvp->GetObject()) {
|
||||
if (Jp->WriteChr(':'))
|
||||
return true;
|
||||
|
||||
else if (jvp->GetObject())
|
||||
return LocateObject(jvp->GetObject());
|
||||
} // endif's
|
||||
|
||||
return false;
|
||||
} // end of LocateValue
|
||||
|
|
@ -852,6 +895,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx)
|
|||
if (!g->Message[0])
|
||||
strcpy(g->Message, "Invalid json tree");
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
if (Jp->N > 1)
|
||||
Jp->N--;
|
||||
|
|
@ -862,7 +906,6 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx)
|
|||
return Jp->Strp;
|
||||
} // endif's
|
||||
|
||||
return NULL;
|
||||
} // end of LocateAll
|
||||
|
||||
/*********************************************************************************/
|
||||
|
|
@ -968,26 +1011,26 @@ my_bool JSNX::CompareTree(PJSON jp1, PJSON jp2)
|
|||
/*********************************************************************************/
|
||||
my_bool JSNX::AddPath(void)
|
||||
{
|
||||
char s[16];
|
||||
my_bool b = false;
|
||||
char s[16];
|
||||
|
||||
if (Jp->WriteChr('"'))
|
||||
if (Jp->WriteStr("\"$"))
|
||||
return true;
|
||||
|
||||
for (int i = 0; i <= I; i++) {
|
||||
if (b) {
|
||||
if (Jp->WriteChr(':')) return true;
|
||||
} else
|
||||
b = true;
|
||||
|
||||
if (Jpnp[i].Type == TYPE_JAR) {
|
||||
sprintf(s, "[%d]", Jpnp[i].N + B);
|
||||
|
||||
if (Jp->WriteStr(s))
|
||||
return true;
|
||||
|
||||
} else if (Jp->WriteStr(Jpnp[i].Key))
|
||||
return true;
|
||||
} else {
|
||||
if (Jp->WriteChr('.'))
|
||||
return true;
|
||||
|
||||
if (Jp->WriteStr(Jpnp[i].Key))
|
||||
return true;
|
||||
|
||||
} // endif's
|
||||
|
||||
} // endfor i
|
||||
|
||||
|
|
@ -1097,7 +1140,7 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args,
|
|||
unsigned long reslen, unsigned long memlen,
|
||||
unsigned long more = 0)
|
||||
{
|
||||
PGLOBAL g = PlugInit(NULL, memlen + more);
|
||||
PGLOBAL g = PlugInit(NULL, memlen + more + 500); // +500 to avoid CheckMem
|
||||
|
||||
if (!g) {
|
||||
strcpy(message, "Allocation error");
|
||||
|
|
@ -1457,6 +1500,11 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n,
|
|||
ml += g->More;
|
||||
|
||||
if (ml > g->Sarea_Size) {
|
||||
#if !defined(DEVELOPMENT)
|
||||
if (trace)
|
||||
#endif
|
||||
htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size);
|
||||
|
||||
free(g->Sarea);
|
||||
|
||||
if (!(g->Sarea = PlugAllocMem(g, ml))) {
|
||||
|
|
@ -1762,16 +1810,16 @@ void jsonvalue_deinit(UDF_INIT* initid)
|
|||
/*********************************************************************************/
|
||||
/* Make a Json array containing all the parameters. */
|
||||
/*********************************************************************************/
|
||||
my_bool json_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
my_bool json_make_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen;
|
||||
|
||||
CalcLen(args, false, reslen, memlen);
|
||||
return JsonInit(initid, args, message, false, reslen, memlen);
|
||||
} // end of json_array_init
|
||||
} // end of json_make_array_init
|
||||
|
||||
char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
char *json_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
{
|
||||
char *str;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
|
@ -1798,12 +1846,12 @@ char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
|
||||
*res_length = strlen(str);
|
||||
return str;
|
||||
} // end of json_array
|
||||
} // end of json_make_array
|
||||
|
||||
void json_array_deinit(UDF_INIT* initid)
|
||||
void json_make_array_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_array_deinit
|
||||
} // end of json_make_array_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Add one or several values to a Json array. */
|
||||
|
|
@ -1850,7 +1898,7 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
PJAR arp;
|
||||
PJVAL jvp = MakeValue(g, args, 0, &top);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(top = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
return NULL;
|
||||
|
|
@ -2083,19 +2131,219 @@ void json_array_delete_deinit(UDF_INIT* initid)
|
|||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_array_delete_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Sum big integer values from a Json array. */
|
||||
/*********************************************************************************/
|
||||
my_bool jsonsum_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen, more;
|
||||
|
||||
if (args->arg_count != 1) {
|
||||
strcpy(message, "This function must have 1 argument");
|
||||
return true;
|
||||
} else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) {
|
||||
strcpy(message, "First argument must be a json item");
|
||||
return true;
|
||||
} else
|
||||
CalcLen(args, false, reslen, memlen);
|
||||
|
||||
// TODO: calculate this
|
||||
more = (IsJson(args, 0) != 3) ? 1000 : 0;
|
||||
|
||||
return JsonInit(initid, args, message, true, reslen, memlen, more);
|
||||
} // end of jsonsum_int_init
|
||||
|
||||
long long jsonsum_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
|
||||
{
|
||||
long long n = 0LL;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
||||
if (g->N) {
|
||||
if (!g->Activityp) {
|
||||
*is_null = 1;
|
||||
return 0LL;
|
||||
} else
|
||||
return *(long long*)g->Activityp;
|
||||
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
if (!CheckMemory(g, initid, args, 1, false, false, true)) {
|
||||
PJVAL jvp = MakeValue(g, args, 0);
|
||||
|
||||
if (jvp && jvp->GetValType() == TYPE_JAR) {
|
||||
PJAR arp = jvp->GetArray();
|
||||
|
||||
for (int i = 0; i < arp->size(); i++)
|
||||
n += arp->GetValue(i)->GetBigint();
|
||||
|
||||
} else {
|
||||
PUSH_WARNING("First argument target is not an array");
|
||||
} // endif jvp
|
||||
|
||||
} else {
|
||||
*error = 1;
|
||||
n = -1LL;
|
||||
} // end of CheckMemory
|
||||
|
||||
if (g->N) {
|
||||
// Keep result of constant function
|
||||
long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long));
|
||||
*np = n;
|
||||
g->Activityp = (PACTIVITY)np;
|
||||
} // endif const_item
|
||||
|
||||
return n;
|
||||
} // end of jsonsum_int
|
||||
|
||||
void jsonsum_int_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of jsonsum_int_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Sum big integer values from a Json array. */
|
||||
/*********************************************************************************/
|
||||
my_bool jsonsum_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen, more;
|
||||
|
||||
if (args->arg_count != 1) {
|
||||
strcpy(message, "This function must have 1 argument");
|
||||
return true;
|
||||
} else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) {
|
||||
strcpy(message, "First argument must be a json item");
|
||||
return true;
|
||||
} else
|
||||
CalcLen(args, false, reslen, memlen);
|
||||
|
||||
// TODO: calculate this
|
||||
more = (IsJson(args, 0) != 3) ? 1000 : 0;
|
||||
|
||||
return JsonInit(initid, args, message, true, reslen, memlen, more);
|
||||
} // end of jsonsum_real_init
|
||||
|
||||
double jsonsum_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
|
||||
{
|
||||
double n = 0.0;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
||||
if (g->N) {
|
||||
if (!g->Activityp) {
|
||||
*is_null = 1;
|
||||
return 0.0;
|
||||
} else
|
||||
return *(double*)g->Activityp;
|
||||
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
if (!CheckMemory(g, initid, args, 1, false, false, true)) {
|
||||
PJVAL jvp = MakeValue(g, args, 0);
|
||||
|
||||
if (jvp && jvp->GetValType() == TYPE_JAR) {
|
||||
PJAR arp = jvp->GetArray();
|
||||
|
||||
for (int i = 0; i < arp->size(); i++)
|
||||
n += arp->GetValue(i)->GetFloat();
|
||||
|
||||
} else {
|
||||
PUSH_WARNING("First argument target is not an array");
|
||||
} // endif jvp
|
||||
|
||||
} else {
|
||||
*error = 1;
|
||||
n = -1.0;
|
||||
} // end of CheckMemory
|
||||
|
||||
if (g->N) {
|
||||
// Keep result of constant function
|
||||
double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double));
|
||||
*np = n;
|
||||
g->Activityp = (PACTIVITY)np;
|
||||
} // endif const_item
|
||||
|
||||
return n;
|
||||
} // end of jsonsum_real
|
||||
|
||||
void jsonsum_real_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of jsonsum_real_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Returns the average of big integer values from a Json array. */
|
||||
/*********************************************************************************/
|
||||
my_bool jsonavg_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
return jsonsum_real_init(initid, args, message);
|
||||
} // end of jsonavg_real_init
|
||||
|
||||
double jsonavg_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
|
||||
{
|
||||
double n = 0.0;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
||||
if (g->N) {
|
||||
if (!g->Activityp) {
|
||||
*is_null = 1;
|
||||
return 0.0;
|
||||
} else
|
||||
return *(double*)g->Activityp;
|
||||
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
if (!CheckMemory(g, initid, args, 1, false, false, true)) {
|
||||
PJVAL jvp = MakeValue(g, args, 0);
|
||||
|
||||
if (jvp && jvp->GetValType() == TYPE_JAR) {
|
||||
PJAR arp = jvp->GetArray();
|
||||
|
||||
if (arp->size()) {
|
||||
for (int i = 0; i < arp->size(); i++)
|
||||
n += arp->GetValue(i)->GetFloat();
|
||||
|
||||
n /= arp->size();
|
||||
} // endif size
|
||||
|
||||
} else {
|
||||
PUSH_WARNING("First argument target is not an array");
|
||||
} // endif jvp
|
||||
|
||||
} else {
|
||||
*error = 1;
|
||||
n = -1.0;
|
||||
} // end of CheckMemory
|
||||
|
||||
if (g->N) {
|
||||
// Keep result of constant function
|
||||
double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double));
|
||||
*np = n;
|
||||
g->Activityp = (PACTIVITY)np;
|
||||
} // endif const_item
|
||||
|
||||
return n;
|
||||
} // end of jsonavg_real
|
||||
|
||||
void jsonavg_real_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of jsonavg_real_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Make a Json Object containing all the parameters. */
|
||||
/*********************************************************************************/
|
||||
my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
my_bool json_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen;
|
||||
|
||||
CalcLen(args, true, reslen, memlen);
|
||||
return JsonInit(initid, args, message, false, reslen, memlen);
|
||||
} // end of json_object_init
|
||||
} // end of json_make_object_init
|
||||
|
||||
char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
char *json_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
{
|
||||
char *str = NULL;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
|
@ -2120,12 +2368,12 @@ char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
|
||||
*res_length = strlen(str);
|
||||
return str;
|
||||
} // end of json_object
|
||||
} // end of json_make_object
|
||||
|
||||
void json_object_deinit(UDF_INIT* initid)
|
||||
void json_make_object_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_object_deinit
|
||||
} // end of json_make_object_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Make a Json Object containing all not null parameters. */
|
||||
|
|
@ -2440,7 +2688,7 @@ char *json_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
PJSON jsp;
|
||||
PJVAL jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
return NULL;
|
||||
|
|
@ -2824,7 +3072,7 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
return NULL;
|
||||
|
|
@ -2939,7 +3187,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
|
|
@ -2976,6 +3224,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
|
||||
PUSH_WARNING(g->Message);
|
||||
str = NULL;
|
||||
} catch (const char *msg) {
|
||||
|
|
@ -3025,7 +3274,7 @@ my_bool jsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
|||
} // end of jsonget_int_init
|
||||
|
||||
long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args,
|
||||
char *is_null, char *error)
|
||||
char *is_null, char *error)
|
||||
{
|
||||
char *p, *path;
|
||||
long long n;
|
||||
|
|
@ -3053,7 +3302,7 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
if (g->Mrr) *error = 1;
|
||||
|
|
@ -3168,7 +3417,7 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
*is_null = 1;
|
||||
|
|
@ -3284,7 +3533,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
|
|
@ -3316,6 +3565,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
|
|
@ -3407,7 +3657,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
|
|
@ -3440,6 +3690,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
|
|
@ -3578,7 +3829,7 @@ long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
|
|
@ -3665,7 +3916,7 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
throw 2;
|
||||
} // endif jsp
|
||||
|
|
@ -3714,6 +3965,7 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
|
||||
PUSH_WARNING(g->Message);
|
||||
str = NULL;
|
||||
} catch (const char *msg) {
|
||||
|
|
@ -4000,14 +4252,14 @@ char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!strchr("[{ \t\r\n", *p)) {
|
||||
// Is this a file name?
|
||||
if (!(p = GetJsonFile(g, p))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto fin;
|
||||
} else
|
||||
fn = jvp->GetString();
|
||||
fn = jvp->GetString(g);
|
||||
|
||||
} // endif p
|
||||
|
||||
|
|
@ -4150,7 +4402,7 @@ char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
PJVAL jvp = MakeValue(g, args, 0, &top);
|
||||
PGLOBAL gb = GetMemPtr(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(top = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
return NULL;
|
||||
|
|
@ -4688,7 +4940,7 @@ char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
PJSON jsp;
|
||||
PJVAL jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
return NULL;
|
||||
|
|
@ -4759,7 +5011,7 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto fin;
|
||||
|
|
@ -4933,7 +5185,7 @@ char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if ((p = jvp->GetString(g))) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto fin;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/******************** tabjson H Declares Source Code File (.H) *******************/
|
||||
/* Name: jsonudf.h Version 1.2 */
|
||||
/* Name: jsonudf.h Version 1.3 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */
|
||||
/* */
|
||||
/* This file contains the JSON UDF function and class declares. */
|
||||
/*********************************************************************************/
|
||||
|
|
@ -37,9 +37,9 @@ extern "C" {
|
|||
DllExport char *jsonvalue(UDF_EXEC_ARGS);
|
||||
DllExport void jsonvalue_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_array(UDF_EXEC_ARGS);
|
||||
DllExport void json_array_deinit(UDF_INIT*);
|
||||
DllExport my_bool json_make_array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_make_array(UDF_EXEC_ARGS);
|
||||
DllExport void json_make_array_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_array_add_values(UDF_EXEC_ARGS);
|
||||
|
|
@ -53,9 +53,21 @@ extern "C" {
|
|||
DllExport char *json_array_delete(UDF_EXEC_ARGS);
|
||||
DllExport void json_array_delete_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_object_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_object(UDF_EXEC_ARGS);
|
||||
DllExport void json_object_deinit(UDF_INIT*);
|
||||
DllExport my_bool jsonsum_int_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport long long jsonsum_int(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void jsonsum_int_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool jsonsum_real_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport double jsonsum_real(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void jsonsum_real_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool jsonavg_real_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport double jsonavg_real(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void jsonavg_real_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_make_object_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_make_object(UDF_EXEC_ARGS);
|
||||
DllExport void json_make_object_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_object_nonull(UDF_EXEC_ARGS);
|
||||
|
|
|
|||
372
storage/connect/mongo.cpp
Normal file
372
storage/connect/mongo.cpp
Normal file
|
|
@ -0,0 +1,372 @@
|
|||
/************** mongo C++ Program Source Code File (.CPP) **************/
|
||||
/* PROGRAM NAME: mongo Version 1.0 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* These programs are the MGODEF class execution routines. */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant sections of the MariaDB header file. */
|
||||
/***********************************************************************/
|
||||
#include <my_global.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include application header files: */
|
||||
/* global.h is header containing all global declarations. */
|
||||
/* plgdbsem.h is header containing the DB application declarations. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "xtable.h"
|
||||
#include "tabext.h"
|
||||
#if defined(CMGO_SUPPORT)
|
||||
#include "tabcmg.h"
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
#include "tabjmg.h"
|
||||
#endif // JDBC_SUPPORT
|
||||
#include "resource.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* This should be an option. */
|
||||
/***********************************************************************/
|
||||
#define MAXCOL 200 /* Default max column nb in result */
|
||||
#define TYPE_UNKNOWN 12 /* Must be greater than other types */
|
||||
|
||||
bool IsNum(PSZ s);
|
||||
|
||||
/***********************************************************************/
|
||||
/* MGOColumns: construct the result blocks containing the description */
|
||||
/* of all the columns of a document contained inside MongoDB. */
|
||||
/***********************************************************************/
|
||||
PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info)
|
||||
{
|
||||
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT,
|
||||
TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING};
|
||||
static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC,
|
||||
FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT};
|
||||
unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0};
|
||||
int ncol = sizeof(buftyp) / sizeof(int);
|
||||
int i, n = 0;
|
||||
PCSZ drv;
|
||||
PBCOL bcp;
|
||||
MGODISC *cmgd;
|
||||
PQRYRES qrp;
|
||||
PCOLRES crp;
|
||||
|
||||
if (info) {
|
||||
length[0] = 128;
|
||||
length[7] = 256;
|
||||
goto skipit;
|
||||
} // endif info
|
||||
|
||||
/*********************************************************************/
|
||||
/* Open MongoDB. */
|
||||
/*********************************************************************/
|
||||
drv = GetStringTableOption(g, topt, "Driver", NULL);
|
||||
|
||||
if (drv && toupper(*drv) == 'C') {
|
||||
#if defined(CMGO_SUPPORT)
|
||||
cmgd = new(g) CMGDISC(g, (int*)length);
|
||||
#else
|
||||
sprintf(g->Message, "Mongo %s Driver not available", "C");
|
||||
goto err;
|
||||
#endif
|
||||
} else if (drv && toupper(*drv) == 'J') {
|
||||
#if defined(JDBC_SUPPORT)
|
||||
cmgd = new(g) JMGDISC(g, (int*)length);
|
||||
#else
|
||||
sprintf(g->Message, "Mongo %s Driver not available", "Java");
|
||||
goto err;
|
||||
#endif
|
||||
} else { // Driver not specified
|
||||
#if defined(CMGO_SUPPORT)
|
||||
cmgd = new(g) CMGDISC(g, (int*)length);
|
||||
#else
|
||||
cmgd = new(g) JMGDISC(g, (int*)length);
|
||||
#endif
|
||||
} // endif drv
|
||||
|
||||
if ((n = cmgd->GetColumns(g, db, uri, topt)) < 0)
|
||||
goto err;
|
||||
|
||||
skipit:
|
||||
if (trace)
|
||||
htrc("MGOColumns: n=%d len=%d\n", n, length[0]);
|
||||
|
||||
/*********************************************************************/
|
||||
/* Allocate the structures used to refer to the result set. */
|
||||
/*********************************************************************/
|
||||
qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3,
|
||||
buftyp, fldtyp, length, false, false);
|
||||
|
||||
crp = qrp->Colresp->Next->Next->Next->Next->Next->Next;
|
||||
crp->Name = "Nullable";
|
||||
crp->Next->Name = "Bpath";
|
||||
|
||||
if (info || !qrp)
|
||||
return qrp;
|
||||
|
||||
qrp->Nblin = n;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Now get the results into blocks. */
|
||||
/*********************************************************************/
|
||||
for (i = 0, bcp = cmgd->fbcp; bcp; i++, bcp = bcp->Next) {
|
||||
if (bcp->Type == TYPE_UNKNOWN) // Void column
|
||||
bcp->Type = TYPE_STRING;
|
||||
|
||||
crp = qrp->Colresp; // Column Name
|
||||
crp->Kdata->SetValue(bcp->Name, i);
|
||||
crp = crp->Next; // Data Type
|
||||
crp->Kdata->SetValue(bcp->Type, i);
|
||||
crp = crp->Next; // Type Name
|
||||
crp->Kdata->SetValue(GetTypeName(bcp->Type), i);
|
||||
crp = crp->Next; // Precision
|
||||
crp->Kdata->SetValue(bcp->Len, i);
|
||||
crp = crp->Next; // Length
|
||||
crp->Kdata->SetValue(bcp->Len, i);
|
||||
crp = crp->Next; // Scale (precision)
|
||||
crp->Kdata->SetValue(bcp->Scale, i);
|
||||
crp = crp->Next; // Nullable
|
||||
crp->Kdata->SetValue(bcp->Cbn ? 1 : 0, i);
|
||||
crp = crp->Next; // Field format
|
||||
|
||||
if (crp->Kdata)
|
||||
crp->Kdata->SetValue(bcp->Fmt, i);
|
||||
|
||||
} // endfor i
|
||||
|
||||
/*********************************************************************/
|
||||
/* Return the result pointer. */
|
||||
/*********************************************************************/
|
||||
return qrp;
|
||||
|
||||
err:
|
||||
if (cmgd->tmgp)
|
||||
cmgd->tmgp->CloseDB(g);
|
||||
|
||||
return NULL;
|
||||
} // end of MGOColumns
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class used to get the columns of a mongo collection. */
|
||||
/***********************************************************************/
|
||||
MGODISC::MGODISC(PGLOBAL g, int *lg) {
|
||||
length = lg;
|
||||
fbcp = NULL;
|
||||
pbcp = NULL;
|
||||
tmgp = NULL;
|
||||
drv = NULL;
|
||||
i = ncol = lvl = 0;
|
||||
all = false;
|
||||
} // end of MGODISC constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class used to get the columns of a mongo collection. */
|
||||
/***********************************************************************/
|
||||
int MGODISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt)
|
||||
{
|
||||
PCSZ level = GetStringTableOption(g, topt, "Level", NULL);
|
||||
PMGODEF tdp;
|
||||
|
||||
if (level) {
|
||||
lvl = atoi(level);
|
||||
lvl = (lvl > 16) ? 16 : lvl;
|
||||
} else
|
||||
lvl = 0;
|
||||
|
||||
all = GetBooleanTableOption(g, topt, "Fullarray", false);
|
||||
|
||||
/*********************************************************************/
|
||||
/* Open the MongoDB collection. */
|
||||
/*********************************************************************/
|
||||
tdp = new(g) MGODEF;
|
||||
tdp->Uri = uri;
|
||||
tdp->Driver = drv;
|
||||
tdp->Tabname = GetStringTableOption(g, topt, "Name", NULL);
|
||||
tdp->Tabname = GetStringTableOption(g, topt, "Tabname", tdp->Tabname);
|
||||
tdp->Tabschema = GetStringTableOption(g, topt, "Dbname", db);
|
||||
tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0;
|
||||
tdp->Colist = GetStringTableOption(g, topt, "Colist", "all");
|
||||
tdp->Filter = GetStringTableOption(g, topt, "Filter", NULL);
|
||||
tdp->Pipe = GetBooleanTableOption(g, topt, "Pipeline", false);
|
||||
tdp->Version = GetIntegerTableOption(g, topt, "Version", 3);
|
||||
tdp->Wrapname = (PSZ)GetStringTableOption(g, topt, "Wrapper",
|
||||
(tdp->Version == 2) ? "Mongo2Interface" : "Mongo3Interface");
|
||||
|
||||
if (trace)
|
||||
htrc("Uri %s coll=%s db=%s colist=%s filter=%s lvl=%d\n",
|
||||
tdp->Uri, tdp->Tabname, tdp->Tabschema, tdp->Colist, tdp->Filter, lvl);
|
||||
|
||||
tmgp = tdp->GetTable(g, MODE_READ);
|
||||
tmgp->SetMode(MODE_READ);
|
||||
|
||||
if (tmgp->OpenDB(g))
|
||||
return -1;
|
||||
|
||||
bcol.Next = NULL;
|
||||
bcol.Name = bcol.Fmt = NULL;
|
||||
bcol.Type = TYPE_UNKNOWN;
|
||||
bcol.Len = bcol.Scale = 0;
|
||||
bcol.Found = true;
|
||||
bcol.Cbn = false;
|
||||
|
||||
if (Init(g))
|
||||
return -1;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Analyse the BSON tree and define columns. */
|
||||
/*********************************************************************/
|
||||
for (i = 1; ; i++) {
|
||||
switch (tmgp->ReadDB(g)) {
|
||||
case RC_EF:
|
||||
return ncol;
|
||||
case RC_FX:
|
||||
return -1;
|
||||
default:
|
||||
GetDoc();
|
||||
} // endswitch ReadDB
|
||||
|
||||
if (Find(g))
|
||||
return -1;
|
||||
|
||||
// Missing columns can be null
|
||||
for (bcp = fbcp; bcp; bcp = bcp->Next) {
|
||||
bcp->Cbn |= !bcp->Found;
|
||||
bcp->Found = false;
|
||||
} // endfor bcp
|
||||
|
||||
} // endfor i
|
||||
|
||||
return ncol;
|
||||
} // end of GetColumns
|
||||
|
||||
/***********************************************************************/
|
||||
/* Add a new column in the column list. */
|
||||
/***********************************************************************/
|
||||
void MGODISC::AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k)
|
||||
{
|
||||
// Check whether this column was already found
|
||||
for (bcp = fbcp; bcp; bcp = bcp->Next)
|
||||
if (!strcmp(colname, bcp->Name))
|
||||
break;
|
||||
|
||||
if (bcp) {
|
||||
if (bcp->Type != bcol.Type)
|
||||
bcp->Type = TYPE_STRING;
|
||||
|
||||
if (k && *fmt && (!bcp->Fmt || strlen(bcp->Fmt) < strlen(fmt))) {
|
||||
bcp->Fmt = PlugDup(g, fmt);
|
||||
length[7] = MY_MAX(length[7], (signed)strlen(fmt));
|
||||
} // endif *fmt
|
||||
|
||||
bcp->Len = MY_MAX(bcp->Len, bcol.Len);
|
||||
bcp->Scale = MY_MAX(bcp->Scale, bcol.Scale);
|
||||
bcp->Cbn |= bcol.Cbn;
|
||||
bcp->Found = true;
|
||||
} else {
|
||||
// New column
|
||||
bcp = (PBCOL)PlugSubAlloc(g, NULL, sizeof(BCOL));
|
||||
*bcp = bcol;
|
||||
bcp->Cbn |= (i > 1);
|
||||
bcp->Name = PlugDup(g, colname);
|
||||
length[0] = MY_MAX(length[0], (signed)strlen(colname));
|
||||
|
||||
if (k) {
|
||||
bcp->Fmt = PlugDup(g, fmt);
|
||||
length[7] = MY_MAX(length[7], (signed)strlen(fmt));
|
||||
} else
|
||||
bcp->Fmt = NULL;
|
||||
|
||||
if (pbcp) {
|
||||
bcp->Next = pbcp->Next;
|
||||
pbcp->Next = bcp;
|
||||
} else
|
||||
fbcp = bcp;
|
||||
|
||||
ncol++;
|
||||
} // endif jcp
|
||||
|
||||
pbcp = bcp;
|
||||
} // end of AddColumn
|
||||
|
||||
/* -------------------------- Class MGODEF --------------------------- */
|
||||
|
||||
MGODEF::MGODEF(void)
|
||||
{
|
||||
Driver = NULL;
|
||||
Uri = NULL;
|
||||
Colist = NULL;
|
||||
Filter = NULL;
|
||||
Level = 0;
|
||||
Base = 0;
|
||||
Version = 0;
|
||||
Pipe = false;
|
||||
} // end of MGODEF constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* DefineAM: define specific AM block values. */
|
||||
/***********************************************************************/
|
||||
bool MGODEF::DefineAM(PGLOBAL g, LPCSTR, int poff)
|
||||
{
|
||||
if (EXTDEF::DefineAM(g, "MGO", poff))
|
||||
return true;
|
||||
else if (!Tabschema)
|
||||
Tabschema = GetStringCatInfo(g, "Dbname", "*");
|
||||
|
||||
Driver = GetStringCatInfo(g, "Driver", NULL);
|
||||
Uri = GetStringCatInfo(g, "Connect", "mongodb://localhost:27017");
|
||||
Colist = GetStringCatInfo(g, "Colist", NULL);
|
||||
Filter = GetStringCatInfo(g, "Filter", NULL);
|
||||
Base = GetIntCatInfo("Base", 0) ? 1 : 0;
|
||||
Version = GetIntCatInfo("Version", 3);
|
||||
|
||||
if (Version == 2)
|
||||
Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo2Interface");
|
||||
else
|
||||
Wrapname = GetStringCatInfo(g, "Wrapper", "Mongo3Interface");
|
||||
|
||||
Pipe = GetBoolCatInfo("Pipeline", false);
|
||||
return false;
|
||||
} // end of DefineAM
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetTable: makes a new Table Description Block. */
|
||||
/***********************************************************************/
|
||||
PTDB MGODEF::GetTable(PGLOBAL g, MODE m)
|
||||
{
|
||||
if (Driver && toupper(*Driver) == 'C') {
|
||||
#if defined(CMGO_SUPPORT)
|
||||
if (Catfunc == FNC_COL)
|
||||
return new(g) TDBGOL(this);
|
||||
else
|
||||
return new(g) TDBCMG(this);
|
||||
#else
|
||||
sprintf(g->Message, "Mongo %s Driver not available", "C");
|
||||
return NULL;
|
||||
#endif
|
||||
} else if (Driver && toupper(*Driver) == 'J') {
|
||||
#if defined(JDBC_SUPPORT)
|
||||
if (Catfunc == FNC_COL)
|
||||
return new(g) TDBJGL(this);
|
||||
else
|
||||
return new(g) TDBJMG(this);
|
||||
#else
|
||||
sprintf(g->Message, "Mongo %s Driver not available", "Java");
|
||||
return NULL;
|
||||
#endif
|
||||
} else { // Driver not specified
|
||||
#if defined(CMGO_SUPPORT)
|
||||
if (Catfunc == FNC_COL)
|
||||
return new(g) TDBGOL(this);
|
||||
else
|
||||
return new(g) TDBCMG(this);
|
||||
#else
|
||||
if (Catfunc == FNC_COL)
|
||||
return new(g) TDBJGL(this);
|
||||
else
|
||||
return new(g) TDBJMG(this);
|
||||
#endif
|
||||
} // endif Driver
|
||||
|
||||
} // end of GetTable
|
||||
91
storage/connect/mongo.h
Normal file
91
storage/connect/mongo.h
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/**************** mongo H Declares Source Code File (.H) ***************/
|
||||
/* Name: mongo.h Version 1.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the common MongoDB classes declares. */
|
||||
/***********************************************************************/
|
||||
#ifndef __MONGO_H
|
||||
#define __MONGO_H
|
||||
|
||||
#include "osutil.h"
|
||||
#include "block.h"
|
||||
#include "colblk.h"
|
||||
|
||||
typedef class MGODEF *PMGODEF;
|
||||
|
||||
typedef struct _bncol {
|
||||
struct _bncol *Next;
|
||||
char *Name;
|
||||
char *Fmt;
|
||||
int Type;
|
||||
int Len;
|
||||
int Scale;
|
||||
bool Cbn;
|
||||
bool Found;
|
||||
} BCOL, *PBCOL;
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class used to get the columns of a mongo collection. */
|
||||
/***********************************************************************/
|
||||
class MGODISC : public BLOCK {
|
||||
public:
|
||||
// Constructor
|
||||
MGODISC(PGLOBAL g, int *lg);
|
||||
|
||||
// Methods
|
||||
virtual bool Init(PGLOBAL g) { return false; }
|
||||
virtual void GetDoc(void) {}
|
||||
virtual bool Find(PGLOBAL g) = 0;
|
||||
|
||||
// Functions
|
||||
int GetColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt);
|
||||
void AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k);
|
||||
|
||||
// Members
|
||||
BCOL bcol;
|
||||
PBCOL bcp, fbcp, pbcp;
|
||||
PMGODEF tdp;
|
||||
PTDB tmgp;
|
||||
PCSZ drv;
|
||||
int *length;
|
||||
int i, ncol, lvl;
|
||||
bool all;
|
||||
}; // end of MGODISC
|
||||
|
||||
/***********************************************************************/
|
||||
/* MongoDB table. */
|
||||
/***********************************************************************/
|
||||
class DllExport MGODEF : public EXTDEF { /* Table description */
|
||||
friend class TDBCMG;
|
||||
friend class TDBJMG;
|
||||
friend class TDBGOL;
|
||||
friend class TDBJGL;
|
||||
friend class CMGFAM;
|
||||
friend class MGODISC;
|
||||
friend PQRYRES MGOColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool);
|
||||
public:
|
||||
// Constructor
|
||||
MGODEF(void);
|
||||
|
||||
// Implementation
|
||||
virtual const char *GetType(void) { return "MONGO"; }
|
||||
|
||||
// Methods
|
||||
virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
|
||||
virtual PTDB GetTable(PGLOBAL g, MODE m);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
PCSZ Driver; /* MongoDB Driver (C or JAVA) */
|
||||
PCSZ Uri; /* MongoDB connection URI */
|
||||
PSZ Wrapname; /* Java wrapper name */
|
||||
PCSZ Colist; /* Options list */
|
||||
PCSZ Filter; /* Filtering query */
|
||||
int Level; /* Used for catalog table */
|
||||
int Base; /* The array index base */
|
||||
int Version; /* The Java driver version */
|
||||
bool Pipe; /* True is Colist is a pipeline */
|
||||
}; // end of MGODEF
|
||||
|
||||
#endif // __MONGO_H
|
||||
|
|
@ -86,7 +86,7 @@
|
|||
#if defined(JDBC_SUPPORT)
|
||||
#define NJDBC
|
||||
#include "tabjdbc.h"
|
||||
#endif // ODBC_SUPPORT
|
||||
#endif // JDBC_SUPPORT
|
||||
#if defined(PIVOT_SUPPORT)
|
||||
#include "tabpivot.h"
|
||||
#endif // PIVOT_SUPPORT
|
||||
|
|
@ -96,6 +96,9 @@
|
|||
#if defined(XML_SUPPORT)
|
||||
#include "tabxml.h"
|
||||
#endif // XML_SUPPORT
|
||||
#if defined(MONGO_SUPPORT)
|
||||
#include "mongo.h"
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(ZIP_SUPPORT)
|
||||
#include "tabzip.h"
|
||||
#endif // ZIP_SUPPORT
|
||||
|
|
@ -108,6 +111,9 @@
|
|||
extern "C" HINSTANCE s_hModule; // Saved module handle
|
||||
#endif // !__WIN__
|
||||
|
||||
#if defined(MONGO_SUPPORT)
|
||||
bool MongoEnabled(void);
|
||||
#endif // MONGO_SUPPORT
|
||||
PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info);
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
@ -130,21 +136,21 @@ TABTYPE GetTypeID(const char *type)
|
|||
: (!stricmp(type, "CSV")) ? TAB_CSV
|
||||
: (!stricmp(type, "FMT")) ? TAB_FMT
|
||||
: (!stricmp(type, "DBF")) ? TAB_DBF
|
||||
#ifdef XML_SUPPORT
|
||||
#if defined(XML_SUPPORT)
|
||||
: (!stricmp(type, "XML")) ? TAB_XML
|
||||
#endif
|
||||
: (!stricmp(type, "INI")) ? TAB_INI
|
||||
: (!stricmp(type, "VEC")) ? TAB_VEC
|
||||
#ifdef ODBC_SUPPORT
|
||||
#if defined(ODBC_SUPPORT)
|
||||
: (!stricmp(type, "ODBC")) ? TAB_ODBC
|
||||
#endif
|
||||
#ifdef JDBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
: (!stricmp(type, "JDBC")) ? TAB_JDBC
|
||||
#endif
|
||||
: (!stricmp(type, "MYSQL")) ? TAB_MYSQL
|
||||
: (!stricmp(type, "MYPRX")) ? TAB_MYSQL
|
||||
: (!stricmp(type, "DIR")) ? TAB_DIR
|
||||
#ifdef __WIN__
|
||||
#if defined(__WIN__)
|
||||
: (!stricmp(type, "MAC")) ? TAB_MAC
|
||||
: (!stricmp(type, "WMI")) ? TAB_WMI
|
||||
#endif
|
||||
|
|
@ -153,13 +159,16 @@ TABTYPE GetTypeID(const char *type)
|
|||
: (!stricmp(type, "OCCUR")) ? TAB_OCCUR
|
||||
: (!stricmp(type, "CATLG")) ? TAB_PRX // Legacy
|
||||
: (!stricmp(type, "PROXY")) ? TAB_PRX
|
||||
#ifdef PIVOT_SUPPORT
|
||||
#if defined(PIVOT_SUPPORT)
|
||||
: (!stricmp(type, "PIVOT")) ? TAB_PIVOT
|
||||
#endif
|
||||
: (!stricmp(type, "VIR")) ? TAB_VIR
|
||||
: (!stricmp(type, "JSON")) ? TAB_JSON
|
||||
#ifdef ZIP_SUPPORT
|
||||
#if defined(ZIP_SUPPORT)
|
||||
: (!stricmp(type, "ZIP")) ? TAB_ZIP
|
||||
#endif
|
||||
#if defined(MONGO_SUPPORT)
|
||||
: (!stricmp(type, "MONGO")) ? TAB_MONGO
|
||||
#endif
|
||||
: (!stricmp(type, "OEM")) ? TAB_OEM : TAB_NIY;
|
||||
} // end of GetTypeID
|
||||
|
|
@ -307,6 +316,7 @@ int GetIndexType(TABTYPE type)
|
|||
case TAB_MYSQL:
|
||||
case TAB_ODBC:
|
||||
case TAB_JDBC:
|
||||
case TAB_MONGO:
|
||||
xtyp= 2;
|
||||
break;
|
||||
case TAB_VIR:
|
||||
|
|
@ -550,6 +560,15 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
|
|||
#endif // PIVOT_SUPPORT
|
||||
case TAB_VIR: tdp= new(g) VIRDEF; break;
|
||||
case TAB_JSON: tdp= new(g) JSONDEF; break;
|
||||
#if defined(MONGO_SUPPORT)
|
||||
case TAB_MONGO:
|
||||
if (MongoEnabled())
|
||||
tdp = new(g) MGODEF;
|
||||
else
|
||||
strcpy(g->Message, "MONGO type not enabled");
|
||||
|
||||
break;
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(ZIP_SUPPORT)
|
||||
case TAB_ZIP: tdp= new(g) ZIPDEF; break;
|
||||
#endif // ZIP_SUPPORT
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ struct ha_table_option_struct {
|
|||
const char *catfunc;
|
||||
const char *srcdef;
|
||||
const char *colist;
|
||||
const char *filter;
|
||||
const char *oplist;
|
||||
const char *data_charset;
|
||||
ulonglong lrecl;
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
|||
unsigned int length[] = {0, 4, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0};
|
||||
PCSZ fmt;
|
||||
char *fld, *colname, *chset, v, buf[128], uns[16], zero[16];
|
||||
int i, n, nf, ncol = sizeof(buftyp) / sizeof(int);
|
||||
int i, n, nf = 0, ncol = sizeof(buftyp) / sizeof(int);
|
||||
int len, type, prec, rc, k = 0;
|
||||
bool b;
|
||||
PQRYRES qrp;
|
||||
|
|
@ -160,7 +160,9 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
|||
/* Do an evaluation of the result size. */
|
||||
/********************************************************************/
|
||||
STRING cmd(g, 64, "SHOW FULL COLUMNS FROM ");
|
||||
b = cmd.Append((PSZ)table);
|
||||
b = cmd.Append('`');
|
||||
b |= cmd.Append((PSZ)table);
|
||||
b |= cmd.Append('`');
|
||||
|
||||
b |= cmd.Append(" FROM ");
|
||||
b |= cmd.Append((PSZ)(db ? db : PlgGetUser(g)->DBName));
|
||||
|
|
@ -470,7 +472,7 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db,
|
|||
int pt, const char *csname)
|
||||
{
|
||||
const char *pipe = NULL;
|
||||
uint cto = 6000, nrt = 12000;
|
||||
uint cto = 10, nrt = 20;
|
||||
my_bool my_true= 1;
|
||||
|
||||
m_DB = mysql_init(NULL);
|
||||
|
|
@ -523,7 +525,8 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db,
|
|||
mysql_options(m_DB, MYSQL_OPT_USE_THREAD_SPECIFIC_MEMORY,
|
||||
(char*)&my_true);
|
||||
|
||||
if (!mysql_real_connect(m_DB, host, user, pwd, db, pt, pipe, CLIENT_MULTI_RESULTS)) {
|
||||
if (!mysql_real_connect(m_DB, host, user, pwd, db, pt, pipe,
|
||||
CLIENT_MULTI_RESULTS | CLIENT_REMEMBER_OPTIONS)) {
|
||||
#if defined(_DEBUG)
|
||||
sprintf(g->Message, "mysql_real_connect failed: (%d) %s",
|
||||
mysql_errno(m_DB), mysql_error(m_DB));
|
||||
|
|
|
|||
|
|
@ -13,3 +13,9 @@ jdbc : Variable settings depend on machine configuration
|
|||
jdbc_new : Variable settings depend on machine configuration
|
||||
jdbc_oracle : Variable settings depend on machine configuration
|
||||
jdbc_postgresql : Variable settings depend on machine configuration
|
||||
json_mongo_c : Need MongoDB running and its C Driver installed
|
||||
json_java_2 : Need MongoDB running and its Java Driver installed
|
||||
json_java_3 : Need MongoDB running and its Java Driver installed
|
||||
mongo_c : Need MongoDB running and its C Driver installed
|
||||
mongo_java_2 : Need MongoDB running and its Java Driver installed
|
||||
mongo_java_3 : Need MongoDB running and its Java Driver installed
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Testing changing table type (not in-place)
|
||||
#
|
||||
|
|
@ -16,7 +14,7 @@ c d
|
|||
# This is because the XML top node name defaults to the table name.
|
||||
# Sure enough the temporary table name begins with '#' and is rejected by XML.
|
||||
# Therefore the top node name must be specified (along with the row nodes name).
|
||||
ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='rownode=row';
|
||||
ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=domdoc,rownode=row';
|
||||
SELECT * FROM t1;
|
||||
c d
|
||||
1 One
|
||||
|
|
@ -27,7 +25,7 @@ Table Create Table
|
|||
t1 CREATE TABLE `t1` (
|
||||
`c` int(11) NOT NULL,
|
||||
`d` char(10) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='rownode=row'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=domdoc,rownode=row'
|
||||
# Let us see the XML file
|
||||
CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml';
|
||||
Warnings:
|
||||
|
|
@ -67,7 +65,7 @@ Table Create Table
|
|||
t1 CREATE TABLE `t1` (
|
||||
`c` int(11) NOT NULL,
|
||||
`d` char(10) NOT NULL `FIELD_FORMAT`='@'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='rownode=row' `HEADER`=0
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=domdoc,rownode=row' `HEADER`=0
|
||||
SELECT * FROM t2;
|
||||
line
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
|
|
|||
86
storage/connect/mysql-test/connect/r/alter_xml2.result
Normal file
86
storage/connect/mysql-test/connect/r/alter_xml2.result
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Testing changing table type (not in-place)
|
||||
#
|
||||
CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1 QUOTED=1;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.csv
|
||||
INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three');
|
||||
SELECT * FROM t1;
|
||||
c d
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
# This would fail if the top node name is not specified.
|
||||
# This is because the XML top node name defaults to the table name.
|
||||
# Sure enough the temporary table name begins with '#' and is rejected by XML.
|
||||
# Therefore the top node name must be specified (along with the row nodes name).
|
||||
ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='xmlsup=libxml2,rownode=row';
|
||||
SELECT * FROM t1;
|
||||
c d
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` int(11) NOT NULL,
|
||||
`d` char(10) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `HEADER`=1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=libxml2,rownode=row'
|
||||
# Let us see the XML file
|
||||
CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml';
|
||||
Warnings:
|
||||
Warning 1105 No table_type. Will be set to DOS
|
||||
SELECT * FROM t2;
|
||||
line
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created by the MariaDB CONNECT Storage Engine-->
|
||||
<t1>
|
||||
<row>
|
||||
<TH>c</TH>
|
||||
<TH>d</TH>
|
||||
</row>
|
||||
<row>
|
||||
<c>1</c>
|
||||
<d>One</d>
|
||||
</row>
|
||||
<row>
|
||||
<c>2</c>
|
||||
<d>Two</d>
|
||||
</row>
|
||||
<row>
|
||||
<c>3</c>
|
||||
<d>Three</d>
|
||||
</row>
|
||||
</t1>
|
||||
# NOTE: The first (ignored) row is due to the remaining HEADER=1 option.
|
||||
# Testing field option modification
|
||||
ALTER TABLE t1 MODIFY d CHAR(10) NOT NULL FIELD_FORMAT='@', HEADER=0;
|
||||
SELECT * FROM t1;
|
||||
c d
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c` int(11) NOT NULL,
|
||||
`d` char(10) NOT NULL `FIELD_FORMAT`='@'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `QUOTED`=1 `TABLE_TYPE`=XML `TABNAME`=t1 `OPTION_LIST`='xmlsup=libxml2,rownode=row' `HEADER`=0
|
||||
SELECT * FROM t2;
|
||||
line
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created by the MariaDB CONNECT Storage Engine-->
|
||||
<t1>
|
||||
<row d="One">
|
||||
<c>1</c>
|
||||
</row>
|
||||
<row d="Two">
|
||||
<c>2</c>
|
||||
</row>
|
||||
<row d="Three">
|
||||
<c>3</c>
|
||||
</row>
|
||||
</t1>
|
||||
DROP TABLE t1, t2;
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
create table t1 (i int) engine=Connect table_type=XML;
|
||||
create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=domdoc';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
select * from information_schema.tables where create_options like '%table_type=XML%';
|
||||
|
|
|
|||
12
storage/connect/mysql-test/connect/r/infoschema2-9739.result
Normal file
12
storage/connect/mysql-test/connect/r/infoschema2-9739.result
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=libxml2';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
select * from information_schema.tables where create_options like '%table_type=XML%';
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
|
||||
Warnings:
|
||||
Warning 1286 Unknown storage engine 'InnoDB'
|
||||
Warning 1286 Unknown storage engine 'InnoDB'
|
||||
Warning 1296 Got error 174 'File t1.xml not found' from CONNECT
|
||||
drop table t1;
|
||||
|
|
@ -185,7 +185,7 @@ t1 CREATE TABLE `t1` (
|
|||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`e` year(4) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'a' at row 1
|
||||
Note 1265 Data truncated for column 'c' at row 1
|
||||
|
|
|
|||
|
|
@ -24,15 +24,15 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='AUTHOR:[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='$.AUTHOR[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
|
|
@ -46,16 +46,16 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
|
|
@ -69,16 +69,16 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
|
|
@ -97,7 +97,7 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L
|
|||
CREATE TABLE t2 (
|
||||
FIRSTNAME CHAR(32),
|
||||
LASTNAME CHAR(32))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR';
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR';
|
||||
SELECT * FROM t2;
|
||||
FIRSTNAME LASTNAME
|
||||
William J. Pardi
|
||||
|
|
@ -176,17 +176,17 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15) NOT NULL,
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB',
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATED.PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB',
|
||||
INDEX IX(ISBN)
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0';
|
||||
|
|
@ -209,9 +209,9 @@ DROP TABLE t1;
|
|||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[].EXPENSE["+"].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[].EXPENSE[+].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -230,9 +230,9 @@ DROP TABLE t1;
|
|||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -266,14 +266,14 @@ DROP TABLE t1;
|
|||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12) NOT NULL,
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT')
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='$.WEEK[", "].NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[+].AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[+].AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[!].AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[!].AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[+].AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[!].AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEKS SUMS SUM AVGS SUMAVG AVGSUM AVGAVG AVERAGE
|
||||
|
|
@ -286,9 +286,9 @@ DROP TABLE t1;
|
|||
#
|
||||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[0].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t2;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -302,9 +302,9 @@ Janet 3 Food 18.00
|
|||
Janet 3 Beer 18.00
|
||||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[1].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t3;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -318,9 +318,9 @@ Beth 4 Beer 15.00
|
|||
Janet 4 Car 17.00
|
||||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[2].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t4;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -374,8 +374,8 @@ DROP TABLE t1, t2, t3, t4;
|
|||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json';
|
||||
SELECT * FROM t2;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -390,8 +390,8 @@ Janet 3 Beer 18.00
|
|||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json';
|
||||
SELECT * FROM t3;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -406,8 +406,8 @@ Janet 4 Car 17.00
|
|||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json';
|
||||
SELECT * FROM t4;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -425,8 +425,8 @@ Janet 5 Food 12.00
|
|||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1;
|
||||
SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
|
|
@ -461,8 +461,8 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json';
|
||||
ALTER TABLE t1
|
||||
PARTITION BY LIST COLUMNS(WEEK) (
|
||||
|
|
|
|||
385
storage/connect/mysql-test/connect/r/json_java_2.result
Normal file
385
storage/connect/mysql-test/connect/r/json_java_2.result
Normal file
|
|
@ -0,0 +1,385 @@
|
|||
SET GLOBAL connect_class_path='C:/MariaDB-10.0/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar';
|
||||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=4096
|
||||
OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":"2014-03-03T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-09-11T00:00:00.000Z"},"grade":"A","score":6},{"date":{"$date":"2013-01-24T00:00:00.000Z"},"grade":"A","score":10},{"date":{"$date":"2011-11-23T00:00:00.000Z"},"grade":"A","score":9},{"date":{"$date":"2011-03-10T00:00:00.000Z"},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":"2014-12-30T00:00:00.000Z"},"grade":"A","score":8},{"date":{"$date":"2014-07-01T00:00:00.000Z"},"grade":"B","score":23},{"date":{"$date":"2013-04-30T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2012-05-08T00:00:00.000Z"},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath
|
||||
_id 1 CHAR 24 24 0 0 _id
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 256 256 0 1 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_date 1 CHAR 256 256 0 1 grades.0.date
|
||||
grades_grade 1 CHAR 14 14 0 1 grades.0.grade
|
||||
grades_score 5 BIGINT 2 2 0 1 grades.0.score
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8' `LRECL`=4096
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_date grades_grade grades_score name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856077 Morris Park Ave 10462 Bronx Bakery 2014-03-03T00:00:00.000Z A 2 Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.961704 Flatbush Avenue 11225 Brooklyn Hamburgers 2014-12-30T00:00:00.000Z A 8 Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 West 57 Street 10019 Manhattan Irish 2014-09-06T00:00:00.000Z A 2 Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 Stillwell Avenue 11224 Brooklyn American 2014-06-10T00:00:00.000Z A 5 Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.8601152 63 Road 11374 Queens Jewish/Kosher 2014-11-24T00:00:00.000Z Z 20 Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=2,level=0' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856077 40.848447 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.961704 40.662942 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 40.7676919 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 40.579505 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.8601152 40.7311739 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 8825 -73.8803827 40.7643124 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 2206 -74.1377286 40.6119572 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 7114 -73.9068506 40.6199034 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 6409 -74.00528899999999 40.628886 11 Avenue 11219 Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 1839 -73.9482609 40.6408271 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 1970-01-01
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 1970-01-01
|
||||
Wendy'S Flatbush Avenue 8 1970-01-01
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 1970-01-01
|
||||
Riviera Caterer Stillwell Avenue 5 1970-01-01
|
||||
Tov Kosher Kitchen 63 Road 20 1970-01-01
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 1970-01-01 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 1970-01-01 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 1970-01-01 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 1970-01-01 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 1970-01-01 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 1970-01-01 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 1970-01-01 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 1970-01-01 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 1970-01-01 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 1970-01-01 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 1970-01-01 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 1970-01-01 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 1970-01-01 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 1970-01-01 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 1970-01-01 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 1970-01-01 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:34 B 15
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:34 A 13
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:33 C 36
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:33 B 22
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:32 C 36
|
||||
Tout Va Bien Manhattan 1970-01-01 01:33:32 C 7
|
||||
La Grenouille Manhattan 1970-01-01 01:33:34 A 10
|
||||
La Grenouille Manhattan 1970-01-01 01:33:33 A 9
|
||||
La Grenouille Manhattan 1970-01-01 01:33:32 A 13
|
||||
Le Perigord Manhattan 1970-01-01 01:33:34 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 1970-01-01 01:33:34
|
||||
Bistro Sk A 12 1970-01-01 01:33:34
|
||||
Bistro Sk B 18 1970-01-01 01:33:33
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"cuisine":0}' CONNECTION='mongodb://localhost:27017' LRECL=4096
|
||||
OPTION_LIST='Driver=Java,level=2,version=2';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` double(18,16) DEFAULT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_date` char(24) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2' `LRECL`=4096
|
||||
SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 NULL 44 27
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.00
|
||||
notebook 1368 456.00
|
||||
paper 23 5.75
|
||||
planner 167 41.75
|
||||
postcard 23 5.75
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
385
storage/connect/mysql-test/connect/r/json_java_3.result
Normal file
385
storage/connect/mysql-test/connect/r/json_java_3.result
Normal file
|
|
@ -0,0 +1,385 @@
|
|||
SET GLOBAL connect_class_path='C:/MariaDB-10.0/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar';
|
||||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=4096
|
||||
OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath
|
||||
_id 1 CHAR 24 24 0 0 _id
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 256 256 0 1 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_date 1 CHAR 256 256 0 1 grades.0.date
|
||||
grades_grade 1 CHAR 14 14 0 1 grades.0.grade
|
||||
grades_score 5 BIGINT 2 2 0 1 grades.0.score
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8' `LRECL`=4096
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_date grades_grade grades_score name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856077 Morris Park Ave 10462 Bronx Bakery 1393804800 A 2 Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.961704 Flatbush Avenue 11225 Brooklyn Hamburgers 1419897600 A 8 Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 West 57 Street 10019 Manhattan Irish 1409961600 A 2 Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 Stillwell Avenue 11224 Brooklyn American 1402358400 A 5 Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.8601152 63 Road 11374 Queens Jewish/Kosher 1416787200 Z 20 Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=3,level=0' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856077 40.848447 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.961704 40.662942 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.98513559999999 40.7676919 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.98241999999999 40.579505 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.8601152 40.7311739 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 8825 -73.8803827 40.7643124 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 2206 -74.1377286 40.6119572 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 7114 -73.9068506 40.6199034 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 6409 -74.00528899999999 40.628886 11 Avenue 11219 Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 1839 -73.9482609 40.6408271 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 2014-03-03
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 2014-03-03
|
||||
Wendy'S Flatbush Avenue 8 2014-12-30
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06
|
||||
Riviera Caterer Stillwell Avenue 5 2014-06-10
|
||||
Tov Kosher Kitchen 63 Road 20 2014-11-24
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15
|
||||
Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13
|
||||
Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22
|
||||
Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7
|
||||
La Grenouille Manhattan 2014-04-09 02:00:00 A 10
|
||||
La Grenouille Manhattan 2013-03-05 01:00:00 A 9
|
||||
La Grenouille Manhattan 2012-02-02 01:00:00 A 13
|
||||
Le Perigord Manhattan 2014-07-14 02:00:00 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 2014-11-21 01:00:00
|
||||
Bistro Sk A 12 2014-02-19 01:00:00
|
||||
Bistro Sk B 18 2013-06-12 02:00:00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"cuisine":0}' CONNECTION='mongodb://localhost:27017' LRECL=4096
|
||||
OPTION_LIST='Driver=Java,level=2,version=3';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` double(18,16) DEFAULT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_date` bigint(13) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3' `LRECL`=4096
|
||||
SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096 DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 NULL 44 27
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=4096;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.00
|
||||
notebook 1368 456.00
|
||||
paper 23 5.75
|
||||
planner 167 41.75
|
||||
postcard 23 5.75
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
384
storage/connect/mysql-test/connect/r/json_mongo_c.result
Normal file
384
storage/connect/mysql-test/connect/r/json_mongo_c.result
Normal file
|
|
@ -0,0 +1,384 @@
|
|||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localhost:27017' LRECL=1024
|
||||
OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8 CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Jpath
|
||||
_id 1 CHAR 24 24 0 0 _id
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 256 256 0 1 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_date 1 CHAR 256 256 0 1 grades.0.date
|
||||
grades_grade 1 CHAR 14 14 0 1 grades.0.grade
|
||||
grades_score 5 BIGINT 2 2 0 1 grades.0.score
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` varchar(256) DEFAULT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_date` varchar(256) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=C,Version=0' `DATA_CHARSET`='utf8' `LRECL`=1024
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_date grades_grade grades_score name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856076999999999089 Morris Park Ave 10462 Bronx Bakery 1393804800 A 2 Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.96170399999999745 Flatbush Avenue 11225 Brooklyn Hamburgers 1419897600 A 8 Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.985135599999992451 West 57 Street 10019 Manhattan Irish 1409961600 A 2 Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.982419999999990523 Stillwell Avenue 11224 Brooklyn American 1402358400 A 5 Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.860115199999995639 63 Road 11374 Queens Jewish/Kosher 1416787200 Z 20 Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 -73.856076999999999089 40.848447000000000173 Morris Park Ave 10462 Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 -73.96170399999999745 40.66294200000000103 Flatbush Avenue 11225 Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 -73.985135599999992451 40.767691900000002647 West 57 Street 10019 Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 -73.982419999999990523 40.579504999999997494 Stillwell Avenue 11224 Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 -73.860115199999995639 40.731173900000001709 63 Road 11374 Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 8825 -73.880382699999998408 40.764312400000001446 Astoria Boulevard 11369 Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 2206 -74.137728600000002643 40.611957199999999091 Victory Boulevard 10314 Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 7114 -73.906850599999998508 40.619903399999998328 Avenue U 11234 Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 6409 -74.005288999999990551 40.628886000000001388 11 Avenue 11219 Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 1839 -73.948260899999993967 40.640827100000002758 Nostrand Avenue 11226 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 2014-03-03
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 2014-03-03
|
||||
Wendy'S Flatbush Avenue 8 2014-12-30
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06
|
||||
Riviera Caterer Stillwell Avenue 5 2014-06-10
|
||||
Tov Kosher Kitchen 63 Road 20 2014-11-24
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15
|
||||
Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13
|
||||
Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22
|
||||
Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7
|
||||
La Grenouille Manhattan 2014-04-09 02:00:00 A 10
|
||||
La Grenouille Manhattan 2013-03-05 01:00:00 A 9
|
||||
La Grenouille Manhattan 2012-02-02 01:00:00 A 13
|
||||
Le Perigord Manhattan 2014-07-14 02:00:00 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 2014-11-21 01:00:00
|
||||
Bistro Sk A 12 2014-02-19 01:00:00
|
||||
Bistro Sk B 18 2013-06-12 02:00:00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"projection":{"cuisine":0}}' CONNECTION='mongodb://localhost:27017' LRECL=1024
|
||||
OPTION_LIST='Driver=C,level=2,version=0';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL `FIELD_FORMAT`='_id',
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` double(23,20) DEFAULT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_date` bigint(13) DEFAULT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_grade` char(14) DEFAULT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_score` bigint(2) DEFAULT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mongodb://localhost:27017' `TABLE_TYPE`='JSON' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0' `LRECL`=1024
|
||||
SELECT name, borough, address_street, grades_score AS score FROM t1 WHERE grades_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=1' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 44 27 NULL
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=YES' CONNECTION='mongodb://localhost:27017' LRECL=1024;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.00
|
||||
notebook 1368 456.00
|
||||
paper 23 5.75
|
||||
planner 167 41.75
|
||||
postcard 23 5.75
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
|
|
@ -35,18 +35,18 @@ JsonValue('[11, 22, 33]' json_)
|
|||
[11,22,33]
|
||||
[11,22,33]
|
||||
[11,22,33]
|
||||
SELECT Json_Array();
|
||||
Json_Array()
|
||||
SELECT Json_Make_Array();
|
||||
Json_Make_Array()
|
||||
[]
|
||||
SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
Json_Array(56, 3.1416, 'My name is "Foo"', NULL)
|
||||
SELECT Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL)
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
SELECT Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE);
|
||||
Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE)
|
||||
SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE);
|
||||
Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE)
|
||||
[[56,3.141600,"foo"],true]
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
ERROR HY000: Can't initialize function 'json_array_add'; This function must have at least 2 arguments
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
Array
|
||||
[56,3.141600,"foo",null,"One more"]
|
||||
SELECT Json_Array_Add(JsonValue('one value'), 'One more');
|
||||
|
|
@ -70,33 +70,33 @@ Array
|
|||
SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9);
|
||||
Json_Array_Add('[5,3,8,7,9]' json_, 4, 9)
|
||||
[5,3,8,7,9,4]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1);
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1)
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1);
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1)
|
||||
[1,2,[11,22],"[2]"]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1);
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1)
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1);
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1)
|
||||
[1,2,[11,33,22]]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]');
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]')
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]');
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]')
|
||||
[1,2,[11,33,22]]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
Array
|
||||
[56,3.141600,"machin",null,"One more","Two more"]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
Array
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
Array
|
||||
[56,3.141600,"machin",1]
|
||||
[56,3.141600,"machin",2]
|
||||
[56,3.141600,"machin",3]
|
||||
[56,3.141600,"machin",4]
|
||||
[56,3.141600,"machin",5]
|
||||
SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
Array
|
||||
[1,3.141600,"machin",1]
|
||||
[2,3.141600,"machin",2]
|
||||
|
|
@ -106,49 +106,49 @@ Array
|
|||
SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array;
|
||||
Array
|
||||
[56,3.141600,"machin"]
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0)
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0)
|
||||
[3.141600,"My name is \"Foo\"",null]
|
||||
SELECT Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2)
|
||||
SELECT Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2)
|
||||
{"56":56,"3.1416":3.141600,"My name is Foo":"My name is Foo","NULL":null}
|
||||
Warnings:
|
||||
Warning 1105 First argument target is not an array
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2')
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2')
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
Warnings:
|
||||
Warning 1105 Missing or null array index
|
||||
SELECT Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2)
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2)
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
Warnings:
|
||||
Warning 1105 No sub-item at '2'
|
||||
SELECT Json_Object(56, 3.1416, 'foo', NULL);
|
||||
Json_Object(56, 3.1416, 'foo', NULL)
|
||||
Warning 1105 First argument target is not an array
|
||||
SELECT Json_Make_Object(56, 3.1416, 'foo', NULL);
|
||||
Json_Make_Object(56, 3.1416, 'foo', NULL)
|
||||
{"56":56,"3.1416":3.141600,"foo":"foo","NULL":null}
|
||||
SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty)
|
||||
SELECT Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty)
|
||||
{"qty":56,"price":3.141600,"truc":"foo","garanty":null}
|
||||
SELECT Json_Object();
|
||||
Json_Object()
|
||||
SELECT Json_Make_Object();
|
||||
Json_Make_Object()
|
||||
{}
|
||||
SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL);
|
||||
Json_Object(Json_Array(56, 3.1416, 'foo'), NULL)
|
||||
{"Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null}
|
||||
SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL)
|
||||
SELECT Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL);
|
||||
Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL)
|
||||
{"Make_Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null}
|
||||
SELECT Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL)
|
||||
[{"qty":56,"price":3.141600,"foo":"foo"},null]
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL);
|
||||
Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL)
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty');
|
||||
ERROR HY000: Can't initialize function 'json_object_key'; This function must have an even number of arguments
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color)
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color)
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null,"color":"blue"}
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price)
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price)
|
||||
{"qty":56,"price":45.990000,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1);
|
||||
Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1)
|
||||
|
|
@ -156,13 +156,13 @@ NULL
|
|||
Warnings:
|
||||
Warning 1105 Error 2 opening notexist.json
|
||||
Warning 1105 First argument target is not an object
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc')
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc')
|
||||
{"qty":56,"price":3.141600,"garanty":null}
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose')
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose')
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_List(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
SELECT Json_Object_List(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
Key List
|
||||
["qty","price","truc","garanty"]
|
||||
SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List";
|
||||
|
|
@ -183,12 +183,12 @@ TRANSLATOR CHAR(80),
|
|||
PUBLISHER CHAR(32),
|
||||
DATEPUB int(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Array(AUTHOR, TITLE, DATEPUB)
|
||||
SELECT Json_Make_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Make_Array(AUTHOR, TITLE, DATEPUB)
|
||||
["Jean-Christophe Bernadac","Construire une application XML",1999]
|
||||
["William J. Pardi","XML en Action",1999]
|
||||
SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Object(AUTHOR, TITLE, DATEPUB)
|
||||
SELECT Json_Make_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Make_Object(AUTHOR, TITLE, DATEPUB)
|
||||
{"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999}
|
||||
{"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999}
|
||||
SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2;
|
||||
|
|
@ -206,8 +206,8 @@ DEPARTMENT CHAr(4) NOT NULL FLAG=41,
|
|||
SECRETARY CHAR(5) DEFAULT NULL FLAG=46,
|
||||
SALARY DOUBLE(8,2) NOT NULL FLAG=52
|
||||
) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1;
|
||||
SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
Json_Object(SERIALNO, NAME, TITLE, SALARY)
|
||||
SELECT Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)
|
||||
{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000}
|
||||
SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT;
|
||||
DEPARTMENT Json_Array_Grp(NAME)
|
||||
|
|
@ -220,8 +220,8 @@ Warning 1105 Result truncated to json_grp_size values
|
|||
SELECT JsonSet_Grp_Size(30);
|
||||
JsonSet_Grp_Size(30)
|
||||
30
|
||||
SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
Json_Object(title, Json_Array_Grp(name) `json_names`)
|
||||
SELECT Json_Make_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
Json_Make_Object(title, Json_Array_Grp(name) `json_names`)
|
||||
{"title":"ADMINISTRATOR","names":["GOOSEPEN","FUNNIGUY","SHRINKY"]}
|
||||
{"title":"DIRECTOR","names":["QUINN","WERTHER","STRONG"]}
|
||||
{"title":"ENGINEER","names":["BROWNY","ORELLY","MARTIN","TONGHO","WALTER","SMITH"]}
|
||||
|
|
@ -230,26 +230,26 @@ Json_Object(title, Json_Array_Grp(name) `json_names`)
|
|||
{"title":"SCIENTIST","names":["BIGHEAD","BIGHORN"]}
|
||||
{"title":"SECRETARY","names":["MESSIFUL","HONEY","SHORTSIGHT","CHERRY","MONAPENNY"]}
|
||||
{"title":"TYPIST","names":["KITTY","PLUMHEAD"]}
|
||||
SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Array(DEPARTMENT, Json_Array_Grp(NAME))
|
||||
SELECT Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME))
|
||||
["0021",["STRONG","SHORTSIGHT"]]
|
||||
["0318",["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]]
|
||||
["0319",["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]]
|
||||
["2452",["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]]
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES)
|
||||
{"DEPARTMENT":"0021","NAMES":["STRONG","SHORTSIGHT"]}
|
||||
{"DEPARTMENT":"0318","NAMES":["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]}
|
||||
{"DEPARTMENT":"0319","NAMES":["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]}
|
||||
{"DEPARTMENT":"2452","NAMES":["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]}
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES)
|
||||
{"DEPARTMENT":"0021","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","TITLE":"DIRECTOR","SALARY":23000.000000},{"SERIALNO":"22222","NAME":"SHORTSIGHT","TITLE":"SECRETARY","SALARY":5500.000000}]}
|
||||
{"DEPARTMENT":"0318","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","TITLE":"SALESMAN","SALARY":9600.000000},{"SERIALNO":"24888","NAME":"PLUMHEAD","TITLE":"TYPIST","SALARY":2800.000000},{"SERIALNO":"27845","NAME":"HONEY","TITLE":"SECRETARY","SALARY":4900.000000},{"SERIALNO":"73452","NAME":"TONGHO","TITLE":"ENGINEER","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","TITLE":"ENGINEER","SALARY":7400.000000},{"SERIALNO":"77777","NAME":"SHRINKY","TITLE":"ADMINISTRATOR","SALARY":7500.000000},{"SERIALNO":"70012","NAME":"WERTHER","TITLE":"DIRECTOR","SALARY":14500.000000},{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","TITLE":"SALESMAN","SALARY":10030.000000}]}
|
||||
{"DEPARTMENT":"0319","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","TITLE":"SALESMAN","SALARY":14800.000000},{"SERIALNO":"40567","NAME":"QUINN","TITLE":"DIRECTOR","SALARY":14000.000000},{"SERIALNO":"00137","NAME":"BROWNY","TITLE":"ENGINEER","SALARY":10500.000000},{"SERIALNO":"12345","NAME":"KITTY","TITLE":"TYPIST","SALARY":3000.450000},{"SERIALNO":"33333","NAME":"MONAPENNY","TITLE":"SECRETARY","SALARY":3800.000000},{"SERIALNO":"00023","NAME":"MARTIN","TITLE":"ENGINEER","SALARY":10000.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","TITLE":"ADMINISTRATOR","SALARY":8500.000000},{"SERIALNO":"45678","NAME":"BUGHAPPY","TITLE":"PROGRAMMER","SALARY":8500.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","TITLE":"SALESMAN","SALARY":7000.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","TITLE":"SECRETARY","SALARY":5000.500000},{"SERIALNO":"98765","NAME":"GOOSEPEN","TITLE":"ADMINISTRATOR","SALARY":4700.000000}]}
|
||||
{"DEPARTMENT":"2452","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","TITLE":"SCIENTIST","SALARY":8000.000000},{"SERIALNO":"31416","NAME":"ORELLY","TITLE":"ENGINEER","SALARY":13400.000000},{"SERIALNO":"36666","NAME":"BIGHORN","TITLE":"SCIENTIST","SALARY":11000.000000},{"SERIALNO":"02345","NAME":"SMITH","TITLE":"ENGINEER","SALARY":9000.000000},{"SERIALNO":"11111","NAME":"CHERRY","TITLE":"SECRETARY","SALARY":4500.000000}]}
|
||||
SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES)
|
||||
{"DEPARTMENT":"0021","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","SALARY":23000.000000}]}
|
||||
{"DEPARTMENT":"0021","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"22222","NAME":"SHORTSIGHT","SALARY":5500.000000}]}
|
||||
{"DEPARTMENT":"0318","TITLE":"ADMINISTRATOR","EMPLOYES":[{"SERIALNO":"77777","NAME":"SHRINKY","SALARY":7500.000000}]}
|
||||
|
|
@ -273,8 +273,8 @@ ERROR HY000: Can't initialize function 'json_object_grp'; This function requires
|
|||
SELECT Json_Object_Grp(NAME, SALARY) FROM t3;
|
||||
Json_Object_Grp(NAME, SALARY)
|
||||
{"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000}
|
||||
SELECT Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES")
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES")
|
||||
{"DEPARTMENT":"0021","SALARIES":{"STRONG":23000.000000,"SHORTSIGHT":5500.000000}}
|
||||
{"DEPARTMENT":"0318","SALARIES":{"BANCROFT":9600.000000,"PLUMHEAD":2800.000000,"HONEY":4900.000000,"TONGHO":6800.000000,"WALTER":7400.000000,"SHRINKY":7500.000000,"WERTHER":14500.000000,"MERCHANT":8700.000000,"WHEELFOR":10030.000000}}
|
||||
{"DEPARTMENT":"0319","SALARIES":{"BULLOZER":14800.000000,"QUINN":14000.000000,"BROWNY":10500.000000,"KITTY":3000.450000,"MONAPENNY":3800.000000,"MARTIN":10000.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"FODDERMAN":7000.000000,"MESSIFUL":5000.500000,"GOOSEPEN":4700.000000}}
|
||||
|
|
@ -309,26 +309,26 @@ SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3;
|
|||
JsonGet_String(Json_Array_Grp(name),'[>]')
|
||||
WHEELFOR
|
||||
SET @j1 = '[45,28,36,45,89]';
|
||||
SELECT JsonGet_String(@j1,'[1]');
|
||||
JsonGet_String(@j1,'[1]')
|
||||
SELECT JsonGet_String(@j1,'1');
|
||||
JsonGet_String(@j1,'1')
|
||||
28
|
||||
SELECT JsonGet_String(@j1 json_,'[3]');
|
||||
JsonGet_String(@j1 json_,'[3]')
|
||||
SELECT JsonGet_String(@j1 json_,'3');
|
||||
JsonGet_String(@j1 json_,'3')
|
||||
45
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]');
|
||||
JsonGet_String(Json_Array(45,28,36,45,89),'[3]')
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'3');
|
||||
JsonGet_String(Json_Make_Array(45,28,36,45,89),'3')
|
||||
45
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum";
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Make_Array(45,28,36,45,89),'[+]') "sum";
|
||||
list egal sum
|
||||
45+28+36+45+89 = 243.00
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]');
|
||||
JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]')
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0');
|
||||
JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0')
|
||||
36
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*');
|
||||
JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*')
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*');
|
||||
JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*')
|
||||
[36,45,89]
|
||||
SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc')
|
||||
SELECT JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc')
|
||||
machin
|
||||
SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}';
|
||||
SELECT JsonGet_String(@j2 json_,'truc');
|
||||
|
|
@ -345,14 +345,14 @@ JsonGet_String(NULL json_, NULL)
|
|||
NULL
|
||||
Warnings:
|
||||
Warning 1105
|
||||
SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_String(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500.00
|
||||
0318 72230.00
|
||||
0319 89800.95
|
||||
2452 45900.00
|
||||
SELECT JsonGet_Int(@j1, '[4]');
|
||||
JsonGet_Int(@j1, '[4]')
|
||||
SELECT JsonGet_Int(@j1, '4');
|
||||
JsonGet_Int(@j1, '4')
|
||||
89
|
||||
SELECT JsonGet_Int(@j1, '[#]');
|
||||
JsonGet_Int(@j1, '[#]')
|
||||
|
|
@ -360,26 +360,26 @@ JsonGet_Int(@j1, '[#]')
|
|||
SELECT JsonGet_Int(@j1, '[+]');
|
||||
JsonGet_Int(@j1, '[+]')
|
||||
243
|
||||
SELECT JsonGet_Int(@j1 json_, '[3]');
|
||||
JsonGet_Int(@j1 json_, '[3]')
|
||||
SELECT JsonGet_Int(@j1 json_, '3');
|
||||
JsonGet_Int(@j1 json_, '3')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[3]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[3]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[+]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]')
|
||||
243
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0')
|
||||
36
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]');
|
||||
JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1');
|
||||
JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1')
|
||||
28
|
||||
SELECT JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty')
|
||||
SELECT JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty')
|
||||
56
|
||||
SELECT JsonGet_Int(@j2 json_, 'price');
|
||||
JsonGet_Int(@j2 json_, 'price')
|
||||
|
|
@ -390,38 +390,38 @@ JsonGet_Int(@j2, 'qty')
|
|||
SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose')
|
||||
NULL
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)), '[1]:*'), '[+]') sum;
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)), '1.*'), '[+]') sum;
|
||||
sum
|
||||
170
|
||||
SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_Int(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500
|
||||
0318 72230
|
||||
0319 89800
|
||||
2452 45900
|
||||
SELECT JsonGet_Real(@j1, '[2]');
|
||||
JsonGet_Real(@j1, '[2]')
|
||||
SELECT JsonGet_Real(@j1, '2');
|
||||
JsonGet_Real(@j1, '2')
|
||||
36.000000000000000
|
||||
SELECT JsonGet_Real(@j1 json_, '[3]', 2);
|
||||
JsonGet_Real(@j1 json_, '[3]', 2)
|
||||
SELECT JsonGet_Real(@j1 json_, '3', 2);
|
||||
JsonGet_Real(@j1 json_, '3', 2)
|
||||
45.00
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[3]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[3]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3')
|
||||
45.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]')
|
||||
45.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[+]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]')
|
||||
243.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[!]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[!]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]')
|
||||
48.600000000000000
|
||||
SELECT JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0')
|
||||
36.000000000000000
|
||||
SELECT JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price')
|
||||
SELECT JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price')
|
||||
3.141600000000000
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty');
|
||||
JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty')
|
||||
|
|
@ -435,7 +435,7 @@ JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'pric
|
|||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose')
|
||||
NULL
|
||||
SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_Real(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500.000000000000000
|
||||
0318 72230.000000000000000
|
||||
|
|
@ -445,11 +445,11 @@ department Sumsal
|
|||
# Documentation examples
|
||||
#
|
||||
SELECT
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '4') "Rank",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Make_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
Rank Number Concat Sum Avg
|
||||
89 5 45,28,36,45,89 243 48.60
|
||||
SELECT
|
||||
|
|
@ -464,33 +464,33 @@ Real
|
|||
#
|
||||
# Testing Locate
|
||||
#
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin')
|
||||
truc
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56)
|
||||
qty
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416)
|
||||
price
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose')
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin')
|
||||
$.truc
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56)
|
||||
$.qty
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416)
|
||||
$.price
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose')
|
||||
NULL
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path;
|
||||
Path
|
||||
AUTHORS:[1]:FN
|
||||
$.AUTHORS[1].FN
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path;
|
||||
Path
|
||||
AUTHORS:[1]:FN
|
||||
$.AUTHORS[1].FN
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path;
|
||||
Path
|
||||
AUTHORS:[1]
|
||||
$.AUTHORS[1]
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"jack", "LN":"London"}' json_) Path;
|
||||
Path
|
||||
NULL
|
||||
SELECT JsonLocate('[45,28,36,45,89]',36);
|
||||
JsonLocate('[45,28,36,45,89]',36)
|
||||
[2]
|
||||
$[2]
|
||||
SELECT JsonLocate('[45,28,36,45,89]' json_,28.0);
|
||||
JsonLocate('[45,28,36,45,89]' json_,28.0)
|
||||
NULL
|
||||
|
|
@ -499,71 +499,71 @@ Json_Locate_All('[45,28,36,45,89]',10)
|
|||
[]
|
||||
SELECT Json_Locate_All('[45,28,36,45,89]',45);
|
||||
Json_Locate_All('[45,28,36,45,89]',45)
|
||||
["[0]","[3]"]
|
||||
["$[0]","$[3]"]
|
||||
SELECT Json_Locate_All('[[45,28],36,45,89]',45);
|
||||
Json_Locate_All('[[45,28],36,45,89]',45)
|
||||
["[0]:[0]","[2]"]
|
||||
["$[0][0]","$[2]"]
|
||||
SELECT Json_Locate_All('[[45,28,45],36,45,89]',45);
|
||||
Json_Locate_All('[[45,28,45],36,45,89]',45)
|
||||
["[0]:[0]","[0]:[2]","[2]"]
|
||||
["$[0][0]","$[0][2]","$[2]"]
|
||||
SELECT Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]'));
|
||||
Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]'))
|
||||
["[0]:[0]","[0]:[2]","[2]"]
|
||||
["$[0][0]","$[0][2]","$[2]"]
|
||||
SELECT JsonLocate('[[45,28,45],36,45,89]',45,n) from t1;
|
||||
JsonLocate('[[45,28,45],36,45,89]',45,n)
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
NULL
|
||||
NULL
|
||||
SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) FROM t1;
|
||||
JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']'))
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
NULL
|
||||
NULL
|
||||
SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) AS `Path` FROM t1 GROUP BY n HAVING `Path` IS NOT NULL;
|
||||
Path
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
SELECT Json_Locate_All('[45,28,[36,45,89]]',45);
|
||||
Json_Locate_All('[45,28,[36,45,89]]',45)
|
||||
["[0]","[2]:[1]"]
|
||||
["$[0]","$[2][1]"]
|
||||
SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0));
|
||||
Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0))
|
||||
[]
|
||||
SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',45.0);
|
||||
Json_Locate_All('[[45,28],[36,45.0,89]]',45.0)
|
||||
["[1]:[1]"]
|
||||
["$[1][1]"]
|
||||
SELECT JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_);
|
||||
JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_)
|
||||
[1]
|
||||
$[1]
|
||||
SELECT JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_);
|
||||
JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_)
|
||||
[0]
|
||||
$[0]
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths";
|
||||
All paths
|
||||
[]
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_);
|
||||
Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_)
|
||||
["[1]:[0]"]
|
||||
["$[1][0]"]
|
||||
SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs";
|
||||
Nb of occurs
|
||||
2
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2);
|
||||
Json_Locate_All('[[45,28],[[36,45],89]]',45,2)
|
||||
["[0]:[0]"]
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]');
|
||||
JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]')
|
||||
[0]
|
||||
["$[0][0]"]
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0');
|
||||
JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0')
|
||||
$[0]
|
||||
SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab');
|
||||
JsonLocate(Json_File('test/biblio.json'), 'Knab')
|
||||
[0]:AUTHOR:[1]:LASTNAME
|
||||
$[0].AUTHOR[1].LASTNAME
|
||||
SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab');
|
||||
Json_Locate_All('test/biblio.json' jfile_, 'Knab')
|
||||
["[0]:AUTHOR:[1]:LASTNAME"]
|
||||
["$[0].AUTHOR[1].LASTNAME"]
|
||||
#
|
||||
# Testing json files
|
||||
#
|
||||
|
|
@ -595,54 +595,54 @@ Warning 1105 File pretty format doesn't match the specified pretty value
|
|||
SELECT Json_File('test/fx.json', 0);
|
||||
Json_File('test/fx.json', 0)
|
||||
[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}]
|
||||
SELECT Json_File('test/fx.json', '[0]');
|
||||
Json_File('test/fx.json', '[0]')
|
||||
SELECT Json_File('test/fx.json', '0');
|
||||
Json_File('test/fx.json', '0')
|
||||
{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]}
|
||||
SELECT Json_File('test/fx.json', '[?]');
|
||||
Json_File('test/fx.json', '[?]')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1105 Invalid function specification ?
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*');
|
||||
JsonGet_String(Json_File('test/fx.json'), '[1]:*')
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1.*');
|
||||
JsonGet_String(Json_File('test/fx.json'), '1.*')
|
||||
{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]}
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]');
|
||||
JsonGet_String(Json_File('test/fx.json'), '[1]')
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1');
|
||||
JsonGet_String(Json_File('test/fx.json'), '1')
|
||||
6 car roadster 56000 6 9
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage;
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '1.mileage') AS Mileage;
|
||||
Mileage
|
||||
56000
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price;
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '0.price', 2) AS Price;
|
||||
Price
|
||||
5.65
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings')
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4,6]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings')
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1);
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1)
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1);
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0);
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0)
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0);
|
||||
Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0)
|
||||
[6,2,4]
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1);
|
||||
Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1)
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1);
|
||||
Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2]}
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin);
|
||||
Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin)
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin);
|
||||
Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"france","ratings":[2,4]}
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size')
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]}
|
||||
Warnings:
|
||||
Warning 1105 No sub-item at 'size'
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size')
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size')
|
||||
{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":70},"ratings":[5,8,7]}
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size'));
|
||||
Json_Object_List(Json_File('test/fx.json', '[3]:size'))
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '3.size'));
|
||||
Json_Object_List(Json_File('test/fx.json', '3.size'))
|
||||
["W","L","H"]
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), NULL),
|
|||
SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]');
|
||||
Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]')
|
||||
[56,[3.141600],true]
|
||||
SELECT Json_Array(1, TRUE, 0, FALSE);
|
||||
Json_Array(1, TRUE, 0, FALSE)
|
||||
SELECT Json_Make_Array(1, TRUE, 0, FALSE);
|
||||
Json_Make_Array(1, TRUE, 0, FALSE)
|
||||
[1,true,0,false]
|
||||
SELECT Json_Serialize(Jbin_Array(TRUE, FALSE));
|
||||
Json_Serialize(Jbin_Array(TRUE, FALSE))
|
||||
|
|
@ -63,94 +63,94 @@ Json_Serialize(Jbin_File('gloss.json'))
|
|||
{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
|
||||
SELECT JsonLocate(Jbin_File('gloss.json'),'XML');
|
||||
JsonLocate(Jbin_File('gloss.json'),'XML')
|
||||
glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso:[1]
|
||||
$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[1]
|
||||
SELECT Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33));
|
||||
Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33))
|
||||
{"first":"foo","second":["a",33]}
|
||||
SELECT Json_Get_Item(Json_Array('a','b','c'), '[1]');
|
||||
Json_Get_Item(Json_Array('a','b','c'), '[1]')
|
||||
SELECT Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]');
|
||||
Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Get_Item(Json_Object('foo' AS "first", Json_Array('a', 33) AS "json_second"), 'second') AS "item";
|
||||
SELECT Json_Get_Item(Json_Make_Object('foo' AS "first", Json_Make_Array('a', 33) AS "json_second"), '$.second') AS "item";
|
||||
item
|
||||
["a",33]
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), 'second:*') item;
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), '$.second') item;
|
||||
item
|
||||
["a",33]
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv')
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'));
|
||||
Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'))
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'));
|
||||
Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'))
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*')
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') lang;
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') lang;
|
||||
lang
|
||||
GML
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') "See also";
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') "See also";
|
||||
See also
|
||||
["GML","XML"]
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso')) "See also";
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso')) "See also";
|
||||
See also
|
||||
["GML","XML"]
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso'),'[0]') lang;
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso'),'$[0]') lang;
|
||||
lang
|
||||
GML
|
||||
#
|
||||
# Test Item Get/Set/Insert/Update UDF's
|
||||
#
|
||||
SELECT Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]');
|
||||
Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]')
|
||||
SELECT Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]');
|
||||
Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]')
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]')
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)))
|
||||
SELECT Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)))
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 'foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$.foo');
|
||||
ERROR HY000: Can't initialize function 'json_set_item'; This function must have an odd number of arguments
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]')
|
||||
[1,7,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]')
|
||||
[1,7,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]')
|
||||
[1,2,[7,8,9]]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
Warnings:
|
||||
Warning 1105 Invalid specification * in a write path
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]')
|
||||
[1,[7,8,"toto"],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre')
|
||||
[1,2,{"trois":3,"quatre":44}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc')
|
||||
|
|
@ -163,32 +163,32 @@ Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '*'
|
|||
[1,2,{"trois":3,"quatre":4}]
|
||||
Warnings:
|
||||
Warning 1105 Invalid specification * in a write path
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'));
|
||||
Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'))
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'));
|
||||
Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'))
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre')
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre')
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre')
|
||||
[1,[7,8,9],{"trois":3,"quatre":44}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,10,9],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]')
|
||||
[1,2,{"trois":3,"quatre":4},5]
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
#
|
||||
# Test merging items UDF's
|
||||
|
|
@ -196,7 +196,7 @@ Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5,
|
|||
SELECT Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f'));
|
||||
Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f'))
|
||||
["a","b","c","d","e","f"]
|
||||
SELECT Json_Item_Merge(Json_Array('a','b','c'), Json_Array('d','e','f')) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Array('a','b','c'), Json_Make_Array('d','e','f')) AS "Result";
|
||||
Result
|
||||
["a","b","c","d","e","f"]
|
||||
SELECT Json_Array_Add(Jbin_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')), 'and', 3);
|
||||
|
|
@ -216,7 +216,7 @@ Json_Object_Add(Jbin_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d
|
|||
SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f"));
|
||||
Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f"))
|
||||
{"a":4,"b":2,"c":3,"e":5,"f":6}
|
||||
SELECT Json_Item_Merge('foo', Json_Array('d','e','f'));
|
||||
SELECT Json_Item_Merge('foo', Json_Make_Array('d','e','f'));
|
||||
ERROR HY000: Can't initialize function 'json_item_merge'; First argument must be a json item
|
||||
#
|
||||
# Test making file UDF's
|
||||
|
|
@ -294,17 +294,17 @@ Json_File('bt1.json', 2)
|
|||
SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json')
|
||||
bt1.json
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
Result
|
||||
{"foo":["a","b","c","d"]}
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
Result
|
||||
{"Array_Add(Jbin_File('bt1.json'), 'd')":["a","b","c","d"]}
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b","c","d"]}
|
||||
# This does modify the file
|
||||
SELECT Json_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b","c","d"]}
|
||||
SELECT Json_File('bt1.json');
|
||||
|
|
@ -319,7 +319,7 @@ Json_File('bt1.json')
|
|||
SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2);
|
||||
Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2)
|
||||
["a","b","c"]
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b","c","d"],"t1":1}
|
||||
{"bt1":["a","b","c","d"],"t1":2}
|
||||
|
|
@ -432,23 +432,23 @@ SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
|||
Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json')
|
||||
bt1.json
|
||||
# Test DELETE from file
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
Result
|
||||
{"Array_Delete(Jbin_File('bt1.json'), 1)":["a","c"]}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["b","c"],"t1":1}
|
||||
{"bt1":["b","c"],"t1":2}
|
||||
{"bt1":["b","c"],"t1":3}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
{"bt1":["a"]}
|
||||
{"bt1":[]}
|
||||
SELECT Json_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
{"bt1":["a"]}
|
||||
|
|
@ -475,17 +475,17 @@ SELECT Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"));
|
|||
Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"))
|
||||
{"a":1,"b":2,"c":3,"d":4}
|
||||
# First query (file not modified)
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4}}
|
||||
# First query (file modified)
|
||||
SELECT Json_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4}}
|
||||
SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0);
|
||||
Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0)
|
||||
bt2.json
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4},"t1":1}
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4},"t1":2}
|
||||
|
|
@ -526,22 +526,22 @@ SELECT Json_File(Json_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",
|
|||
Result
|
||||
{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6}
|
||||
|
||||
SELECT Json_Item_Merge(Json_Object(1 "a", 2 "b", 3 "c"), Json_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Object(1 "a", 2 "b", 3 "c"), Json_Make_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
Result
|
||||
{"a":1,"b":5,"c":3,"d":4,"f":6}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
Result
|
||||
{"Object_Delete(Jbin_File('bt2.json'), 'b')":{"a":1,"c":3,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":{"d":4,"e":5,"f":6},"t1":1}
|
||||
{"bt1":{"d":4,"e":5,"f":6},"t1":2}
|
||||
|
|
@ -552,14 +552,14 @@ Key list
|
|||
SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0);
|
||||
Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0)
|
||||
bt3.json
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', 'b'), 66);
|
||||
Json_Array_Add(Json_File('bt3.json', 'b'), 66)
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66);
|
||||
Json_Array_Add(Json_File('bt3.json', '$.b'), 66)
|
||||
[44,55,66]
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, 'b');
|
||||
Json_Array_Add(Json_File('bt3.json'), 66, 'b')
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b');
|
||||
Json_Array_Add(Json_File('bt3.json'), 66, '$.b')
|
||||
{"a":1,"b":[44,55,66]}
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', 'b'), 66);
|
||||
Json_Array_Add(Jbin_File('bt3.json', 'b'), 66)
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66);
|
||||
Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66)
|
||||
bt3.json
|
||||
SELECT Json_File('bt3.json', 3);
|
||||
Json_File('bt3.json', 3)
|
||||
|
|
@ -573,15 +573,15 @@ jfile_cols CHAR(12) NOT NULL)
|
|||
ENGINE= MYISAM;
|
||||
INSERT INTO t2 VALUES(1,'bt3.json');
|
||||
# In this table, the jfile_cols column just contains a file name
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '*')
|
||||
{"a":1,"b":[44,55,66]}
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, 'b:[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, 'b:*') FROM t2;
|
||||
JsonGet_String(jfile_cols, 'b:*')
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '$.b.*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '$.b.*')
|
||||
[44,55,66,77]
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, 'b:') , 99, 'b:') WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, '$.b[]') , 99, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '*')
|
||||
{"a":1,"b":[44,55,66,77,88,99]}
|
||||
|
|
|
|||
380
storage/connect/mysql-test/connect/r/mongo_c.result
Normal file
380
storage/connect/mysql-test/connect/r/mongo_c.result
Normal file
|
|
@ -0,0 +1,380 @@
|
|||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris ParkBakeShop", "restaurant_id":"30075445"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
|
||||
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj ReynoldsPubAndRestaurant", "restaurant_id":"30191841"}
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8 ;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath
|
||||
_id 1 CHAR 24 24 0 0
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 512 512 0 0 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_0 1 CHAR 512 512 0 1 grades.0
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=C,Version=0' DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` varchar(512) NOT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_0` varchar(512) DEFAULT NULL `FIELD_FORMAT`='grades.0',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=C,Version=0' `DATA_CHARSET`='utf8'
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982419999999990523,40.579504999999997494],"street":"Stillwell Avenue", "zipcode":"11224"} Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115199999995639,40.731173900000001709],"street":"63 Road", "zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880382699999998408,40.764312400000001446],"street":"Astoria Boulevard", "zipcode":"11369"} Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137728600000002643,40.611957199999999091],"street":"Victory Boulevard", "zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906850599999998508,40.619903399999998328],"street":"Avenue U", "zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005288999999990551,40.628886000000001388],"street":"11 Avenue", "zipcode":"11219"} Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948260899999993967,40.640827100000002758],"street":"Nostrand Avenue", "zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0' ;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 2014-03-03
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 2014-03-03
|
||||
Wendy'S Flatbush Avenue 8 2014-12-30
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06
|
||||
Riviera Caterer Stillwell Avenue 5 2014-06-10
|
||||
Tov Kosher Kitchen 63 Road 20 2014-11-24
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=C,Version=0' ;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=1' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15
|
||||
Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13
|
||||
Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22
|
||||
Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7
|
||||
La Grenouille Manhattan 2014-04-09 02:00:00 A 10
|
||||
La Grenouille Manhattan 2013-03-05 01:00:00 A 9
|
||||
La Grenouille Manhattan 2012-02-02 01:00:00 A 13
|
||||
Le Perigord Manhattan 2014-07-14 02:00:00 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 2014-11-21 01:00:00
|
||||
Bistro Sk A 12 2014-02-19 01:00:00
|
||||
Bistro Sk B 18 2013-06-12 02:00:00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"projection":{"cuisine":0}}'
|
||||
OPTION_LIST='Driver=C,level=2,version=0';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord_0` double(12,6) NOT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_0_score` int(11) NOT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(32) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0'
|
||||
SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=C,Version=0' ;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=C,Version=0' DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=1' ;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=C,Version=0' ;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 NULL 44 27
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=C,Version=0,Pipeline=YES' ;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.000000
|
||||
notebook 1368 456.000000
|
||||
paper 23 5.750000
|
||||
planner 167 41.750000
|
||||
postcard 23 5.750000
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
381
storage/connect/mysql-test/connect/r/mongo_java_2.result
Normal file
381
storage/connect/mysql-test/connect/r/mongo_java_2.result
Normal file
|
|
@ -0,0 +1,381 @@
|
|||
SET GLOBAL connect_class_path='C:/MariaDB-10.0/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar';
|
||||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51c"} , "address" : { "building" : "1007" , "coord" : [ -73.856077 , 40.848447] , "street" : "Morris Park Ave" , "zipcode" : "10462"} , "borough" : "Bronx" , "cuisine" : "Bakery" , "grades" : [ { "date" : { "$date" : "2014-03-03T00:00:00.000Z"} , "grade" : "A" , "score" : 2} , { "date" : { "$date" : "2013-09-11T00:00:00.000Z"} , "grade" : "A" , "score" : 6} , { "date" : { "$date" : "2013-01-24T00:00:00.000Z"} , "grade" : "A" , "score" : 10} , { "date" : { "$date" : "2011-11-23T00:00:00.000Z"} , "grade" : "A" , "score" : 9} , { "date" : { "$date" : "2011-03-10T00:00:00.000Z"} , "grade" : "B" , "score" : 14}] , "name" : "Morris Park Bake Shop" , "restaurant_id" : "30075445"}
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51d"} , "address" : { "building" : "469" , "coord" : [ -73.961704 , 40.662942] , "street" : "Flatbush Avenue" , "zipcode" : "11225"} , "borough" : "Brooklyn" , "cuisine" : "Hamburgers" , "grades" : [ { "date" : { "$date" : "2014-12-30T00:00:00.000Z"} , "grade" : "A" , "score" : 8} , { "date" : { "$date" : "2014-07-01T00:00:00.000Z"} , "grade" : "B" , "score" : 23} , { "date" : { "$date" : "2013-04-30T00:00:00.000Z"} , "grade" : "A" , "score" : 12} , { "date" : { "$date" : "2012-05-08T00:00:00.000Z"} , "grade" : "A" , "score" : 12}] , "name" : "Wendy'S" , "restaurant_id" : "30112340"}
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51e"} , "address" : { "building" : "351" , "coord" : [ -73.98513559999999 , 40.7676919] , "street" : "West 57 Street" , "zipcode" : "10019"} , "borough" : "Manhattan" , "cuisine" : "Irish" , "grades" : [ { "date" : { "$date" : "2014-09-06T00:00:00.000Z"} , "grade" : "A" , "score" : 2} , { "date" : { "$date" : "2013-07-22T00:00:00.000Z"} , "grade" : "A" , "score" : 11} , { "date" : { "$date" : "2012-07-31T00:00:00.000Z"} , "grade" : "A" , "score" : 12} , { "date" : { "$date" : "2011-12-29T00:00:00.000Z"} , "grade" : "A" , "score" : 12}] , "name" : "Dj Reynolds Pub And Restaurant" , "restaurant_id" : "30191841"}
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8 ;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath
|
||||
_id 1 CHAR 24 24 0 0
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 41 41 0 0 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_0 1 CHAR 99 99 0 1 grades.0
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=2' DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` char(41) NOT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_0` char(99) DEFAULT NULL `FIELD_FORMAT`='grades.0',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8'
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 [ -73.856077 , 40.848447] Morris Park Ave 10462 Bronx Bakery { "date" : { "$date" : "2014-03-03T00:00:00.000Z"} , "grade" : "A" , "score" : 2} Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 [ -73.961704 , 40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers { "date" : { "$date" : "2014-12-30T00:00:00.000Z"} , "grade" : "A" , "score" : 8} Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 [ -73.98513559999999 , 40.7676919] West 57 Street 10019 Manhattan Irish { "date" : { "$date" : "2014-09-06T00:00:00.000Z"} , "grade" : "A" , "score" : 2} Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 [ -73.98241999999999 , 40.579505] Stillwell Avenue 11224 Brooklyn American { "date" : { "$date" : "2014-06-10T00:00:00.000Z"} , "grade" : "A" , "score" : 5} Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 [ -73.8601152 , 40.7311739] 63 Road 11374 Queens Jewish/Kosher { "date" : { "$date" : "2014-11-24T00:00:00.000Z"} , "grade" : "Z" , "score" : 20} Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=2,level=0' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c { "building" : "1007" , "coord" : [ -73.856077 , 40.848447] , "street" : "Morris Park Ave" , "zipcode" : "10462"} Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d { "building" : "469" , "coord" : [ -73.961704 , 40.662942] , "street" : "Flatbush Avenue" , "zipcode" : "11225"} Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e { "building" : "351" , "coord" : [ -73.98513559999999 , 40.7676919] , "street" : "West 57 Street" , "zipcode" : "10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f { "building" : "2780" , "coord" : [ -73.98241999999999 , 40.579505] , "street" : "Stillwell Avenue" , "zipcode" : "11224"} Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 { "building" : "97-22" , "coord" : [ -73.8601152 , 40.7311739] , "street" : "63 Road" , "zipcode" : "11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 { "building" : "8825" , "coord" : [ -73.8803827 , 40.7643124] , "street" : "Astoria Boulevard" , "zipcode" : "11369"} Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 { "building" : "2206" , "coord" : [ -74.1377286 , 40.6119572] , "street" : "Victory Boulevard" , "zipcode" : "10314"} Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 { "building" : "7114" , "coord" : [ -73.9068506 , 40.6199034] , "street" : "Avenue U" , "zipcode" : "11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 { "building" : "6409" , "coord" : [ -74.00528899999999 , 40.628886] , "street" : "11 Avenue" , "zipcode" : "11219"} Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 { "building" : "1839" , "coord" : [ -73.9482609 , 40.6408271] , "street" : "Nostrand Avenue" , "zipcode" : "11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2' ;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 2014-03-03
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 2014-03-03
|
||||
Wendy'S Flatbush Avenue 8 2014-12-30
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06
|
||||
Riviera Caterer Stillwell Avenue 5 2014-06-10
|
||||
Tov Kosher Kitchen 63 Road 20 2014-11-24
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=Java,Version=2' ;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=1' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15
|
||||
Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13
|
||||
Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22
|
||||
Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7
|
||||
La Grenouille Manhattan 2014-04-09 02:00:00 A 10
|
||||
La Grenouille Manhattan 2013-03-05 01:00:00 A 9
|
||||
La Grenouille Manhattan 2012-02-02 01:00:00 A 13
|
||||
Le Perigord Manhattan 2014-07-14 02:00:00 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 2014-11-21 01:00:00
|
||||
Bistro Sk A 12 2014-02-19 01:00:00
|
||||
Bistro Sk B 18 2013-06-12 02:00:00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"cuisine":0}'
|
||||
OPTION_LIST='Driver=Java,level=2,version=2';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(32) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2'
|
||||
SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=Java,Version=2' ;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=Java,Version=2' DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=1' ;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=2' ;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 NULL 44 27
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=2,Pipeline=YES' ;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.00
|
||||
notebook 1368 456.00
|
||||
paper 23 5.75
|
||||
planner 167 41.75
|
||||
postcard 23 5.75
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
381
storage/connect/mysql-test/connect/r/mongo_java_3.result
Normal file
381
storage/connect/mysql-test/connect/r/mongo_java_3.result
Normal file
|
|
@ -0,0 +1,381 @@
|
|||
SET GLOBAL connect_class_path='C:/MariaDB-10.0/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar';
|
||||
set connect_enable_mongo=1;
|
||||
#
|
||||
# Test the MONGO table type
|
||||
#
|
||||
CREATE TABLE t1 (Document varchar(1024) field_format='*')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET=utf8;
|
||||
SELECT * from t1 limit 3;
|
||||
Document
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51c" }, "address" : { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [{ "date" : { "$date" : 1393804800000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1378857600000 }, "grade" : "A", "score" : 6 }, { "date" : { "$date" : 1358985600000 }, "grade" : "A", "score" : 10 }, { "date" : { "$date" : 1322006400000 }, "grade" : "A", "score" : 9 }, { "date" : { "$date" : 1299715200000 }, "grade" : "B", "score" : 14 }], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51d" }, "address" : { "building" : "469", "coord" : [-73.961704, 40.662942], "street" : "Flatbush Avenue", "zipcode" : "11225" }, "borough" : "Brooklyn", "cuisine" : "Hamburgers", "grades" : [{ "date" : { "$date" : 1419897600000 }, "grade" : "A", "score" : 8 }, { "date" : { "$date" : 1404172800000 }, "grade" : "B", "score" : 23 }, { "date" : { "$date" : 1367280000000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1336435200000 }, "grade" : "A", "score" : 12 }], "name" : "Wendy'S", "restaurant_id" : "30112340" }
|
||||
{ "_id" : { "$oid" : "58ada47de5a51ddfcd5ed51e" }, "address" : { "building" : "351", "coord" : [-73.98513559999999, 40.7676919], "street" : "West 57 Street", "zipcode" : "10019" }, "borough" : "Manhattan", "cuisine" : "Irish", "grades" : [{ "date" : { "$date" : 1409961600000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1374451200000 }, "grade" : "A", "score" : 11 }, { "date" : { "$date" : 1343692800000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1325116800000 }, "grade" : "A", "score" : 12 }], "name" : "Dj Reynolds Pub And Restaurant", "restaurant_id" : "30191841" }
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test catfunc
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants CATFUNC=columns
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8 ;
|
||||
SELECT * from t1;
|
||||
Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Nullable Bpath
|
||||
_id 1 CHAR 24 24 0 0
|
||||
address_building 1 CHAR 10 10 0 0 address.building
|
||||
address_coord 1 CHAR 39 39 0 0 address.coord
|
||||
address_street 1 CHAR 38 38 0 0 address.street
|
||||
address_zipcode 1 CHAR 5 5 0 0 address.zipcode
|
||||
borough 1 CHAR 13 13 0 0
|
||||
cuisine 1 CHAR 64 64 0 0
|
||||
grades_0 1 CHAR 84 84 0 1 grades.0
|
||||
name 1 CHAR 98 98 0 0
|
||||
restaurant_id 1 CHAR 8 8 0 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Explicit columns
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
cuisine VARCHAR(255) NOT NULL,
|
||||
borough VARCHAR(255) NOT NULL,
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
CONNECTION='mongodb://localhost:27017' LRECL=1024 DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3';
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id name cuisine borough restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c Morris Park Bake Shop Bakery Bronx 30075445
|
||||
58ada47de5a51ddfcd5ed51d Wendy'S Hamburgers Brooklyn 30112340
|
||||
58ada47de5a51ddfcd5ed51e Dj Reynolds Pub And Restaurant Irish Manhattan 30191841
|
||||
58ada47de5a51ddfcd5ed51f Riviera Caterer American Brooklyn 40356018
|
||||
58ada47de5a51ddfcd5ed520 Tov Kosher Kitchen Jewish/Kosher Queens 40356068
|
||||
58ada47de5a51ddfcd5ed521 Brunos On The Boulevard American Queens 40356151
|
||||
58ada47de5a51ddfcd5ed522 Kosher Island Jewish/Kosher Staten Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 Wilken'S Fine Food Delicatessen Brooklyn 40356483
|
||||
58ada47de5a51ddfcd5ed524 Regina Caterers American Brooklyn 40356649
|
||||
58ada47de5a51ddfcd5ed525 Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test discovery
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
OPTION_LIST='Level=1,Driver=Java,Version=3' DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord` char(39) NOT NULL `FIELD_FORMAT`='address.coord',
|
||||
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`cuisine` char(64) NOT NULL,
|
||||
`grades_0` char(84) DEFAULT NULL `FIELD_FORMAT`='grades.0',
|
||||
`name` char(98) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Level=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8'
|
||||
SELECT * FROM t1 LIMIT 5;
|
||||
_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c 1007 [-73.856077, 40.848447] Morris Park Ave 10462 Bronx Bakery { "date" : { "$date" : 1393804800000 }, "grade" : "A", "score" : 2 } Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d 469 [-73.961704, 40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers { "date" : { "$date" : 1419897600000 }, "grade" : "A", "score" : 8 } Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e 351 [-73.98513559999999, 40.7676919] West 57 Street 10019 Manhattan Irish { "date" : { "$date" : 1409961600000 }, "grade" : "A", "score" : 2 } Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f 2780 [-73.98241999999999, 40.579505] Stillwell Avenue 11224 Brooklyn American { "date" : { "$date" : 1402358400000 }, "grade" : "A", "score" : 5 } Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 97-22 [-73.8601152, 40.7311739] 63 Road 11374 Queens Jewish/Kosher { "date" : { "$date" : 1416787200000 }, "grade" : "Z", "score" : 20 } Tov Kosher Kitchen 40356068
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Dropping a column
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
COLIST='{"grades":0}' OPTION_LIST='Driver=Java,Version=3,level=0' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
_id address borough cuisine name restaurant_id
|
||||
58ada47de5a51ddfcd5ed51c { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" } Bronx Bakery Morris Park Bake Shop 30075445
|
||||
58ada47de5a51ddfcd5ed51d { "building" : "469", "coord" : [-73.961704, 40.662942], "street" : "Flatbush Avenue", "zipcode" : "11225" } Brooklyn Hamburgers Wendy'S 30112340
|
||||
58ada47de5a51ddfcd5ed51e { "building" : "351", "coord" : [-73.98513559999999, 40.7676919], "street" : "West 57 Street", "zipcode" : "10019" } Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
|
||||
58ada47de5a51ddfcd5ed51f { "building" : "2780", "coord" : [-73.98241999999999, 40.579505], "street" : "Stillwell Avenue", "zipcode" : "11224" } Brooklyn American Riviera Caterer 40356018
|
||||
58ada47de5a51ddfcd5ed520 { "building" : "97-22", "coord" : [-73.8601152, 40.7311739], "street" : "63 Road", "zipcode" : "11374" } Queens Jewish/Kosher Tov Kosher Kitchen 40356068
|
||||
58ada47de5a51ddfcd5ed521 { "building" : "8825", "coord" : [-73.8803827, 40.7643124], "street" : "Astoria Boulevard", "zipcode" : "11369" } Queens American Brunos On The Boulevard 40356151
|
||||
58ada47de5a51ddfcd5ed522 { "building" : "2206", "coord" : [-74.1377286, 40.6119572], "street" : "Victory Boulevard", "zipcode" : "10314" } Staten Island Jewish/Kosher Kosher Island 40356442
|
||||
58ada47de5a51ddfcd5ed523 { "building" : "7114", "coord" : [-73.9068506, 40.6199034], "street" : "Avenue U", "zipcode" : "11234" } Brooklyn Delicatessen Wilken'S Fine Food 40356483
|
||||
58ada47de5a51ddfcd5ed524 { "building" : "6409", "coord" : [-74.00528899999999, 40.628886], "street" : "11 Avenue", "zipcode" : "11219" } Brooklyn American Regina Caterers 40356649
|
||||
58ada47de5a51ddfcd5ed525 { "building" : "1839", "coord" : [-73.9482609, 40.6408271], "street" : "Nostrand Avenue", "zipcode" : "11226" } Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Jpath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id VARCHAR(24) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
cuisine CHAR(200) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
street VARCHAR(65) FIELD_FORMAT='address.street',
|
||||
building CHAR(16) FIELD_FORMAT='address.building',
|
||||
zipcode CHAR(5) FIELD_FORMAT='address.zipcode',
|
||||
grade CHAR(1) FIELD_FORMAT='grades.0.grade',
|
||||
score INT(4) NOT NULL FIELD_FORMAT='grades.0.score',
|
||||
`date` DATE FIELD_FORMAT='grades.0.date',
|
||||
restaurant_id VARCHAR(255) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3' ;
|
||||
SELECT * FROM t1 LIMIT 1;
|
||||
_id 58ada47de5a51ddfcd5ed51c
|
||||
name Morris Park Bake Shop
|
||||
cuisine Bakery
|
||||
borough Bronx
|
||||
street Morris Park Ave
|
||||
building 1007
|
||||
zipcode 10462
|
||||
grade A
|
||||
score 2
|
||||
date 2014-03-03
|
||||
restaurant_id 30075445
|
||||
SELECT name, street, score, date FROM t1 LIMIT 5;
|
||||
name street score date
|
||||
Morris Park Bake Shop Morris Park Ave 2 2014-03-03
|
||||
Wendy'S Flatbush Avenue 8 2014-12-30
|
||||
Dj Reynolds Pub And Restaurant West 57 Street 2 2014-09-06
|
||||
Riviera Caterer Stillwell Avenue 5 2014-06-10
|
||||
Tov Kosher Kitchen 63 Road 20 2014-11-24
|
||||
SELECT name, cuisine, borough FROM t1 WHERE grade = 'A' LIMIT 10;
|
||||
name cuisine borough
|
||||
Morris Park Bake Shop Bakery Bronx
|
||||
Wendy'S Hamburgers Brooklyn
|
||||
Dj Reynolds Pub And Restaurant Irish Manhattan
|
||||
Riviera Caterer American Brooklyn
|
||||
Kosher Island Jewish/Kosher Staten Island
|
||||
Wilken'S Fine Food Delicatessen Brooklyn
|
||||
Regina Caterers American Brooklyn
|
||||
Taste The Tropics Ice Cream Ice Cream, Gelato, Yogurt, Ices Brooklyn
|
||||
Wild Asia American Bronx
|
||||
C & C Catering Service American Brooklyn
|
||||
SELECT COUNT(*) FROM t1 WHERE grade = 'A';
|
||||
COUNT(*)
|
||||
20687
|
||||
SELECT * FROM t1 WHERE cuisine = 'English';
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
58ada47de5a51ddfcd5ed83d Tea And Sympathy English Manhattan Greenwich Avenue 108 10011 A 8 2014-10-23 40391531
|
||||
58ada47de5a51ddfcd5ed85c Tartine English Manhattan West 11 Street 253 10014 A 11 2014-08-14 40392496
|
||||
58ada47de5a51ddfcd5ee1f3 The Park Slope Chipshop English Brooklyn 5 Avenue 383 11215 B 17 2014-09-29 40816202
|
||||
58ada47de5a51ddfcd5ee7e4 Pound And Pence English Manhattan Liberty Street 55 10005 A 7 2014-02-11 41022701
|
||||
58ada47de5a51ddfcd5ee999 Chip Shop English Brooklyn Atlantic Avenue 129 11201 A 9 2014-10-08 41076583
|
||||
58ada47ee5a51ddfcd5efe3f The Breslin Bar & Dining Room English Manhattan West 29 Street 16 10001 A 13 2014-06-09 41443706
|
||||
58ada47ee5a51ddfcd5efe99 Highlands Restaurant English Manhattan West 10 Street 150 10014 A 12 2014-10-22 41448559
|
||||
58ada47ee5a51ddfcd5f0413 The Fat Radish English Manhattan Orchard Street 17 10002 A 12 2014-07-26 41513545
|
||||
58ada47ee5a51ddfcd5f0777 Jones Wood Foundry English Manhattan East 76 Street 401 10021 A 12 2014-12-03 41557377
|
||||
58ada47ee5a51ddfcd5f0ea2 Whitehall English Manhattan Greenwich Avenue 19 10014 Z 15 2015-01-16 41625263
|
||||
58ada47ee5a51ddfcd5f1004 The Churchill Tavern English Manhattan East 28 Street 45 10016 A 13 2014-08-27 41633327
|
||||
58ada47ee5a51ddfcd5f13d5 The Monro English Brooklyn 5 Avenue 481 11215 A 7 2014-06-03 41660253
|
||||
58ada47ee5a51ddfcd5f1454 The Cock & Bull English Manhattan West 45 Street 23 10036 A 7 2014-08-07 41664704
|
||||
58ada47ee5a51ddfcd5f176e Dear Bushwick English Brooklyn Wilson Avenue 41 11237 A 12 2014-12-27 41690534
|
||||
58ada47ee5a51ddfcd5f1e91 Snowdonia Pub English Queens 32 Street 34-55 11106 A 12 2014-10-28 50000290
|
||||
58ada47ee5a51ddfcd5f2ddc Oscar'S Place English Manhattan Hudson Street 466 10014 A 10 2014-08-18 50011097
|
||||
SELECT * FROM t1 WHERE score = building;
|
||||
_id name cuisine borough street building zipcode grade score date restaurant_id
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Specifying Filter
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id CHAR(24) NOT NULL,
|
||||
name CHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
restaurant_id CHAR(8) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET=utf8
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
OPTION_LIST='Driver=Java,Version=3' ;
|
||||
SELECT name FROM t1 WHERE borough = 'Queens';
|
||||
name
|
||||
La Baraka Restaurant
|
||||
Air France Lounge
|
||||
Tournesol
|
||||
Winegasm
|
||||
Cafe Henri
|
||||
Bistro 33
|
||||
Domaine Wine Bar
|
||||
Cafe Triskell
|
||||
Cannelle Patisserie
|
||||
La Vie
|
||||
Dirty Pierres Bistro
|
||||
Fresca La Crepe
|
||||
Bliss 46 Bistro
|
||||
Bear
|
||||
Cuisine By Claudette
|
||||
Paris Baguette
|
||||
The Baroness Bar
|
||||
Francis Cafe
|
||||
Madame Sou Sou
|
||||
Crepe 'N' Tearia
|
||||
Aperitif Bayside Llc
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing pipeline
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
name VARCHAR(64) NOT NULL,
|
||||
borough CHAR(16) NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
grade CHAR(1) NOT NULL,
|
||||
score INT(4) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='restaurants' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=1' ;
|
||||
SELECT * FROM t1 LIMIT 10;
|
||||
name borough date grade score
|
||||
Tout Va Bien Manhattan 2014-11-10 01:00:00 B 15
|
||||
Tout Va Bien Manhattan 2014-04-03 02:00:00 A 13
|
||||
Tout Va Bien Manhattan 2013-07-17 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2013-02-06 01:00:00 B 22
|
||||
Tout Va Bien Manhattan 2012-07-16 02:00:00 C 36
|
||||
Tout Va Bien Manhattan 2012-03-08 01:00:00 C 7
|
||||
La Grenouille Manhattan 2014-04-09 02:00:00 A 10
|
||||
La Grenouille Manhattan 2013-03-05 01:00:00 A 9
|
||||
La Grenouille Manhattan 2012-02-02 01:00:00 A 13
|
||||
Le Perigord Manhattan 2014-07-14 02:00:00 B 14
|
||||
SELECT name, grade, score, date FROM t1 WHERE borough = 'Bronx';
|
||||
name grade score date
|
||||
Bistro Sk A 10 2014-11-21 01:00:00
|
||||
Bistro Sk A 12 2014-02-19 01:00:00
|
||||
Bistro Sk B 18 2013-06-12 02:00:00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try level 2 discovery
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
|
||||
FILTER='{"cuisine":"French","borough":{"$ne":"Manhattan"}}'
|
||||
COLIST='{"cuisine":0}'
|
||||
OPTION_LIST='Driver=Java,level=2,version=3';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`_id` char(24) NOT NULL,
|
||||
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
|
||||
`address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0',
|
||||
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
|
||||
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
|
||||
`borough` char(13) NOT NULL,
|
||||
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
|
||||
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
|
||||
`grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score',
|
||||
`name` char(32) NOT NULL,
|
||||
`restaurant_id` char(8) NOT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3'
|
||||
SELECT name, borough, address_street, grades_0_score AS score FROM t1 WHERE grades_0_grade = 'B';
|
||||
name borough address_street score
|
||||
Le Gamin Brooklyn Vanderbilt Avenue 24
|
||||
Bistro 33 Queens Ditmars Boulevard 15
|
||||
Dirty Pierres Bistro Queens Station Square 22
|
||||
Santos Anne Brooklyn Union Avenue 26
|
||||
Le Paddock Brooklyn Prospect Avenue 17
|
||||
La Crepe Et La Vie Brooklyn Foster Avenue 24
|
||||
Francis Cafe Queens Ditmars Boulevard 19
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# try CRUD operations
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64))
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
OPTION_LIST='Driver=Java,Version=3' ;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(0,NULL),(1,'One'),(2,'Two'),(3,'Three');
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
0 NULL
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
UPDATE t1 SET msg = 'Deux' WHERE _id = 2;
|
||||
DELETE FROM t1 WHERE msg IS NULL;
|
||||
SELECT * FROM t1;
|
||||
_id msg
|
||||
1 One
|
||||
2 Deux
|
||||
3 Three
|
||||
DELETE FROM t1;
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# List states whose population is equal or more than 10 millions
|
||||
#
|
||||
false
|
||||
CREATE TABLE t1 (
|
||||
_id char(5) NOT NULL,
|
||||
city char(16) NOT NULL,
|
||||
loc_0 double(12,6) NOT NULL `FIELD_FORMAT`='loc.0',
|
||||
loc_1 char(12) NOT NULL `FIELD_FORMAT`='loc.1',
|
||||
pop int(11) NOT NULL,
|
||||
state char(2) NOT NULL)
|
||||
ENGINE=CONNECT CONNECTION='mongodb://localhost:27017' TABLE_TYPE='MONGO' TABNAME='cities'
|
||||
OPTION_LIST='Driver=Java,Version=3' DATA_CHARSET='utf8';
|
||||
# Using SQL for grouping
|
||||
SELECT state, sum(pop) AS totalPop FROM t1 GROUP BY state HAVING totalPop >= 10000000 ORDER BY totalPop DESC;
|
||||
state totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
# Using a pipeline for grouping
|
||||
CREATE TABLE t1 (_id CHAR(2) NOT NULL, totalPop INT(11) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='cities' DATA_CHARSET=utf8
|
||||
COLIST='{"pipeline":[{"$group":{"_id":"$state","totalPop":{"$sum":"$pop"}}},{"$match":{"totalPop":{"$gte":10000000}}},{"$sort":{"totalPop":-1}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=1' ;
|
||||
SELECT * FROM t1;
|
||||
_id totalPop
|
||||
CA 29754890
|
||||
NY 17990402
|
||||
TX 16984601
|
||||
FL 12686644
|
||||
PA 11881643
|
||||
IL 11427576
|
||||
OH 10846517
|
||||
DROP TABLE t1;
|
||||
true
|
||||
#
|
||||
# Test making array
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id int(4) NOT NULL,
|
||||
item CHAR(8) NOT NULL,
|
||||
prices_0 INT(6) FIELD_FORMAT='prices.0',
|
||||
prices_1 INT(6) FIELD_FORMAT='prices.1',
|
||||
prices_2 INT(6) FIELD_FORMAT='prices.2',
|
||||
prices_3 INT(6) FIELD_FORMAT='prices.3',
|
||||
prices_4 INT(6) FIELD_FORMAT='prices.4')
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll' DATA_CHARSET=utf8
|
||||
OPTION_LIST='Driver=Java,Version=3' ;
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'journal',87,45,63,12,78),
|
||||
(2,'notebook',123,456,789,NULL,NULL),
|
||||
(3,'paper',5,7,3,8,NULL),
|
||||
(4,'planner',25,71,NULL,44,27),
|
||||
(5,'postcard',5,7,3,8,NULL);
|
||||
SELECT * FROM t1;
|
||||
_id item prices_0 prices_1 prices_2 prices_3 prices_4
|
||||
1 journal 87 45 63 12 78
|
||||
2 notebook 123 456 789 NULL NULL
|
||||
3 paper 5 7 3 8 NULL
|
||||
4 planner 25 71 NULL 44 27
|
||||
5 postcard 5 7 3 8 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test array aggregation
|
||||
#
|
||||
CREATE TABLE t1
|
||||
ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME='testcoll'
|
||||
COLIST='{"pipeline":[{"$project":{"_id":0,"item":1,"total":{"$sum":"$prices"},"average":{"$avg":"$prices"}}}]}'
|
||||
OPTION_LIST='Driver=Java,Version=3,Pipeline=YES' ;
|
||||
SELECT * FROM t1;
|
||||
item total average
|
||||
journal 285 57.00
|
||||
notebook 1368 456.00
|
||||
paper 23 5.75
|
||||
planner 167 41.75
|
||||
postcard 23 5.75
|
||||
DROP TABLE t1;
|
||||
true
|
||||
set connect_enable_mongo=0;
|
||||
136
storage/connect/mysql-test/connect/r/mul_new.result
Normal file
136
storage/connect/mysql-test/connect/r/mul_new.result
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
#
|
||||
# Testing multiple 1
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num1.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t1 VALUES(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six');
|
||||
SELECT * FROM t1;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
CREATE TABLE t2 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num2.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t2 VALUES(7,'Seven'),(8,'Eight'),(9,'Nine'),(10,'Ten'),(11,'Eleven'),(12,'Twelve');
|
||||
SELECT * FROM t2;
|
||||
Chiffre Lettre
|
||||
7 Seven
|
||||
8 Eight
|
||||
9 Nine
|
||||
10 Ten
|
||||
11 Eleven
|
||||
12 Twelve
|
||||
CREATE TABLE t3 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num3.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t3 VALUES(13,'Thirteen'),(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen'),(18,'Eighteen');
|
||||
SELECT * FROM t3;
|
||||
Chiffre Lettre
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
CREATE TABLE t4 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num4.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t4 VALUES(19,'Nineteen'),(20,'Twenty'),(21,'Twenty one'),(22,'Twenty two'),(23,'Tenty three'),(24,'Twenty four');
|
||||
SELECT * FROM t4;
|
||||
Chiffre Lettre
|
||||
19 Nineteen
|
||||
20 Twenty
|
||||
21 Twenty one
|
||||
22 Twenty two
|
||||
23 Tenty three
|
||||
24 Twenty four
|
||||
CREATE TABLE t5 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num5.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t5 VALUES(25,'Twenty five'),(26,'Twenty six'),(27,'Twenty seven'),(28,'Twenty eight'),(29,'Tenty eight'),(30,'Thirty');
|
||||
SELECT * FROM t5;
|
||||
Chiffre Lettre
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
CREATE TABLE t_all (
|
||||
Chiffre int(3) not null,
|
||||
Lettre char(16) not null)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num?.csv' HEADER=1 LRECL=20 MULTIPLE=1;
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
#
|
||||
# Testing multiple 3
|
||||
#
|
||||
ALTER TABLE t_all MULTIPLE=3;
|
||||
Warnings:
|
||||
Warning 1105 This is an outward table, table data were not modified.
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
7 Seven
|
||||
8 Eight
|
||||
9 Nine
|
||||
10 Ten
|
||||
11 Eleven
|
||||
12 Twelve
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
19 Nineteen
|
||||
20 Twenty
|
||||
21 Twenty one
|
||||
22 Twenty two
|
||||
23 Tenty three
|
||||
24 Twenty four
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
DROP TABLE t4;
|
||||
DROP TABLE t5;
|
||||
DROP TABLE t_all;
|
||||
|
|
@ -17,7 +17,7 @@ ERROR HY000: (1049) Unknown database 'unknown'
|
|||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL OPTION_LIST='host=localhost,user=root,port=PORT' DBNAME='unknown' TABNAME='t1';
|
||||
ERROR HY000: (1049) Unknown database 'unknown'
|
||||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='unknown' OPTION_LIST='host=localhost,user=root,port=PORT';
|
||||
ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM unknown FROM test]
|
||||
ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM `unknown` FROM test]
|
||||
SHOW CREATE TABLE t2;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
CREATE TABLE t2 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=PORT';
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ SELECT * FROM t1 WHERE command IN ('Warning','Note',
|
|||
"insert into t1(msg) values('One'),(NULL),('Three')",
|
||||
"insert into t1 values(2,'Deux') on duplicate key update msg = 'Two'",
|
||||
"insert into t1(message) values('Four'),('Five'),('Six')",
|
||||
'insert into t1(id) values(NULL)',
|
||||
'insert ignore into t1(id) values(NULL)',
|
||||
"update t1 set msg = 'Four' where id = 4",
|
||||
'select * from t1');
|
||||
command warnings number message
|
||||
|
|
@ -26,7 +26,7 @@ insert into t1(msg) values('One'),(NULL),('Three') 1 3 Affected rows
|
|||
Warning 0 1048 Column 'msg' cannot be null
|
||||
insert into t1 values(2,'Deux') on duplicate key update msg = 'Two' 0 2 Affected rows
|
||||
insert into t1(message) values('Four'),('Five'),('Six') 0 1054 Remote: Unknown column 'message' in 'field list'
|
||||
insert into t1(id) values(NULL) 1 1 Affected rows
|
||||
insert ignore into t1(id) values(NULL) 1 1 Affected rows
|
||||
Warning 0 1364 Field 'msg' doesn't have a default value
|
||||
update t1 set msg = 'Four' where id = 4 0 1 Affected rows
|
||||
select * from t1 0 2 Result set columns
|
||||
|
|
@ -39,9 +39,9 @@ Note 1305 PROCEDURE test.p1 does not exist
|
|||
CREATE PROCEDURE p1(cmd varchar(512))
|
||||
READS SQL DATA
|
||||
SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd);
|
||||
CALL p1('insert into t1(id) values(NULL)');
|
||||
CALL p1('insert ignore into t1(id) values(NULL)');
|
||||
command warnings number message
|
||||
insert into t1(id) values(NULL) 1 1 Affected rows
|
||||
insert ignore into t1(id) values(NULL) 1 1 Affected rows
|
||||
Warning 0 1364 Field 'msg' doesn't have a default value
|
||||
CALL p1('update t1 set msg = "Five" where id = 5');
|
||||
command warnings number message
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ OPTION_LIST='host=127.0.0.1,user=root,port=SLAVE_PORT' DBNAME='unknown' TABNAME=
|
|||
ERROR HY000: (1049) Unknown database 'unknown'
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/unknown';
|
||||
ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM unknown FROM test]
|
||||
ERROR HY000: (1146) Table 'test.unknown' doesn't exist [SHOW FULL COLUMNS FROM `unknown` FROM test]
|
||||
SHOW CREATE TABLE t1;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
|
|
@ -188,7 +188,7 @@ t1 CREATE TABLE `t1` (
|
|||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`e` year(4) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'a' at row 1
|
||||
Note 1265 Data truncated for column 'c' at row 1
|
||||
|
|
|
|||
|
|
@ -141,22 +141,3 @@ DROP TABLE t1;
|
|||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
DROP TABLE t4;
|
||||
#
|
||||
# Checking thread TBL tables
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v';
|
||||
SELECT * FROM t1;
|
||||
v
|
||||
11
|
||||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v';
|
||||
SELECT * FROM t2;
|
||||
v
|
||||
22
|
||||
CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';;
|
||||
SELECT * FROM total order by v desc;
|
||||
v
|
||||
22
|
||||
11
|
||||
DROP TABLE total;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
|
|
|||
152
storage/connect/mysql-test/connect/r/tbl_thread.result
Normal file
152
storage/connect/mysql-test/connect/r/tbl_thread.result
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
CREATE DATABASE connect;
|
||||
CREATE DATABASE connect;
|
||||
#
|
||||
# Checking thread TBL tables
|
||||
#
|
||||
CREATE TABLE t1 (a int, b char(10));
|
||||
INSERT INTO t1 VALUES (0,'test00'),(1,'test01'),(2,'test02'),(3,'test03');
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
0 test00
|
||||
1 test01
|
||||
2 test02
|
||||
3 test03
|
||||
CREATE TABLE rt2 (a int, b char(10));
|
||||
INSERT INTO rt2 VALUES (4,'test04'),(5,'test05'),(6,'test06'),(7,'test07');
|
||||
SELECT * FROM rt2;
|
||||
a b
|
||||
4 test04
|
||||
5 test05
|
||||
6 test06
|
||||
7 test07
|
||||
USE test;
|
||||
CREATE TABLE rt3 (a int, b char(10));
|
||||
INSERT INTO rt3 VALUES (8,'test08'),(9,'test09'),(10,'test10'),(11,'test11');
|
||||
SELECT * FROM rt3;
|
||||
a b
|
||||
8 test08
|
||||
9 test09
|
||||
10 test10
|
||||
11 test11
|
||||
CREATE TABLE rt4 (a int, b char(10));
|
||||
INSERT INTO rt4 VALUES (12,'test12'),(13,'test13'),(14,'test14'),(15,'test15');
|
||||
SELECT * FROM rt4;
|
||||
a b
|
||||
12 test12
|
||||
13 test13
|
||||
14 test14
|
||||
15 test15
|
||||
CREATE TABLE rt5 (a int, b char(10));
|
||||
INSERT INTO rt5 VALUES (16,'test16'),(17,'test17'),(18,'test18'),(19,'test19');
|
||||
SELECT * FROM rt5;
|
||||
a b
|
||||
16 test16
|
||||
17 test17
|
||||
18 test18
|
||||
19 test19
|
||||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:MASTER_PORT/test/rt2';
|
||||
SELECT * FROM t2;
|
||||
a b
|
||||
4 test04
|
||||
5 test05
|
||||
6 test06
|
||||
7 test07
|
||||
CREATE TABLE t3 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/rt3';
|
||||
SELECT * FROM t3;
|
||||
a b
|
||||
8 test08
|
||||
9 test09
|
||||
10 test10
|
||||
11 test11
|
||||
CREATE TABLE t4 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/rt4';
|
||||
SELECT * FROM t4;
|
||||
a b
|
||||
12 test12
|
||||
13 test13
|
||||
14 test14
|
||||
15 test15
|
||||
CREATE TABLE t5 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/rt5';
|
||||
SELECT * FROM t5;
|
||||
a b
|
||||
16 test16
|
||||
17 test17
|
||||
18 test18
|
||||
19 test19
|
||||
CREATE TABLE total (a int, b char(10))
|
||||
ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3,t4,t5'
|
||||
OPTION_LIST='thread=yes,port=PORT';
|
||||
set connect_xtrace=1;
|
||||
SELECT * FROM total order by a desc;
|
||||
a b
|
||||
19 test19
|
||||
18 test18
|
||||
17 test17
|
||||
16 test16
|
||||
15 test15
|
||||
14 test14
|
||||
13 test13
|
||||
12 test12
|
||||
11 test11
|
||||
10 test10
|
||||
9 test09
|
||||
8 test08
|
||||
7 test07
|
||||
6 test06
|
||||
5 test05
|
||||
4 test04
|
||||
3 test03
|
||||
2 test02
|
||||
1 test01
|
||||
0 test00
|
||||
set connect_xtrace=0;
|
||||
DROP TABLE rt2;
|
||||
DROP TABLE rt3,rt4,rt5;
|
||||
DROP TABLE t1,t2,t3,t4,t5,total;
|
||||
#
|
||||
# Old thread TBL tables test modified
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v' OPTION_LIST='port=MASTER_PORT';
|
||||
SELECT * FROM t1;
|
||||
v
|
||||
11
|
||||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v' OPTION_LIST='port=SLAVE_PORT';
|
||||
SELECT * FROM t2;
|
||||
v
|
||||
22
|
||||
CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';;
|
||||
set connect_xtrace=1;
|
||||
SELECT * FROM total order by v desc;
|
||||
v
|
||||
22
|
||||
11
|
||||
set connect_xtrace=0;
|
||||
DROP TABLE t1,t2,total;
|
||||
#
|
||||
# Old thread TBL tables test not modified (suppressed until MDEV-10179 is fixed)
|
||||
#
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 11 as v';
|
||||
SELECT * FROM t1;
|
||||
v
|
||||
11
|
||||
CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL SRCDEF='select 22 as v';
|
||||
SELECT * FROM t2;
|
||||
v
|
||||
22
|
||||
CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';;
|
||||
set connect_xtrace=1;
|
||||
SELECT * FROM total order by v desc;
|
||||
v
|
||||
22
|
||||
11
|
||||
set connect_xtrace=0;
|
||||
DROP TABLE total;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
|
|
@ -27,13 +27,13 @@ UPDATE t1 SET e = d;
|
|||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
255 65535 4294967295 18446744073709551615 18446744073709551615
|
||||
UPDATE t1 SET c = d;
|
||||
UPDATE IGNORE t1 SET c = d;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'c' at row 1
|
||||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
255 65535 4294967295 18446744073709551615 18446744073709551615
|
||||
UPDATE t1 SET c = e;
|
||||
UPDATE IGNORE t1 SET c = e;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'c' at row 1
|
||||
SELECT * FROM t1;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||
CREATE TABLE employee
|
||||
(
|
||||
serialno CHAR(5) NOT NULL,
|
||||
|
|
@ -1625,3 +1626,4 @@ serialno name sex title manager department secretary salary
|
|||
#
|
||||
DROP PROCEDURE test.tst_up;
|
||||
DROP TABLE employee;
|
||||
SET sql_mode = DEFAULT;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing tag values
|
||||
|
|
@ -12,7 +10,7 @@ TRANSLATOR CHAR(40),
|
|||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
AUTHOR Jean-Christophe Bernadac
|
||||
TITLE Construire une application XML
|
||||
|
|
@ -36,7 +34,7 @@ TRANSLATOR CHAR(40),
|
|||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
author NULL
|
||||
TITLE Construire une application XML
|
||||
|
|
@ -57,7 +55,7 @@ ISBN CHAR(15),
|
|||
LANG CHAR(2),
|
||||
SUBJECT CHAR(32)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='Coltype=@,xmlsup=libxml2';
|
||||
OPTION_LIST='Coltype=@,xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
|
|
@ -74,7 +72,7 @@ isbn CHAR(15),
|
|||
LANG CHAR(2),
|
||||
SUBJECT CHAR(32)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='Coltype=@,xmlsup=libxml2';
|
||||
OPTION_LIST='Coltype=@,xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
isbn NULL
|
||||
LANG fr
|
||||
|
|
@ -97,7 +95,7 @@ PUBLISHER CHAR(40),
|
|||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
|
|
@ -130,7 +128,7 @@ PUBLISHER CHAR(40),
|
|||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml'
|
||||
TABNAME='BIBLIO'
|
||||
OPTION_LIST='rownode=BOOK,xmlsup=libxml2';
|
||||
OPTION_LIST='rownode=BOOK,xmlsup=domdoc';
|
||||
INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB)
|
||||
VALUES('9782212090529','fr','général','Alain Michard',
|
||||
'XML, Langage et Applications','Eyrolles Paris',1998);
|
||||
|
|
@ -160,47 +158,47 @@ TRANSLATOR NULL
|
|||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1998
|
||||
SELECT LOAD_FILE('MYSQLD_DATADIR/test/xsample2.xml') AS xml;
|
||||
xml <?xml version="1.0" encoding="UTF-8"?>
|
||||
<BIBLIO SUBJECT="XML">
|
||||
<BOOK ISBN="9782212090819" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>Jean-Christophe</FIRSTNAME>
|
||||
<LASTNAME>Bernadac</LASTNAME>
|
||||
</AUTHOR>
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>François</FIRSTNAME>
|
||||
<LASTNAME>Knab</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TITLE>Construire une application XML</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Eyrolles</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782840825685" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>William J.</FIRSTNAME>
|
||||
<LASTNAME>Pardi</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TRANSLATOR PREFIX="adapté de l'anglais par">
|
||||
<FIRSTNAME>James</FIRSTNAME>
|
||||
<LASTNAME>Guerin</LASTNAME>
|
||||
</TRANSLATOR>
|
||||
<TITLE>XML en Action</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Microsoft Press</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782212090529" LANG="fr" SUBJECT="général">
|
||||
<AUTHOR>Alain Michard</AUTHOR>
|
||||
<TITLE>XML, Langage et Applications</TITLE>
|
||||
<PUBLISHER>Eyrolles Paris</PUBLISHER>
|
||||
<DATEPUB>1998</DATEPUB>
|
||||
</BOOK>
|
||||
</BIBLIO>
|
||||
xml <?xml version="1.0" encoding="UTF-8"?>
|
||||
<BIBLIO SUBJECT="XML">
|
||||
<BOOK ISBN="9782212090819" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>Jean-Christophe</FIRSTNAME>
|
||||
<LASTNAME>Bernadac</LASTNAME>
|
||||
</AUTHOR>
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>François</FIRSTNAME>
|
||||
<LASTNAME>Knab</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TITLE>Construire une application XML</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Eyrolles</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782840825685" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>William J.</FIRSTNAME>
|
||||
<LASTNAME>Pardi</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TRANSLATOR PREFIX="adapté de l'anglais par">
|
||||
<FIRSTNAME>James</FIRSTNAME>
|
||||
<LASTNAME>Guerin</LASTNAME>
|
||||
</TRANSLATOR>
|
||||
<TITLE>XML en Action</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Microsoft Press</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782212090529" LANG="fr" SUBJECT="général">
|
||||
<AUTHOR>Alain Michard</AUTHOR>
|
||||
<TITLE>XML, Langage et Applications</TITLE>
|
||||
<PUBLISHER>Eyrolles Paris</PUBLISHER>
|
||||
<DATEPUB>1998</DATEPUB>
|
||||
</BOOK>
|
||||
</BIBLIO>
|
||||
|
||||
DROP TABLE t1;
|
||||
#
|
||||
|
|
@ -220,7 +218,7 @@ publisher CHAR(20) FIELD_FORMAT='PUBLISHER/NAME',
|
|||
location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE',
|
||||
year INT(4) FIELD_FORMAT='DATEPUB'
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2';
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
isbn 9782212090819
|
||||
language fr
|
||||
|
|
@ -262,7 +260,7 @@ CREATE TABLE t1
|
|||
(
|
||||
isbn CHAR(15) FIELD_FORMAT='@isbn'
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2';
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=domdoc';
|
||||
SELECT * FROM t1;
|
||||
isbn NULL
|
||||
isbn NULL
|
||||
|
|
@ -274,20 +272,20 @@ CREATE TABLE t1
|
|||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2'
|
||||
OPTION_LIST='xmlsup=domdoc'
|
||||
DATA_CHARSET=latin1;
|
||||
ERROR HY000: DATA_CHARSET='latin1' is not supported for TABLE_TYPE=XML
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2'
|
||||
OPTION_LIST='xmlsup=domdoc'
|
||||
DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table t1
|
||||
Create Table CREATE TABLE `t1` (
|
||||
`c` char(16) DEFAULT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=libxml2' `DATA_CHARSET`=utf8
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=domdoc' `DATA_CHARSET`=utf8
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
|
|
@ -296,7 +294,7 @@ CREATE TABLE t1
|
|||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
|
|
@ -305,7 +303,7 @@ CREATE TABLE t1
|
|||
(
|
||||
c CHAR(16) CHARACTER SET utf8
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C381C382C383C384C385C386C387
|
||||
|
|
@ -318,7 +316,7 @@ CREATE TABLE t1
|
|||
(
|
||||
c CHAR(16) CHARACTER SET cp1251
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ???????
|
||||
HEX(c) 3F3F3F3F3F3F3F
|
||||
|
|
@ -333,44 +331,13 @@ DROP TABLE t1;
|
|||
#
|
||||
# Testing Cyrillic
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET utf8
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=b';
|
||||
SELECT * FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
INSERT INTO t1 VALUES ('ИКЛМН');
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
HEX(c) D091D092D093D094D095D096D097
|
||||
c ИКЛМН
|
||||
HEX(c) D098D09AD09BD09CD09D
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET cp1251
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=b';
|
||||
SELECT * FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
c ИКЛМН
|
||||
INSERT INTO t1 VALUES ('ОПРСТ');
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
c ИКЛМН
|
||||
HEX(c) C8CACBCCCD
|
||||
c ОПРСТ
|
||||
HEX(c) CECFD0D1D2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing that the underlying file is created with a proper Encoding
|
||||
#
|
||||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET latin1
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8';
|
||||
OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=utf-8';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
|
|
@ -384,7 +351,7 @@ HEX(EXTRACTVALUE(@a,'/t1/line/node')) C380C381C382C383
|
|||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET latin1
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1';
|
||||
OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
|
|
@ -401,31 +368,26 @@ HEX(EXTRACTVALUE(@a,'/t1/line/node')) C0C1C2C3
|
|||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET utf8
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1';
|
||||
OPTION_LIST='xmlsup=domdoc,rownode=line,encoding=iso-8859-1';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3);
|
||||
Warnings:
|
||||
Level Warning
|
||||
Code 1105
|
||||
Message Com error: Unable to save character to 'iso-8859-1' encoding.
|
||||
|
||||
INSERT INTO t1 VALUES ('&<>"\'');
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
hex(node) C380C381C382C383
|
||||
node АБВГ
|
||||
hex(node) D090D091D092D093
|
||||
node &<>"'
|
||||
hex(node) 263C3E2227
|
||||
DROP TABLE t1;
|
||||
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
|
||||
SELECT CAST(@a AS CHAR CHARACTER SET latin1);
|
||||
CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Created by the MariaDB CONNECT Storage Engine-->
|
||||
<t1>
|
||||
<line>
|
||||
<node>ÀÁÂÃ</node>
|
||||
</line>
|
||||
<line>
|
||||
<node>АБВГ</node>
|
||||
</line>
|
||||
<line>
|
||||
<node>&<>"'</node>
|
||||
</line>
|
||||
</t1>
|
||||
CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Created by the MariaDB CONNECT Storage Engine-->
|
||||
<t1>
|
||||
<line>
|
||||
<node>&<>"'</node>
|
||||
</line>
|
||||
</t1>
|
||||
|
||||
|
|
|
|||
431
storage/connect/mysql-test/connect/r/xml2.result
Normal file
431
storage/connect/mysql-test/connect/r/xml2.result
Normal file
|
|
@ -0,0 +1,431 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing tag values
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
AUTHOR CHAR(50),
|
||||
TITLE CHAR(32),
|
||||
TRANSLATOR CHAR(40),
|
||||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
AUTHOR Jean-Christophe Bernadac
|
||||
TITLE Construire une application XML
|
||||
TRANSLATOR NULL
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1999
|
||||
AUTHOR William J. Pardi
|
||||
TITLE XML en Action
|
||||
TRANSLATOR James Guerin
|
||||
PUBLISHER Microsoft Press Paris
|
||||
DATEPUB 1999
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing that tag names are case sensitive
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
author CHAR(50),
|
||||
TITLE CHAR(32),
|
||||
TRANSLATOR CHAR(40),
|
||||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
author NULL
|
||||
TITLE Construire une application XML
|
||||
TRANSLATOR NULL
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1999
|
||||
author NULL
|
||||
TITLE XML en Action
|
||||
TRANSLATOR James Guerin
|
||||
PUBLISHER Microsoft Press Paris
|
||||
DATEPUB 1999
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing attribute values
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
ISBN CHAR(15),
|
||||
LANG CHAR(2),
|
||||
SUBJECT CHAR(32)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='Coltype=@,xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
ISBN 9782840825685
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing that attribute names are case sensitive
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
isbn CHAR(15),
|
||||
LANG CHAR(2),
|
||||
SUBJECT CHAR(32)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
OPTION_LIST='Coltype=@,xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
isbn NULL
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
isbn NULL
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing mixed tag and attribute values
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
ISBN CHAR(15) FIELD_FORMAT='@',
|
||||
LANG CHAR(2) FIELD_FORMAT='@',
|
||||
SUBJECT CHAR(32) FIELD_FORMAT='@',
|
||||
AUTHOR CHAR(50),
|
||||
TITLE CHAR(32),
|
||||
TRANSLATOR CHAR(40),
|
||||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR Jean-Christophe Bernadac
|
||||
TITLE Construire une application XML
|
||||
TRANSLATOR NULL
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782840825685
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR William J. Pardi
|
||||
TITLE XML en Action
|
||||
TRANSLATOR James Guerin
|
||||
PUBLISHER Microsoft Press Paris
|
||||
DATEPUB 1999
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing INSERT on mixed tag and attribute values
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
ISBN CHAR(15) FIELD_FORMAT='@',
|
||||
LANG CHAR(2) FIELD_FORMAT='@',
|
||||
SUBJECT CHAR(32) FIELD_FORMAT='@',
|
||||
AUTHOR CHAR(50),
|
||||
TITLE CHAR(32),
|
||||
TRANSLATOR CHAR(40),
|
||||
PUBLISHER CHAR(40),
|
||||
DATEPUB INT(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.xml'
|
||||
TABNAME='BIBLIO'
|
||||
OPTION_LIST='rownode=BOOK,xmlsup=libxml2';
|
||||
INSERT INTO t1 (ISBN, LANG, SUBJECT, AUTHOR, TITLE, PUBLISHEr, DATEPUB)
|
||||
VALUES('9782212090529','fr','général','Alain Michard',
|
||||
'XML, Langage et Applications','Eyrolles Paris',1998);
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR Jean-Christophe Bernadac
|
||||
TITLE Construire une application XML
|
||||
TRANSLATOR NULL
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782840825685
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR William J. Pardi
|
||||
TITLE XML en Action
|
||||
TRANSLATOR James Guerin
|
||||
PUBLISHER Microsoft Press Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782212090529
|
||||
LANG fr
|
||||
SUBJECT général
|
||||
AUTHOR Alain Michard
|
||||
TITLE XML, Langage et Applications
|
||||
TRANSLATOR NULL
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1998
|
||||
SELECT LOAD_FILE('MYSQLD_DATADIR/test/xsample2.xml') AS xml;
|
||||
xml <?xml version="1.0" encoding="UTF-8"?>
|
||||
<BIBLIO SUBJECT="XML">
|
||||
<BOOK ISBN="9782212090819" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>Jean-Christophe</FIRSTNAME>
|
||||
<LASTNAME>Bernadac</LASTNAME>
|
||||
</AUTHOR>
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>François</FIRSTNAME>
|
||||
<LASTNAME>Knab</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TITLE>Construire une application XML</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Eyrolles</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782840825685" LANG="fr" SUBJECT="applications">
|
||||
<AUTHOR>
|
||||
<FIRSTNAME>William J.</FIRSTNAME>
|
||||
<LASTNAME>Pardi</LASTNAME>
|
||||
</AUTHOR>
|
||||
<TRANSLATOR PREFIX="adapté de l'anglais par">
|
||||
<FIRSTNAME>James</FIRSTNAME>
|
||||
<LASTNAME>Guerin</LASTNAME>
|
||||
</TRANSLATOR>
|
||||
<TITLE>XML en Action</TITLE>
|
||||
<PUBLISHER>
|
||||
<NAME>Microsoft Press</NAME>
|
||||
<PLACE>Paris</PLACE>
|
||||
</PUBLISHER>
|
||||
<DATEPUB>1999</DATEPUB>
|
||||
</BOOK>
|
||||
<BOOK ISBN="9782212090529" LANG="fr" SUBJECT="général">
|
||||
<AUTHOR>Alain Michard</AUTHOR>
|
||||
<TITLE>XML, Langage et Applications</TITLE>
|
||||
<PUBLISHER>Eyrolles Paris</PUBLISHER>
|
||||
<DATEPUB>1998</DATEPUB>
|
||||
</BOOK>
|
||||
</BIBLIO>
|
||||
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing XPath
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
isbn CHAR(15) FIELD_FORMAT='@ISBN',
|
||||
language CHAR(2) FIELD_FORMAT='@LANG',
|
||||
subject CHAR(32) FIELD_FORMAT='@SUBJECT',
|
||||
authorfn CHAR(20) FIELD_FORMAT='AUTHOR/FIRSTNAME',
|
||||
authorln CHAR(20) FIELD_FORMAT='AUTHOR/LASTNAME',
|
||||
title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
translated CHAR(32) FIELD_FORMAT='TRANSLATOR/@PREFIX',
|
||||
tranfn CHAR(20) FIELD_FORMAT='TRANSLATOR/FIRSTNAME',
|
||||
tranln CHAR(20) FIELD_FORMAT='TRANSLATOR/LASTNAME',
|
||||
publisher CHAR(20) FIELD_FORMAT='PUBLISHER/NAME',
|
||||
location CHAR(20) FIELD_FORMAT='PUBLISHER/PLACE',
|
||||
year INT(4) FIELD_FORMAT='DATEPUB'
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
isbn 9782212090819
|
||||
language fr
|
||||
subject applications
|
||||
authorfn Jean-Christophe
|
||||
authorln Bernadac
|
||||
title Construire une application XML
|
||||
translated NULL
|
||||
tranfn NULL
|
||||
tranln NULL
|
||||
publisher Eyrolles
|
||||
location Paris
|
||||
year 1999
|
||||
isbn 9782840825685
|
||||
language fr
|
||||
subject applications
|
||||
authorfn William J.
|
||||
authorln Pardi
|
||||
title XML en Action
|
||||
translated adapté de l'anglais par
|
||||
tranfn James
|
||||
tranln Guerin
|
||||
publisher Microsoft Press
|
||||
location Paris
|
||||
year 1999
|
||||
SELECT isbn, title, translated, tranfn, tranln, location FROM t1
|
||||
WHERE translated <> '';
|
||||
isbn 9782840825685
|
||||
title XML en Action
|
||||
translated adapté de l'anglais par
|
||||
tranfn James
|
||||
tranln Guerin
|
||||
location Paris
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing that XPath is case sensitive
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
isbn CHAR(15) FIELD_FORMAT='@isbn'
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample.xml'
|
||||
TABNAME='BIBLIO' OPTION_LIST='rownode=BOOK,skipnull=1,xmlsup=libxml2';
|
||||
SELECT * FROM t1;
|
||||
isbn NULL
|
||||
isbn NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing character sets
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2'
|
||||
DATA_CHARSET=latin1;
|
||||
ERROR HY000: DATA_CHARSET='latin1' is not supported for TABLE_TYPE=XML
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2'
|
||||
DATA_CHARSET=utf8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table t1
|
||||
Create Table CREATE TABLE `t1` (
|
||||
`c` char(16) DEFAULT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=XML `FILE_NAME`='latin1.xml' `OPTION_LIST`='xmlsup=libxml2' `DATA_CHARSET`=utf8
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16)
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET utf8
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ÁÂÃÄÅÆÇ
|
||||
HEX(c) C381C382C383C384C385C386C387
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Conversion from latin1 to cp1251 produces a warning.
|
||||
# Question marks are returned.
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET cp1251
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='latin1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c ???????
|
||||
HEX(c) 3F3F3F3F3F3F3F
|
||||
Warnings:
|
||||
Level Warning
|
||||
Code 1366
|
||||
Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column 'c' at row 1
|
||||
Level Warning
|
||||
Code 1105
|
||||
Message Out of range value ÁÂÃÄÅÆÇ for column 'c' at row 1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing Cyrillic
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET utf8
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=b';
|
||||
SELECT * FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
INSERT INTO t1 VALUES ('ИКЛМН');
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
HEX(c) D091D092D093D094D095D096D097
|
||||
c ИКЛМН
|
||||
HEX(c) D098D09AD09BD09CD09D
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
c CHAR(16) CHARACTER SET cp1251
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='cp1251.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=b';
|
||||
SELECT * FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
c ИКЛМН
|
||||
INSERT INTO t1 VALUES ('ОПРСТ');
|
||||
SELECT c, HEX(c) FROM t1;
|
||||
c БВГДЕЖЗ
|
||||
HEX(c) C1C2C3C4C5C6C7
|
||||
c ИКЛМН
|
||||
HEX(c) C8CACBCCCD
|
||||
c ОПРСТ
|
||||
HEX(c) CECFD0D1D2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing that the underlying file is created with a proper Encoding
|
||||
#
|
||||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET latin1
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=utf-8';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
hex(node) C0C1C2C3
|
||||
DROP TABLE t1;
|
||||
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
|
||||
SELECT LEFT(@a,38);
|
||||
LEFT(@a,38) <?xml version="1.0" encoding="utf-8"?>
|
||||
SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node'));
|
||||
HEX(EXTRACTVALUE(@a,'/t1/line/node')) C380C381C382C383
|
||||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET latin1
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
hex(node) C0C1C2C3
|
||||
DROP TABLE t1;
|
||||
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
|
||||
SELECT LEFT(@a,43);
|
||||
LEFT(@a,43) <?xml version="1.0" encoding="iso-8859-1"?>
|
||||
SELECT HEX(EXTRACTVALUE(@a,'/t1/line/node'));
|
||||
HEX(EXTRACTVALUE(@a,'/t1/line/node')) C0C1C2C3
|
||||
#
|
||||
# Testing XML entities
|
||||
#
|
||||
CREATE TABLE t1 (node VARCHAR(50))
|
||||
CHARACTER SET utf8
|
||||
ENGINE=connect TABLE_TYPE=xml FILE_NAME='t1.xml'
|
||||
OPTION_LIST='xmlsup=libxml2,rownode=line,encoding=iso-8859-1';
|
||||
INSERT INTO t1 VALUES (_latin1 0xC0C1C2C3);
|
||||
INSERT INTO t1 VALUES (_cp1251 0xC0C1C2C3);
|
||||
INSERT INTO t1 VALUES ('&<>"\'');
|
||||
SELECT node, hex(node) FROM t1;
|
||||
node ÀÁÂÃ
|
||||
hex(node) C380C381C382C383
|
||||
node АБВГ
|
||||
hex(node) D090D091D092D093
|
||||
node &<>"'
|
||||
hex(node) 263C3E2227
|
||||
DROP TABLE t1;
|
||||
SET @a=LOAD_FILE('MYSQLD_DATADIR/test/t1.xml');
|
||||
SELECT CAST(@a AS CHAR CHARACTER SET latin1);
|
||||
CAST(@a AS CHAR CHARACTER SET latin1) <?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Created by the MariaDB CONNECT Storage Engine-->
|
||||
<t1>
|
||||
<line>
|
||||
<node>ÀÁÂÃ</node>
|
||||
</line>
|
||||
<line>
|
||||
<node>АБВГ</node>
|
||||
</line>
|
||||
<line>
|
||||
<node>&<>"'</node>
|
||||
</line>
|
||||
</t1>
|
||||
|
||||
97
storage/connect/mysql-test/connect/r/xml2_grant.result
Normal file
97
storage/connect/mysql-test/connect/r/xml2_grant.result
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Beginning of grant.inc
|
||||
#
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
10
|
||||
UPDATE t1 SET a=20;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
20
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
INSERT INTO t1 VALUES(10);
|
||||
TRUNCATE TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
INSERT INTO t1 VALUES (10);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE t1 SET a=20;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
TRUNCATE TABLE t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
ALTER TABLE t1 READONLY=1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
ALTER TABLE t1 FILE_NAME='t2.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DROP TABLE t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
SELECT * FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO v1 VALUES (2);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DROP TABLE t1;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
#
|
||||
32
storage/connect/mysql-test/connect/r/xml2_html.result
Normal file
32
storage/connect/mysql-test/connect/r/xml2_html.result
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing HTML like XML file
|
||||
#
|
||||
CREATE TABLE beers (
|
||||
`Name` CHAR(16) FIELD_FORMAT='brandName',
|
||||
`Origin` CHAR(16) FIELD_FORMAT='origin',
|
||||
`Description` CHAR(32) FIELD_FORMAT='details')
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml'
|
||||
TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td';
|
||||
SELECT * FROM beers;
|
||||
Name Origin Description
|
||||
Huntsman Bath, UK Wonderful hop, light alcohol
|
||||
Tuborg Danmark In small bottles
|
||||
DROP TABLE beers;
|
||||
#
|
||||
# Testing HTML file
|
||||
#
|
||||
CREATE TABLE coffee (
|
||||
`Name` CHAR(16),
|
||||
`Cups` INT(8),
|
||||
`Type` CHAR(16),
|
||||
`Sugar` CHAR(4))
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm'
|
||||
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML';
|
||||
SELECT * FROM coffee;
|
||||
Name Cups Type Sugar
|
||||
T. Sexton 10 Espresso No
|
||||
J. Dinnen 5 Decaf Yes
|
||||
DROP TABLE coffee;
|
||||
25
storage/connect/mysql-test/connect/r/xml2_mdev5261.result
Normal file
25
storage/connect/mysql-test/connect/r/xml2_mdev5261.result
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N';
|
||||
ERROR HY000: Table type XML is not indexable
|
||||
CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=libxml2,Rownode=N';
|
||||
DESCRIBE t1;
|
||||
Field Type Null Key Default Extra
|
||||
i int(11) NO NULL
|
||||
ALTER TABLE t1 ADD UNIQUE(i);
|
||||
ERROR HY000: Table type XML is not indexable
|
||||
CREATE UNIQUE INDEX i ON t1(i);
|
||||
ERROR HY000: Table type XML is not indexable
|
||||
DESCRIBE t1;
|
||||
Field Type Null Key Default Extra
|
||||
i int(11) NO NULL
|
||||
INSERT INTO t1 VALUES(2),(5),(7);
|
||||
SELECT * FROM t1 WHERE i = 5;
|
||||
i
|
||||
5
|
||||
ALTER TABLE t1 DROP INDEX i;
|
||||
ERROR 42000: Can't DROP 'i'; check that column/key exists
|
||||
DROP INDEX i ON t1;
|
||||
ERROR 42000: Can't DROP 'i'; check that column/key exists
|
||||
DROP TABLE t1;
|
||||
102
storage/connect/mysql-test/connect/r/xml2_mult.result
Normal file
102
storage/connect/mysql-test/connect/r/xml2_mult.result
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing expanded values
|
||||
#
|
||||
CREATE TABLE `bookstore` (
|
||||
`category` CHAR(16) NOT NULL FIELD_FORMAT='@',
|
||||
`title` VARCHAR(50) NOT NULL,
|
||||
`lang` char(2) NOT NULL FIELD_FORMAT='title/@',
|
||||
`author` VARCHAR(24) NOT NULL,
|
||||
`year` INT(4) NOT NULL,
|
||||
`price` DOUBLE(8,2) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
CHILDREN Harry Potter en J K. Rowling 2005 29.99
|
||||
WEB XQuery Kick Start en James McGovern 2003 49.99
|
||||
WEB XQuery Kick Start en Per Bothner 2003 49.99
|
||||
WEB XQuery Kick Start en Kurt Cagle 2003 49.99
|
||||
WEB XQuery Kick Start en James Linn 2003 49.99
|
||||
WEB XQuery Kick Start en Vaidyanathan Nagarajan 2003 49.99
|
||||
WEB Learning XML en Erik T. Ray 2003 39.95
|
||||
SELECT category, title, price FROM bookstore;
|
||||
category title price
|
||||
COOKING Everyday Italian 30.00
|
||||
CHILDREN Harry Potter 29.99
|
||||
WEB XQuery Kick Start 49.99
|
||||
WEB Learning XML 39.95
|
||||
SELECT category, title, author, price FROM bookstore WHERE author LIKE '%K%';
|
||||
category title author price
|
||||
CHILDREN Harry Potter J K. Rowling 29.99
|
||||
WEB XQuery Kick Start Kurt Cagle 49.99
|
||||
WEB Learning XML Erik T. Ray 39.95
|
||||
SELECT category, title, price FROM bookstore WHERE author LIKE 'J%';
|
||||
category title price
|
||||
CHILDREN Harry Potter 29.99
|
||||
WEB XQuery Kick Start 49.99
|
||||
WEB XQuery Kick Start 49.99
|
||||
#
|
||||
# Limiting expanded values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
CHILDREN Harry Potter en J K. Rowling 2005 29.99
|
||||
WEB XQuery Kick Start en James McGovern 2003 49.99
|
||||
WEB XQuery Kick Start en Per Bothner 2003 49.99
|
||||
WEB XQuery Kick Start en Kurt Cagle 2003 49.99
|
||||
WEB Learning XML en Erik T. Ray 2003 39.95
|
||||
Warnings:
|
||||
Warning 1105 Mutiple values limited to 3
|
||||
# One line lost because the where clause is applied only on the first 3 rows
|
||||
SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%';
|
||||
category title author price
|
||||
CHILDREN Harry Potter J K. Rowling 29.99
|
||||
WEB XQuery Kick Start James McGovern 49.99
|
||||
Warnings:
|
||||
Warning 1105 Mutiple values limited to 3
|
||||
#
|
||||
# Testing concatenated values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2';
|
||||
# truncated
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
CHILDREN Harry Potter en J K. Rowling 2005 29.99
|
||||
WEB XQuery Kick Start en James McGovern, Per Both 2003 49.99
|
||||
WEB Learning XML en Erik T. Ray 2003 39.95
|
||||
Warnings:
|
||||
Warning 1105 Truncated author content
|
||||
# increase author size
|
||||
ALTER TABLE bookstore MODIFY `author` VARCHAR(128) NOT NULL;
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
CHILDREN Harry Potter en J K. Rowling 2005 29.99
|
||||
WEB XQuery Kick Start en James McGovern, Per Bothner, Kurt Cagle, James Linn, Vaidyanathan Nagarajan 2003 49.99
|
||||
WEB Learning XML en Erik T. Ray 2003 39.95
|
||||
#
|
||||
# Limiting concatenated values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
CHILDREN Harry Potter en J K. Rowling 2005 29.99
|
||||
WEB XQuery Kick Start en James McGovern, Per Bothner, Kurt Cagle, James Linn 2003 49.99
|
||||
WEB Learning XML en Erik T. Ray 2003 39.95
|
||||
Warnings:
|
||||
Warning 1105 Mutiple values limited to 4
|
||||
# The where clause is applied on the concatenated column result
|
||||
SELECT category, title, author, price FROM bookstore WHERE author LIKE 'J%';
|
||||
category title author price
|
||||
CHILDREN Harry Potter J K. Rowling 29.99
|
||||
WEB XQuery Kick Start James McGovern, Per Bothner, Kurt Cagle, James Linn 49.99
|
||||
Warnings:
|
||||
Warning 1105 Mutiple values limited to 4
|
||||
DROP TABLE bookstore;
|
||||
98
storage/connect/mysql-test/connect/r/xml2_zip.result
Normal file
98
storage/connect/mysql-test/connect/r/xml2_zip.result
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Testing zipped XML tables
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
ISBN CHAR(13) NOT NULL FIELD_FORMAT='@',
|
||||
LANG CHAR(2) NOT NULL FIELD_FORMAT='@',
|
||||
SUBJECT CHAR(12) NOT NULL FIELD_FORMAT='@',
|
||||
AUTHOR_FIRSTNAME CHAR(15) NOT NULL FIELD_FORMAT='AUTHOR/FIRSTNAME',
|
||||
AUTHOR_LASTNAME CHAR(8) NOT NULL FIELD_FORMAT='AUTHOR/LASTNAME',
|
||||
TRANSLATOR_PREFIX CHAR(24) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/@PREFIX',
|
||||
TRANSLATOR_FIRSTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/FIRSTNAME',
|
||||
TRANSLATOR_LASTNAME CHAR(6) DEFAULT NULL FIELD_FORMAT='TRANSLATOR/LASTNAME',
|
||||
TITLE CHAR(30) NOT NULL,
|
||||
PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME',
|
||||
PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE',
|
||||
DATEPUB CHAR(4) NOT NULL
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES
|
||||
OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR_FIRSTNAME Jean-Christophe
|
||||
AUTHOR_LASTNAME Bernadac
|
||||
TRANSLATOR_PREFIX NULL
|
||||
TRANSLATOR_FIRSTNAME NULL
|
||||
TRANSLATOR_LASTNAME NULL
|
||||
TITLE Construire une application XML
|
||||
PUBLISHER_NAME Eyrolles
|
||||
PUBLISHER_PLACE Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR_FIRSTNAME François
|
||||
AUTHOR_LASTNAME Knab
|
||||
TRANSLATOR_PREFIX NULL
|
||||
TRANSLATOR_FIRSTNAME NULL
|
||||
TRANSLATOR_LASTNAME NULL
|
||||
TITLE Construire une application XML
|
||||
PUBLISHER_NAME Eyrolles
|
||||
PUBLISHER_PLACE Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782840825685
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR_FIRSTNAME William J.
|
||||
AUTHOR_LASTNAME Pardi
|
||||
TRANSLATOR_PREFIX adapté de l'anglais par
|
||||
TRANSLATOR_FIRSTNAME James
|
||||
TRANSLATOR_LASTNAME Guerin
|
||||
TITLE XML en Action
|
||||
PUBLISHER_NAME Microsoft Press
|
||||
PUBLISHER_PLACE Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782212090529
|
||||
LANG fr
|
||||
SUBJECT général
|
||||
AUTHOR_FIRSTNAME Alain
|
||||
AUTHOR_LASTNAME Michard
|
||||
TRANSLATOR_PREFIX NULL
|
||||
TRANSLATOR_FIRSTNAME NULL
|
||||
TRANSLATOR_LASTNAME NULL
|
||||
TITLE XML, Langage et Applications
|
||||
PUBLISHER_NAME Eyrolles
|
||||
PUBLISHER_PLACE Paris
|
||||
DATEPUB 2003
|
||||
CREATE TABLE t2
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
SELECT * FROM t2;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR Jean-Christophe Bernadac
|
||||
TRANSLATOR NULL
|
||||
TITLE Construire une application XML
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782840825685
|
||||
LANG fr
|
||||
SUBJECT applications
|
||||
AUTHOR William J. Pardi
|
||||
TRANSLATOR James Guerin
|
||||
TITLE XML en Action
|
||||
PUBLISHER Microsoft Press Paris
|
||||
DATEPUB 1999
|
||||
ISBN 9782212090529
|
||||
LANG fr
|
||||
SUBJECT général
|
||||
AUTHOR Alain Michard
|
||||
TRANSLATOR NULL
|
||||
TITLE XML, Langage et Applications
|
||||
PUBLISHER Eyrolles Paris
|
||||
DATEPUB 2003
|
||||
DROP TABLE t1,t2;
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Beginning of grant.inc
|
||||
#
|
||||
|
|
@ -9,7 +7,7 @@ REVOKE FILE ON *.* FROM user@localhost;
|
|||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row';
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
INSERT INTO t1 VALUES (10);
|
||||
|
|
@ -32,12 +30,12 @@ SELECT * FROM v1;
|
|||
a
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row' FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row' FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT user();
|
||||
user()
|
||||
|
|
@ -81,7 +79,7 @@ user()
|
|||
root@localhost
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row';
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=domdoc,rownode=row';
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
INSERT INTO t1 VALUES (10);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing HTML like XML file
|
||||
|
|
@ -9,7 +7,7 @@ CREATE TABLE beers (
|
|||
`Origin` CHAR(16) FIELD_FORMAT='origin',
|
||||
`Description` CHAR(32) FIELD_FORMAT='details')
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml'
|
||||
TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td';
|
||||
TABNAME='table' OPTION_LIST='xmlsup=domdoc,rownode=tr,colnode=td';
|
||||
SELECT * FROM beers;
|
||||
Name Origin Description
|
||||
Huntsman Bath, UK Wonderful hop, light alcohol
|
||||
|
|
@ -24,7 +22,7 @@ CREATE TABLE coffee (
|
|||
`Type` CHAR(16),
|
||||
`Sugar` CHAR(4))
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm'
|
||||
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML';
|
||||
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=domdoc,Coltype=HTML';
|
||||
SELECT * FROM coffee;
|
||||
Name Cups Type Sugar
|
||||
T. Sexton 10 Espresso No
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
|
||||
CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N';
|
||||
ERROR HY000: Table type XML is not indexable
|
||||
CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N';
|
||||
CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='xmlsup=domdoc,Rownode=N';
|
||||
DESCRIBE t1;
|
||||
Field Type Null Key Default Extra
|
||||
i int(11) NO NULL
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing expanded values
|
||||
|
|
@ -11,7 +9,7 @@ CREATE TABLE `bookstore` (
|
|||
`author` VARCHAR(24) NOT NULL,
|
||||
`year` INT(4) NOT NULL,
|
||||
`price` DOUBLE(8,2) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=libxml2';
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='bookstore.xml' OPTION_LIST='expand=1,mulnode=author,limit=6,xmlsup=domdoc';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
|
|
@ -41,7 +39,7 @@ WEB XQuery Kick Start 49.99
|
|||
#
|
||||
# Limiting expanded values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=libxml2';
|
||||
ALTER TABLE bookstore OPTION_LIST='expand=1,mulnode=author,limit=3,xmlsup=domdoc';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
|
|
@ -62,7 +60,7 @@ Warning 1105 Mutiple values limited to 3
|
|||
#
|
||||
# Testing concatenated values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=libxml2';
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=6,xmlsup=domdoc';
|
||||
# truncated
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
|
|
@ -83,7 +81,7 @@ WEB Learning XML en Erik T. Ray 2003 39.95
|
|||
#
|
||||
# Limiting concatenated values
|
||||
#
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=libxml2';
|
||||
ALTER TABLE bookstore OPTION_LIST='mulnode=author,limit=4,xmlsup=domdoc';
|
||||
SELECT * FROM bookstore;
|
||||
category title lang author year price
|
||||
COOKING Everyday Italian en Giada De Laurentiis 2005 30.00
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
#
|
||||
# Testing zipped XML tables
|
||||
#
|
||||
|
|
@ -17,7 +15,7 @@ PUBLISHER_NAME CHAR(15) NOT NULL FIELD_FORMAT='PUBLISHER/NAME',
|
|||
PUBLISHER_PLACE CHAR(5) NOT NULL FIELD_FORMAT='PUBLISHER/PLACE',
|
||||
DATEPUB CHAR(4) NOT NULL
|
||||
) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES
|
||||
OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=libxml2,expand=1,mulnode=AUTHOR';
|
||||
OPTION_LIST='entry=xsample2.xml,load=xsample2.xml,rownode=BOOK,xmlsup=domdoc,expand=1,mulnode=AUTHOR';
|
||||
SELECT * FROM t1;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
|
|
@ -69,7 +67,7 @@ PUBLISHER_PLACE Paris
|
|||
DATEPUB 2003
|
||||
CREATE TABLE t2
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xsample2.zip' ZIPPED=YES
|
||||
OPTION_LIST='xmlsup=libxml2';
|
||||
OPTION_LIST='xmlsup=domdoc';
|
||||
SELECT * FROM t2;
|
||||
ISBN 9782212090819
|
||||
LANG fr
|
||||
|
|
|
|||
|
|
@ -171,16 +171,16 @@ DROP TABLE t1,t2,t3,t4;
|
|||
#
|
||||
CREATE TABLE t1 (
|
||||
_id INT(2) NOT NULL,
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth CHAR(20) DEFAULT NULL,
|
||||
death CHAR(20) DEFAULT NULL,
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='contribs:',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards::award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards::year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='awards::by'
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='$.contribs',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards.award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards.year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards.by'
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.zip' OPTION_LIST='ENTRY=bios.json,LOAD=bios.json' ZIPPED=YES;
|
||||
SELECT * FROM t1;
|
||||
_id name_first name_aka name_last title birth death contribs awards_award awards_year awards_by
|
||||
|
|
@ -211,16 +211,16 @@ _id name_first name_aka name_last title birth death contribs awards_award awards
|
|||
10 Martin NULL Odersky NULL NULL NULL Scala NULL NULL NULL
|
||||
CREATE TABLE t3 (
|
||||
_id INT(2) NOT NULL,
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
death date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='contribs:[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards:[x]:award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards:[x]:year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='awards:[x]:by'
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='$.contribs.[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards[*].award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards[*].year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards[*].by'
|
||||
) ENGINE=CONNECT TABLE_TYPE='json' FILE_NAME='bios.zip' ZIPPED=YES;
|
||||
SELECT * FROM t3 WHERE _id = 1;
|
||||
_id firstname aka lastname title birth death contribs award year by
|
||||
|
|
|
|||
BIN
storage/connect/mysql-test/connect/std_data/Mongo2.jar
Normal file
BIN
storage/connect/mysql-test/connect/std_data/Mongo2.jar
Normal file
Binary file not shown.
BIN
storage/connect/mysql-test/connect/std_data/Mongo3.jar
Normal file
BIN
storage/connect/mysql-test/connect/std_data/Mongo3.jar
Normal file
Binary file not shown.
29353
storage/connect/mysql-test/connect/std_data/cities.json
Normal file
29353
storage/connect/mysql-test/connect/std_data/cities.json
Normal file
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue