PATH: //usr/include/mysql/server/private
FILE_BARU
CREATE
FOLDER_BARU
MKDIR
UPLOAD_FILE
GO
[ .. KEMBALI ]
📄 aligned.h
↓
X
📄 aria_backup.h
↓
X
📄 assume_aligned.h
↓
X
📁 atomic/
X
📄 authors.h
↓
X
📄 backup.h
↓
X
📄 bounded_queue.h
↓
X
📄 client_settings.h
↓
X
📄 compat56.h
↓
X
📄 config.h
↓
X
📄 contributors.h
↓
X
📄 create_options.h
↓
X
📄 create_tmp_table.h
↓
X
📄 cset_narrowing.h
↓
X
📄 custom_conf.h
↓
X
📄 datadict.h
↓
X
📄 ddl_log.h
↓
X
📄 debug.h
↓
X
📄 debug_sync.h
↓
X
📄 derived_handler.h
↓
X
📄 derror.h
↓
X
📄 des_key_file.h
↓
X
📄 discover.h
↓
X
📄 dur_prop.h
↓
X
📄 embedded_priv.h
↓
X
📄 event_data_objects.h
↓
X
📄 event_db_repository.h
↓
X
📄 event_parse_data.h
↓
X
📄 event_queue.h
↓
X
📄 event_scheduler.h
↓
X
📄 events.h
↓
X
📄 field.h
↓
X
📄 field_comp.h
↓
X
📄 filesort.h
↓
X
📄 filesort_utils.h
↓
X
📄 ft_global.h
↓
X
📄 gcalc_slicescan.h
↓
X
📄 gcalc_tools.h
↓
X
📄 grant.h
↓
X
📄 group_by_handler.h
↓
X
📄 gstream.h
↓
X
📄 ha_handler_stats.h
↓
X
📄 ha_partition.h
↓
X
📄 ha_sequence.h
↓
X
📄 handle_connections_win.h
↓
X
📄 handler.h
↓
X
📄 hash.h
↓
X
📄 hash_filo.h
↓
X
📄 heap.h
↓
X
📄 hostname.h
↓
X
📄 ilist.h
↓
X
📄 init.h
↓
X
📄 innodb_priv.h
↓
X
📄 item.h
↓
X
📄 item_cmpfunc.h
↓
X
📄 item_create.h
↓
X
📄 item_func.h
↓
X
📄 item_geofunc.h
↓
X
📄 item_jsonfunc.h
↓
X
📄 item_row.h
↓
X
📄 item_strfunc.h
↓
X
📄 item_subselect.h
↓
X
📄 item_sum.h
↓
X
📄 item_timefunc.h
↓
X
📄 item_vers.h
↓
X
📄 item_windowfunc.h
↓
X
📄 item_xmlfunc.h
↓
X
📄 json_table.h
↓
X
📄 key.h
↓
X
📄 keycaches.h
↓
X
📄 lex.h
↓
X
📄 lex_string.h
↓
X
📄 lex_symbol.h
↓
X
📄 lf.h
↓
X
📄 lock.h
↓
X
📄 log.h
↓
X
📄 log_event.h
↓
X
📄 log_event_data_type.h
↓
X
📄 log_event_old.h
↓
X
📄 log_slow.h
↓
X
📄 maria.h
↓
X
📄 mariadb.h
↓
X
📄 mdl.h
↓
X
📄 mem_root_array.h
↓
X
📄 message.h
↓
X
📄 multi_range_read.h
↓
X
📄 my_alarm.h
↓
X
📄 my_apc.h
↓
X
📄 my_atomic.h
↓
X
📄 my_atomic_wrapper.h
↓
X
📄 my_base.h
↓
X
📄 my_bit.h
↓
X
📄 my_bitmap.h
↓
X
📄 my_check_opt.h
↓
X
📄 my_compare.h
↓
X
📄 my_counter.h
↓
X
📄 my_cpu.h
↓
X
📄 my_crypt.h
↓
X
📄 my_decimal.h
↓
X
📄 my_default.h
↓
X
📄 my_handler_errors.h
↓
X
📄 my_json_writer.h
↓
X
📄 my_libwrap.h
↓
X
📄 my_md5.h
↓
X
📄 my_minidump.h
↓
X
📄 my_nosys.h
↓
X
📄 my_rdtsc.h
↓
X
📄 my_rnd.h
↓
X
📄 my_service_manager.h
↓
X
📄 my_stack_alloc.h
↓
X
📄 my_stacktrace.h
↓
X
📄 my_time.h
↓
X
📄 my_tree.h
↓
X
📄 my_uctype.h
↓
X
📄 my_user.h
↓
X
📄 myisam.h
↓
X
📄 myisamchk.h
↓
X
📄 myisammrg.h
↓
X
📄 myisampack.h
↓
X
📄 mysqld.h
↓
X
📄 mysqld_default_groups.h
↓
X
📄 mysqld_suffix.h
↓
X
📄 mysys_err.h
↓
X
📄 opt_range.h
↓
X
📄 opt_subselect.h
↓
X
📄 opt_trace.h
↓
X
📄 opt_trace_context.h
↓
X
📄 parse_file.h
↓
X
📄 partition_element.h
↓
X
📄 partition_info.h
↓
X
📄 password.h
↓
X
📄 pfs_file_provider.h
↓
X
📄 pfs_idle_provider.h
↓
X
📄 pfs_memory_provider.h
↓
X
📄 pfs_metadata_provider.h
↓
X
📄 pfs_socket_provider.h
↓
X
📄 pfs_stage_provider.h
↓
X
📄 pfs_statement_provider.h
↓
X
📄 pfs_table_provider.h
↓
X
📄 pfs_thread_provider.h
↓
X
📄 pfs_transaction_provider.h
↓
X
📄 privilege.h
↓
X
📄 probes_mysql.h
↓
X
📄 probes_mysql_dtrace.h
↓
X
📄 probes_mysql_nodtrace.h
↓
X
📄 procedure.h
↓
X
📄 protocol.h
↓
X
📄 proxy_protocol.h
↓
X
📄 queues.h
↓
X
📄 records.h
↓
X
📄 repl_failsafe.h
↓
X
📄 replication.h
↓
X
📄 rijndael.h
↓
X
📄 rowid_filter.h
↓
X
📄 rpl_constants.h
↓
X
📄 rpl_filter.h
↓
X
📄 rpl_gtid.h
↓
X
📄 rpl_injector.h
↓
X
📄 rpl_mi.h
↓
X
📄 rpl_parallel.h
↓
X
📄 rpl_record.h
↓
X
📄 rpl_record_old.h
↓
X
📄 rpl_reporting.h
↓
X
📄 rpl_rli.h
↓
X
📄 rpl_tblmap.h
↓
X
📄 rpl_utility.h
↓
X
📄 scheduler.h
↓
X
📄 scope.h
↓
X
📄 select_handler.h
↓
X
📄 semisync.h
↓
X
📄 semisync_master.h
↓
X
📄 semisync_master_ack_receiver.h
↓
X
📄 semisync_slave.h
↓
X
📄 service_versions.h
↓
X
📄 session_tracker.h
↓
X
📄 set_var.h
↓
X
📄 slave.h
↓
X
📄 socketpair.h
↓
X
📄 source_revision.h
↓
X
📄 sp.h
↓
X
📄 sp_cache.h
↓
X
📄 sp_head.h
↓
X
📄 sp_pcontext.h
↓
X
📄 sp_rcontext.h
↓
X
📄 span.h
↓
X
📄 spatial.h
↓
X
📄 sql_acl.h
↓
X
📄 sql_admin.h
↓
X
📄 sql_alloc.h
↓
X
📄 sql_alter.h
↓
X
📄 sql_analyse.h
↓
X
📄 sql_analyze_stmt.h
↓
X
📄 sql_array.h
↓
X
📄 sql_audit.h
↓
X
📄 sql_base.h
↓
X
📄 sql_basic_types.h
↓
X
📄 sql_binlog.h
↓
X
📄 sql_bitmap.h
↓
X
📄 sql_bootstrap.h
↓
X
📄 sql_cache.h
↓
X
📄 sql_callback.h
↓
X
📄 sql_class.h
↓
X
📄 sql_cmd.h
↓
X
📄 sql_connect.h
↓
X
📄 sql_const.h
↓
X
📄 sql_crypt.h
↓
X
📄 sql_cte.h
↓
X
📄 sql_cursor.h
↓
X
📄 sql_db.h
↓
X
📄 sql_debug.h
↓
X
📄 sql_delete.h
↓
X
📄 sql_derived.h
↓
X
📄 sql_digest.h
↓
X
📄 sql_digest_stream.h
↓
X
📄 sql_do.h
↓
X
📄 sql_error.h
↓
X
📄 sql_explain.h
↓
X
📄 sql_expression_cache.h
↓
X
📄 sql_get_diagnostics.h
↓
X
📄 sql_handler.h
↓
X
📄 sql_help.h
↓
X
📄 sql_hset.h
↓
X
📄 sql_i_s.h
↓
X
📄 sql_insert.h
↓
X
📄 sql_join_cache.h
↓
X
📄 sql_lex.h
↓
X
📄 sql_lifo_buffer.h
↓
X
📄 sql_limit.h
↓
X
📄 sql_list.h
↓
X
📄 sql_load.h
↓
X
📄 sql_locale.h
↓
X
📄 sql_manager.h
↓
X
📄 sql_mode.h
↓
X
📄 sql_parse.h
↓
X
📄 sql_partition.h
↓
X
📄 sql_partition_admin.h
↓
X
📄 sql_plist.h
↓
X
📄 sql_plugin.h
↓
X
📄 sql_plugin_compat.h
↓
X
📄 sql_prepare.h
↓
X
📄 sql_priv.h
↓
X
📄 sql_profile.h
↓
X
📄 sql_reload.h
↓
X
📄 sql_rename.h
↓
X
📄 sql_repl.h
↓
X
📄 sql_schema.h
↓
X
📄 sql_select.h
↓
X
📄 sql_sequence.h
↓
X
📄 sql_servers.h
↓
X
📄 sql_show.h
↓
X
📄 sql_signal.h
↓
X
📄 sql_sort.h
↓
X
📄 sql_statistics.h
↓
X
📄 sql_string.h
↓
X
📄 sql_table.h
↓
X
📄 sql_tablespace.h
↓
X
📄 sql_test.h
↓
X
📄 sql_time.h
↓
X
📄 sql_trigger.h
↓
X
📄 sql_truncate.h
↓
X
📄 sql_tvc.h
↓
X
📄 sql_type.h
↓
X
📄 sql_type_fixedbin.h
↓
X
📄 sql_type_fixedbin_storage.h
↓
X
📄 sql_type_geom.h
↓
X
📄 sql_type_int.h
↓
X
📄 sql_type_json.h
↓
X
📄 sql_type_real.h
↓
X
📄 sql_type_string.h
↓
X
📄 sql_udf.h
↓
X
📄 sql_union.h
↓
X
📄 sql_update.h
↓
X
📄 sql_view.h
↓
X
📄 sql_window.h
↓
X
📄 ssl_compat.h
↓
X
📄 strfunc.h
↓
X
📄 structs.h
↓
X
📄 sys_vars_shared.h
↓
X
📄 t_ctype.h
↓
X
📄 table.h
↓
X
📄 table_cache.h
↓
X
📄 thr_alarm.h
↓
X
📄 thr_lock.h
↓
X
📄 thr_malloc.h
↓
X
📄 thr_timer.h
↓
X
📄 thread_cache.h
↓
X
📄 threadpool.h
↓
X
📄 threadpool_generic.h
↓
X
📄 threadpool_winsockets.h
↓
X
📄 transaction.h
↓
X
📄 tzfile.h
↓
X
📄 tztime.h
↓
X
📄 uniques.h
↓
X
📄 unireg.h
↓
X
📄 vers_string.h
↓
X
📄 violite.h
↓
X
📄 waiting_threads.h
↓
X
📄 welcome_copyright_notice.h
↓
X
📄 win_tzname_data.h
↓
X
📄 winservice.h
↓
X
📄 wqueue.h
↓
X
📄 wsrep.h
↓
X
📄 wsrep_applier.h
↓
X
📄 wsrep_binlog.h
↓
X
📄 wsrep_client_service.h
↓
X
📄 wsrep_client_state.h
↓
X
📄 wsrep_condition_variable.h
↓
X
📄 wsrep_high_priority_service.h
↓
X
📄 wsrep_mutex.h
↓
X
📄 wsrep_mysqld.h
↓
X
📄 wsrep_mysqld_c.h
↓
X
📄 wsrep_on.h
↓
X
📄 wsrep_priv.h
↓
X
📄 wsrep_schema.h
↓
X
📄 wsrep_server_service.h
↓
X
📄 wsrep_server_state.h
↓
X
📄 wsrep_sst.h
↓
X
📄 wsrep_storage_service.h
↓
X
📄 wsrep_thd.h
↓
X
📄 wsrep_trans_observer.h
↓
X
📄 wsrep_types.h
↓
X
📄 wsrep_utils.h
↓
X
📄 wsrep_var.h
↓
X
📄 wsrep_xid.h
↓
X
📄 xa.h
↓
X
SAVING...
BERHASIL DIUBAH!
EDITING: item_geofunc.h
#ifndef ITEM_GEOFUNC_INCLUDED #define ITEM_GEOFUNC_INCLUDED /* Copyright (c) 2000, 2016 Oracle and/or its affiliates. Copyright (C) 2011, 2021, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ /* This file defines all spatial functions */ #ifdef HAVE_SPATIAL #ifdef USE_PRAGMA_INTERFACE #pragma interface /* gcc class implementation */ #endif #include "sql_type_geom.h" #include "item.h" #include "gstream.h" #include "spatial.h" #include "gcalc_slicescan.h" #include "gcalc_tools.h" class Item_geometry_func: public Item_str_func { public: Item_geometry_func(THD *thd): Item_str_func(thd) {} Item_geometry_func(THD *thd, Item *a): Item_str_func(thd, a) {} Item_geometry_func(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} Item_geometry_func(THD *thd, Item *a, Item *b, Item *c): Item_str_func(thd, a, b, c) {} Item_geometry_func(THD *thd, List<Item> &list): Item_str_func(thd, list) {} bool fix_length_and_dec() override; const Type_handler *type_handler() const override { return &type_handler_geometry; } }; /* Functions returning REAL measurements of a single GEOMETRY argument */ class Item_real_func_args_geometry: public Item_real_func { protected: String value; bool check_arguments() const override { DBUG_ASSERT(arg_count == 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } public: Item_real_func_args_geometry(THD *thd, Item *a) :Item_real_func(thd, a) {} }; /* Functions returning INT measurements of a single GEOMETRY argument */ class Item_long_func_args_geometry: public Item_long_func { bool check_arguments() const override { DBUG_ASSERT(arg_count == 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } protected: String value; public: Item_long_func_args_geometry(THD *thd, Item *a) :Item_long_func(thd, a) {} }; /* Functions returning BOOL measurements of a single GEOMETRY argument */ class Item_bool_func_args_geometry: public Item_bool_func { protected: String value; bool check_arguments() const override { DBUG_ASSERT(arg_count == 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } public: Item_bool_func_args_geometry(THD *thd, Item *a) :Item_bool_func(thd, a) {} }; /* Functions returning ASCII string measurements of a single GEOMETRY argument */ class Item_str_ascii_func_args_geometry: public Item_str_ascii_func { protected: bool check_arguments() const override { DBUG_ASSERT(arg_count >= 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } public: Item_str_ascii_func_args_geometry(THD *thd, Item *a) :Item_str_ascii_func(thd, a) {} Item_str_ascii_func_args_geometry(THD *thd, Item *a, Item *b) :Item_str_ascii_func(thd, a, b) {} Item_str_ascii_func_args_geometry(THD *thd, Item *a, Item *b, Item *c) :Item_str_ascii_func(thd, a, b, c) {} }; /* Functions returning binary string measurements of a single GEOMETRY argument */ class Item_binary_func_args_geometry: public Item_str_func { protected: bool check_arguments() const override { DBUG_ASSERT(arg_count >= 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } public: Item_binary_func_args_geometry(THD *thd, Item *a) :Item_str_func(thd, a) {} }; /* Functions returning GEOMETRY measurements of a single GEOEMETRY argument */ class Item_geometry_func_args_geometry: public Item_geometry_func { protected: bool check_arguments() const override { DBUG_ASSERT(arg_count >= 1); return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]); } public: Item_geometry_func_args_geometry(THD *thd, Item *a) :Item_geometry_func(thd, a) {} Item_geometry_func_args_geometry(THD *thd, Item *a, Item *b) :Item_geometry_func(thd, a, b) {} }; /* Functions returning REAL result relationships between two GEOMETRY arguments */ class Item_real_func_args_geometry_geometry: public Item_real_func { protected: bool check_arguments() const override { DBUG_ASSERT(arg_count >= 2); return Type_handler_geometry::check_types_geom_or_binary(func_name_cstring(), args, 0, 2); } public: Item_real_func_args_geometry_geometry(THD *thd, Item *a, Item *b) :Item_real_func(thd, a, b) {} }; /* Functions returning BOOL result relationships between two GEOMETRY arguments */ class Item_bool_func_args_geometry_geometry: public Item_bool_func { protected: String value; bool check_arguments() const override { DBUG_ASSERT(arg_count >= 2); return Type_handler_geometry::check_types_geom_or_binary(func_name_cstring(), args, 0, 2); } public: Item_bool_func_args_geometry_geometry(THD *thd, Item *a, Item *b, Item *c) :Item_bool_func(thd, a, b, c) {} }; class Item_func_geometry_from_text: public Item_geometry_func { bool check_arguments() const override { return args[0]->check_type_general_purpose_string(func_name_cstring()) || check_argument_types_can_return_int(1, MY_MIN(2, arg_count)); } public: Item_func_geometry_from_text(THD *thd, Item *a): Item_geometry_func(thd, a) {} Item_func_geometry_from_text(THD *thd, Item *a, Item *srid): Item_geometry_func(thd, a, srid) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_geometryfromtext") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_geometry_from_text>(thd, this); } }; class Item_func_geometry_from_wkb: public Item_geometry_func { bool check_arguments() const override { return Type_handler_geometry::check_type_geom_or_binary(func_name_cstring(), args[0]) || check_argument_types_can_return_int(1, MY_MIN(2, arg_count)); } public: Item_func_geometry_from_wkb(THD *thd, Item *a): Item_geometry_func(thd, a) {} Item_func_geometry_from_wkb(THD *thd, Item *a, Item *srid): Item_geometry_func(thd, a, srid) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_geometryfromwkb") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_geometry_from_wkb>(thd, this); } }; class Item_func_geometry_from_json: public Item_geometry_func { String tmp_js; bool check_arguments() const override { // TODO: check with Alexey, for better args[1] and args[2] type control return args[0]->check_type_general_purpose_string(func_name_cstring()) || check_argument_types_traditional_scalar(1, MY_MIN(3, arg_count)); } public: Item_func_geometry_from_json(THD *thd, Item *js): Item_geometry_func(thd, js) {} Item_func_geometry_from_json(THD *thd, Item *js, Item *opt): Item_geometry_func(thd, js, opt) {} Item_func_geometry_from_json(THD *thd, Item *js, Item *opt, Item *srid): Item_geometry_func(thd, js, opt, srid) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_geomfromgeojson") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_geometry_from_json>(thd, this); } }; class Item_func_as_wkt: public Item_str_ascii_func_args_geometry { public: Item_func_as_wkt(THD *thd, Item *a) :Item_str_ascii_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_astext") }; return name; } String *val_str_ascii(String *) override; bool fix_length_and_dec() override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_as_wkt>(thd, this); } }; class Item_func_as_wkb: public Item_binary_func_args_geometry { public: Item_func_as_wkb(THD *thd, Item *a) :Item_binary_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_aswkb") }; return name; } String *val_str(String *) override; const Type_handler *type_handler() const override { return &type_handler_long_blob; } bool fix_length_and_dec() override { collation.set(&my_charset_bin); decimals=0; max_length= (uint32) UINT_MAX32; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_as_wkb>(thd, this); } }; class Item_func_as_geojson: public Item_str_ascii_func_args_geometry { bool check_arguments() const override { // TODO: check with Alexey, for better args[1] and args[2] type control return Item_str_ascii_func_args_geometry::check_arguments() || check_argument_types_traditional_scalar(1, MY_MIN(3, arg_count)); } public: Item_func_as_geojson(THD *thd, Item *js) :Item_str_ascii_func_args_geometry(thd, js) {} Item_func_as_geojson(THD *thd, Item *js, Item *max_dec_digits) :Item_str_ascii_func_args_geometry(thd, js, max_dec_digits) {} Item_func_as_geojson(THD *thd, Item *js, Item *max_dec_digits, Item *opt) :Item_str_ascii_func_args_geometry(thd, js, max_dec_digits, opt) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_asgeojson") }; return name; } bool fix_length_and_dec() override; String *val_str_ascii(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_as_geojson>(thd, this); } }; class Item_func_geometry_type: public Item_str_ascii_func_args_geometry { public: Item_func_geometry_type(THD *thd, Item *a) :Item_str_ascii_func_args_geometry(thd, a) {} String *val_str_ascii(String *) override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_geometrytype") }; return name; } bool fix_length_and_dec() override { // "GeometryCollection" is the longest fix_length_and_charset(20, default_charset()); set_maybe_null(); return FALSE; }; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_geometry_type>(thd, this); } }; // #define HEAVY_CONVEX_HULL class Item_func_convexhull: public Item_geometry_func_args_geometry { class ch_node: public Gcalc_dyn_list::Item { public: const Gcalc_heap::Info *pi; ch_node *prev; Gcalc_dyn_list::Item *next; ch_node *get_next() { return (ch_node *) next; } }; Gcalc_heap collector; Gcalc_function func; Gcalc_dyn_list res_heap; Gcalc_result_receiver res_receiver; String tmp_value; #ifdef HEAVY_CONVEX_HULL Gcalc_scan_iterator scan_it; #endif /*HEAVY_CONVEX_HULL*/ ch_node *new_ch_node() { return (ch_node *) res_heap.new_item(); } int add_node_to_line(ch_node **p_cur, int dir, const Gcalc_heap::Info *pi); public: Item_func_convexhull(THD *thd, Item *a) :Item_geometry_func_args_geometry(thd, a), res_heap(8192, sizeof(ch_node)) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_convexhull") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_convexhull>(thd, this); } }; class Item_func_centroid: public Item_geometry_func_args_geometry { public: Item_func_centroid(THD *thd, Item *a) :Item_geometry_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_centroid") }; return name; } String *val_str(String *) override; const Type_handler *type_handler() const override { return &type_handler_point; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_centroid>(thd, this); } }; class Item_func_envelope: public Item_geometry_func_args_geometry { public: Item_func_envelope(THD *thd, Item *a) :Item_geometry_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_envelope") }; return name; } String *val_str(String *) override; const Type_handler *type_handler() const override { return &type_handler_polygon; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_envelope>(thd, this); } }; class Item_func_boundary: public Item_geometry_func_args_geometry { class Transporter : public Gcalc_shape_transporter { Gcalc_result_receiver *m_receiver; uint n_points; Gcalc_function::shape_type current_type; double last_x, last_y; public: Transporter(Gcalc_result_receiver *receiver) : Gcalc_shape_transporter(NULL), m_receiver(receiver) {} int single_point(double x, double y) override; int start_line() override; int complete_line() override; int start_poly() override; int complete_poly() override; int start_ring() override; int complete_ring() override; int add_point(double x, double y) override; int start_collection(int n_objects) override; }; Gcalc_result_receiver res_receiver; public: Item_func_boundary(THD *thd, Item *a) :Item_geometry_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_boundary") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_boundary>(thd, this); } }; class Item_func_point: public Item_geometry_func { bool check_arguments() const override { return check_argument_types_can_return_real(0, 2); } public: Item_func_point(THD *thd, Item *a, Item *b): Item_geometry_func(thd, a, b) {} Item_func_point(THD *thd, Item *a, Item *b, Item *srid): Item_geometry_func(thd, a, b, srid) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("point") }; return name; } String *val_str(String *) override; const Type_handler *type_handler() const override { return &type_handler_point; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_point>(thd, this); } }; class Item_func_spatial_decomp: public Item_geometry_func_args_geometry { enum Functype decomp_func; public: Item_func_spatial_decomp(THD *thd, Item *a, Item_func::Functype ft): Item_geometry_func_args_geometry(thd, a) { decomp_func = ft; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING startpoint= {STRING_WITH_LEN("st_startpoint") }; static LEX_CSTRING endpoint= {STRING_WITH_LEN("st_endpoint") }; static LEX_CSTRING exteriorring= {STRING_WITH_LEN("st_exteriorring") }; static LEX_CSTRING unknown= {STRING_WITH_LEN("spatial_decomp_unknown") }; switch (decomp_func) { case SP_STARTPOINT: return startpoint; case SP_ENDPOINT: return endpoint; case SP_EXTERIORRING: return exteriorring; default: DBUG_ASSERT(0); // Should never happened return unknown; } } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_decomp>(thd, this); } }; class Item_func_spatial_decomp_n: public Item_geometry_func_args_geometry { enum Functype decomp_func_n; bool check_arguments() const override { return Item_geometry_func_args_geometry::check_arguments() || args[1]->check_type_can_return_int(func_name_cstring()); } public: Item_func_spatial_decomp_n(THD *thd, Item *a, Item *b, Item_func::Functype ft) :Item_geometry_func_args_geometry(thd, a, b), decomp_func_n(ft) { } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING pointn= {STRING_WITH_LEN("st_pointn") }; static LEX_CSTRING geometryn= {STRING_WITH_LEN("st_geometryn") }; static LEX_CSTRING interiorringn= {STRING_WITH_LEN("st_interiorringn") }; static LEX_CSTRING unknown= {STRING_WITH_LEN("spatial_decomp_unknown") }; switch (decomp_func_n) { case SP_POINTN: return pointn; case SP_GEOMETRYN: return geometryn; case SP_INTERIORRINGN: return interiorringn; default: DBUG_ASSERT(0); // Should never happened return unknown; } } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_decomp_n>(thd, this); } }; class Item_func_spatial_collection: public Item_geometry_func { bool check_arguments() const override { return Type_handler_geometry::check_types_geom_or_binary(func_name_cstring(), args, 0, arg_count); } enum Geometry::wkbType coll_type; enum Geometry::wkbType item_type; public: Item_func_spatial_collection(THD *thd, List<Item> &list, enum Geometry::wkbType ct, enum Geometry::wkbType it): Item_geometry_func(thd, list) { coll_type=ct; item_type=it; } String *val_str(String *) override; bool fix_length_and_dec() override { if (Item_geometry_func::fix_length_and_dec()) return TRUE; for (unsigned int i= 0; i < arg_count; ++i) { if (args[i]->fixed() && args[i]->field_type() != MYSQL_TYPE_GEOMETRY) { String str; args[i]->print(&str, QT_NO_DATA_EXPANSION); str.append('\0'); my_error(ER_ILLEGAL_VALUE_FOR_TYPE, MYF(0), "non geometric", str.ptr()); return TRUE; } } return FALSE; } }; class Item_func_geometrycollection: public Item_func_spatial_collection { public: Item_func_geometrycollection(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_geometrycollection, Geometry::wkb_point) { } const Type_handler *type_handler() const override { return &type_handler_geometrycollection; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("geometrycollection") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_geometrycollection>(thd, this); } }; class Item_func_linestring: public Item_func_spatial_collection { public: Item_func_linestring(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_linestring, Geometry::wkb_point) { } const Type_handler *type_handler() const override { return &type_handler_linestring; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("linestring") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_linestring>(thd, this); } }; class Item_func_polygon: public Item_func_spatial_collection { public: Item_func_polygon(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_polygon, Geometry::wkb_linestring) { } const Type_handler *type_handler() const override { return &type_handler_polygon; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("polygon") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_polygon>(thd, this); } }; class Item_func_multilinestring: public Item_func_spatial_collection { public: Item_func_multilinestring(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_multilinestring, Geometry::wkb_linestring) { } const Type_handler *type_handler() const override { return &type_handler_multilinestring; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("multilinestring") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_multilinestring>(thd, this); } }; class Item_func_multipoint: public Item_func_spatial_collection { public: Item_func_multipoint(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_multipoint, Geometry::wkb_point) { } const Type_handler *type_handler() const override { return &type_handler_multipoint; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("multipoint") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_multipoint>(thd, this); } }; class Item_func_multipolygon: public Item_func_spatial_collection { public: Item_func_multipolygon(THD *thd, List<Item> &list) :Item_func_spatial_collection(thd, list, Geometry::wkb_multipolygon, Geometry::wkb_polygon) { } const Type_handler *type_handler() const override { return &type_handler_multipolygon; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("multipolygon") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_multipolygon>(thd, this); } }; /* Spatial relations */ class Item_func_spatial_rel: public Item_bool_func2_with_rev { protected: enum Functype spatial_rel; String tmp_value1, tmp_value2; SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *param, Field *field, KEY_PART *key_part, Item_func::Functype type, Item *value) override; bool check_arguments() const override { DBUG_ASSERT(arg_count >= 2); return Type_handler_geometry::check_types_geom_or_binary(func_name_cstring(), args, 0, 2); } public: Item_func_spatial_rel(THD *thd, Item *a, Item *b, enum Functype sp_rel): Item_bool_func2_with_rev(thd, a, b), spatial_rel(sp_rel) { set_maybe_null(); } enum Functype functype() const override { return spatial_rel; } enum Functype rev_functype() const override { switch (spatial_rel) { case SP_CONTAINS_FUNC: return SP_WITHIN_FUNC; case SP_WITHIN_FUNC: return SP_CONTAINS_FUNC; default: return spatial_rel; } } bool is_null() override { (void) val_int(); return null_value; } void add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level, table_map usable_tables, SARGABLE_PARAM **sargables) override { return add_key_fields_optimize_op(join, key_fields, and_level, usable_tables, sargables, false); } bool need_parentheses_in_default() override { return false; } Item *do_build_clone(THD *thd) const override { return nullptr; } }; class Item_func_spatial_mbr_rel: public Item_func_spatial_rel { public: Item_func_spatial_mbr_rel(THD *thd, Item *a, Item *b, enum Functype sp_rel): Item_func_spatial_rel(thd, a, b, sp_rel) { } bool val_bool() override; LEX_CSTRING func_name_cstring() const override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_mbr_rel>(thd, this); } }; class Item_func_spatial_precise_rel: public Item_func_spatial_rel { Gcalc_heap collector; Gcalc_scan_iterator scan_it; Gcalc_function func; public: Item_func_spatial_precise_rel(THD *thd, Item *a, Item *b, enum Functype sp_rel): Item_func_spatial_rel(thd, a, b, sp_rel), collector() { } bool val_bool() override; LEX_CSTRING func_name_cstring() const override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_precise_rel>(thd, this); } }; class Item_func_spatial_relate: public Item_bool_func_args_geometry_geometry { Gcalc_heap collector; Gcalc_scan_iterator scan_it; Gcalc_function func; String tmp_value1, tmp_value2, tmp_matrix; bool check_arguments() const override { return Item_bool_func_args_geometry_geometry::check_arguments() || args[2]->check_type_general_purpose_string(func_name_cstring()); } public: Item_func_spatial_relate(THD *thd, Item *a, Item *b, Item *matrix): Item_bool_func_args_geometry_geometry(thd, a, b, matrix) { } bool val_bool() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_relate") }; return name; } bool need_parentheses_in_default() override { return false; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_relate>(thd, this); } }; /* Spatial operations */ class Item_func_spatial_operation final: public Item_geometry_func { bool check_arguments() const override { DBUG_ASSERT(arg_count >= 2); return Type_handler_geometry::check_types_geom_or_binary(func_name_cstring(), args, 0, 2); } public: Gcalc_function::op_type spatial_op; Gcalc_heap collector; Gcalc_function func; Gcalc_result_receiver res_receiver; Gcalc_operation_reducer operation; String tmp_value1,tmp_value2; public: Item_func_spatial_operation(THD *thd, Item *a,Item *b, Gcalc_function::op_type sp_op): Item_geometry_func(thd, a, b), spatial_op(sp_op) {} virtual ~Item_func_spatial_operation(); String *val_str(String *) override; LEX_CSTRING func_name_cstring() const override; void print(String *str, enum_query_type query_type) override { Item_func::print(str, query_type); } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_spatial_operation>(thd, this); } }; class Item_func_buffer final : public Item_geometry_func_args_geometry { bool check_arguments() const override { return Item_geometry_func_args_geometry::check_arguments() || args[1]->check_type_can_return_real(func_name_cstring()); } protected: class Transporter : public Gcalc_operation_transporter { int m_npoints; double m_d; double x1,y1,x2,y2; double x00,y00,x01,y01; int add_edge_buffer(double x3, double y3, bool round_p1, bool round_p2); int add_last_edge_buffer(); int add_point_buffer(double x, double y); int complete(); int m_nshapes; Gcalc_function::op_type buffer_op; int last_shape_pos; bool skip_line; public: Transporter(Gcalc_function *fn, Gcalc_heap *heap, double d) : Gcalc_operation_transporter(fn, heap), m_npoints(0), m_d(d), m_nshapes(0), buffer_op((d > 0.0) ? Gcalc_function::op_union : Gcalc_function::op_difference), skip_line(FALSE) {} int single_point(double x, double y) override; int start_line() override; int complete_line() override; int start_poly() override; int complete_poly() override; int start_ring() override; int complete_ring() override; int add_point(double x, double y) override; int start_collection(int n_objects) override; }; Gcalc_heap collector; Gcalc_function func; Gcalc_result_receiver res_receiver; Gcalc_operation_reducer operation; public: Item_func_buffer(THD *thd, Item *obj, Item *distance) :Item_geometry_func_args_geometry(thd, obj, distance) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_buffer") }; return name; } String *val_str(String *) override; Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_buffer>(thd, this); } }; class Item_func_isempty: public Item_bool_func_args_geometry { public: Item_func_isempty(THD *thd, Item *a) :Item_bool_func_args_geometry(thd, a) {} bool val_bool() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_isempty") }; return name; } bool fix_length_and_dec() override { set_maybe_null(); return FALSE; } bool need_parentheses_in_default() override { return false; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_isempty>(thd, this); } }; class Item_func_issimple: public Item_long_func_args_geometry { Gcalc_heap collector; Gcalc_function func; Gcalc_scan_iterator scan_it; String tmp; public: Item_func_issimple(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_issimple") }; return name; } bool fix_length_and_dec() override { decimals=0; max_length=2; return FALSE; } decimal_digits_t decimal_precision() const override { return 1; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_issimple>(thd, this); } }; class Item_func_isclosed: public Item_long_func_args_geometry { public: Item_func_isclosed(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_isclosed") }; return name; } bool fix_length_and_dec() override { decimals=0; max_length=2; return FALSE; } decimal_digits_t decimal_precision() const override { return 1; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_isclosed>(thd, this); } }; class Item_func_isring: public Item_func_issimple { public: Item_func_isring(THD *thd, Item *a): Item_func_issimple(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_isring") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_isring>(thd, this); } }; class Item_func_dimension: public Item_long_func_args_geometry { public: Item_func_dimension(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_dimension") }; return name; } bool fix_length_and_dec() override { max_length= 10; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_dimension>(thd, this); } }; class Item_func_x: public Item_real_func_args_geometry { public: Item_func_x(THD *thd, Item *a): Item_real_func_args_geometry(thd, a) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_x") }; return name; } bool fix_length_and_dec() override { if (Item_real_func::fix_length_and_dec()) return TRUE; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_x>(thd, this); } }; class Item_func_y: public Item_real_func_args_geometry { public: Item_func_y(THD *thd, Item *a): Item_real_func_args_geometry(thd, a) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_y") }; return name; } bool fix_length_and_dec() override { if (Item_real_func::fix_length_and_dec()) return TRUE; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_y>(thd, this); } }; class Item_func_numgeometries: public Item_long_func_args_geometry { public: Item_func_numgeometries(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_numgeometries") }; return name; } bool fix_length_and_dec() override { max_length= 10; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_numgeometries>(thd, this); } }; class Item_func_numinteriorring: public Item_long_func_args_geometry { public: Item_func_numinteriorring(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_numinteriorrings") }; return name; } bool fix_length_and_dec() override { max_length= 10; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_numinteriorring>(thd, this); } }; class Item_func_numpoints: public Item_long_func_args_geometry { public: Item_func_numpoints(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_numpoints") }; return name; } bool fix_length_and_dec() override { max_length= 10; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_numpoints>(thd, this); } }; class Item_func_area: public Item_real_func_args_geometry { public: Item_func_area(THD *thd, Item *a): Item_real_func_args_geometry(thd, a) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_area") }; return name; } bool fix_length_and_dec() override { if (Item_real_func::fix_length_and_dec()) return TRUE; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_area>(thd, this); } }; class Item_func_glength: public Item_real_func_args_geometry { String value; public: Item_func_glength(THD *thd, Item *a) :Item_real_func_args_geometry(thd, a) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_length") }; return name; } bool fix_length_and_dec() override { if (Item_real_func::fix_length_and_dec()) return TRUE; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_glength>(thd, this); } }; class Item_func_srid: public Item_long_func_args_geometry { public: Item_func_srid(THD *thd, Item *a) :Item_long_func_args_geometry(thd, a) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("srid") }; return name; } bool fix_length_and_dec() override { max_length= 10; set_maybe_null(); return FALSE; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_srid>(thd, this); } }; class Item_func_distance: public Item_real_func_args_geometry_geometry { String tmp_value1; String tmp_value2; Gcalc_heap collector; Gcalc_function func; Gcalc_scan_iterator scan_it; public: Item_func_distance(THD *thd, Item *a, Item *b) :Item_real_func_args_geometry_geometry(thd, a, b) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_distance") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_distance>(thd, this); } }; class Item_func_sphere_distance: public Item_real_func { double spherical_distance_points(Geometry *g1, Geometry *g2, const double sphere_r); public: Item_func_sphere_distance(THD *thd, List<Item> &list): Item_real_func(thd, list) {} double val_real() override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_distance_sphere") }; return name; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_sphere_distance>(thd, this); } }; class Item_func_pointonsurface: public Item_geometry_func_args_geometry { String tmp_value; Gcalc_heap collector; Gcalc_function func; Gcalc_scan_iterator scan_it; public: Item_func_pointonsurface(THD *thd, Item *a) :Item_geometry_func_args_geometry(thd, a) {} LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_pointonsurface") }; return name; } String *val_str(String *) override; const Type_handler *type_handler() const override { return &type_handler_point; } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_pointonsurface>(thd, this); } }; #ifndef DBUG_OFF class Item_func_gis_debug: public Item_long_func { public: Item_func_gis_debug(THD *thd, Item *a): Item_long_func(thd, a) { null_value= false; } bool fix_length_and_dec() override { fix_char_length(10); return FALSE; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("st_gis_debug") }; return name; } longlong val_int() override; bool check_vcol_func_processor(void *arg) override { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } Item *do_get_copy(THD *thd) const override { return get_item_copy<Item_func_gis_debug>(thd, this); } }; #endif #define GEOM_NEW(thd, obj_constructor) new (thd->mem_root) obj_constructor #define GEOM_TYPE(x) (x) #else /*HAVE_SPATIAL*/ #define GEOM_NEW(thd, obj_constructor) NULL #define GEOM_TYPE(x) NULL #endif /*HAVE_SPATIAL*/ #endif /* ITEM_GEOFUNC_INCLUDED */
SIMPAN PERUBAHAN