oqgraph-dev team mailing list archive
-
oqgraph-dev team
-
Mailing list archive
-
Message #00129
Re: Lets get this moving again - recap, and what to do about integer latches
Personally, I believe that it would be simply better for the ::create
method to validate the table structure and for ::open to check and alter
behaviour accordingly. So, if the latch column is declared as an integer
column, handle it as such. If it is an enum, check that it makes sense
otherwise if it's a varchar, do the string to type manual mapping.
Just my 2¢
Antony
On Apr 28, 2013 2:54 AM, "Andrew McDonnell" <bugs@xxxxxxxxxxxxxxxxxxx>
wrote:
> Hiya
>
> sorry its been a while
>
> Recap:
> - I have a branch up on LP with my changes to support the string-based
> latch
> - it also interprets numeric values passed to the latch to support
> backwards compatibility
> - however if the numeric latch is specified as a number instead of a
> string (e.g. select ... where latch=3 vs. select ... where latch='3' )
> it fails
>
> In recent conversation with Arjen:
> >> Although there was some discussion around what to do
> >> about legacy instances because of the problem with numeric autocast?
> >
> > Is it that the server doesn't use the correct (indexed) access method
> because of the cast?
> > Show me a trace (do use the oqgraph-dev list)
> > If that is the case, then perhaps returning an error if a numeric latch
> is seen might be the solution.
>
>
> Following is a big dump of test and trace, you probably wont have enough
> context so I am bracing for clarifying questions :-)
>
> But basically I dont yet have enough understanding of storage engine guts
> to know how to hook a query before the query optimiser bypasses us
>
>
> I think the more important question, is how to handle (not) breaking
> existing deployments.
>
>
>
> After all, new databases can just be forced to use the new syntax.
>
>
> But if any existing db is upgraded, our code will need to properly handle
> the legacy form on upgrade....
>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>
>
>
>
> To repeat the issue on my branch:
>
> DROP TABLE IF EXISTS graph;
> DROP TABLE IF EXISTS graph_base;
> DROP TABLE IF EXISTS graph2;
>
> CREATE TABLE graph_base (
> from_id INT UNSIGNED NOT NULL,
> to_id INT UNSIGNED NOT NULL,
> PRIMARY KEY (from_id,to_id),
> INDEX (to_id)
> ) ENGINE=MyISAM;
>
> CREATE TABLE graph2 (
> latch VARCHAR(32) NULL,
> origid BIGINT UNSIGNED NULL,
> destid BIGINT UNSIGNED NULL,
> weight DOUBLE NULL,
> seq BIGINT UNSIGNED NULL,
> linkid BIGINT UNSIGNED NULL,
> KEY (latch, origid, destid) USING HASH,
> KEY (latch, destid, origid) USING HASH
> ) ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id',
> DESTID='to_id';
>
> INSERT INTO graph_base(from_id, to_id) VALUES (1,2), (2,1);
> INSERT INTO graph_base(from_id, to_id) VALUES (1,3), (3,1);
> INSERT INTO graph_base(from_id, to_id) VALUES (3,4), (4,3);
> INSERT INTO graph_base(from_id, to_id) VALUES (5,6), (6,5);
>
> -- expected:
> -- +-------+--------+--------+--------+------+--------+
> -- | latch | origid | destid | weight | seq | linkid |
> -- +-------+--------+--------+--------+------+--------+
> -- | 2 | 1 | NULL | 1 | 3 | 3 |
> -- | 2 | 1 | NULL | 1 | 2 | 2 |
> -- +-------+--------+--------+--------+------+--------+
> -- reset query cache ; flush query cache;
>
> SELECT * FROM graph2 WHERE latch = 'breadth_first' AND origid = 1 AND
> weight = 1; -- works
> SELECT * FROM graph2 WHERE latch = '2' AND origid = 1 AND weight = 1;
> -- as above
> SELECT * FROM graph2 WHERE latch = 2 AND origid = 1 AND weight = 1;
> -- currently, FAILs - returns empty set should be as above
>
>
>
> I have a pile of debug output in ha_oqgraph, it can be turned on using
> mysqld <...> -#d,oq-debug
> I build with:
> cmake -DENABLE_ASSEMBLER=1 -DWITH_EXTRA_CHARSETS=complex
> -DENABLE_THREAD_SAFE_CLIENT=1 -DWITH_BIG_TABLES=1 -DWITH_PLUGIN_ARIA=1
> -DWITH_ARIA_TMP_TABLES=1 -DWITH_READLINE=1 -DCMAKE_BUILD_TYPE=Debug
> -DWITH_SSL=bundled -DWITH_MAX=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_LIBEVENT=1
> -DENABLE_LOCAL_INFILE=1
>
> Log with string select:
>
> THD::decide_logging_format: info: query: SELECT * FROM graph2 WHERE latch
> = '2' AND origid = 1 AND weight = 1
> THD::decide_logging_format: info: variables.binlog_format: 1
> THD::decide_logging_format: info: lex->get_stmt_unsafe_flags(): 0x0
> THD::decide_logging_format: info: decision: no logging since
> mysql_bin_log.is_open() = 0 and (options & OPTION_BIN_LOG) = 0x40000 and
> binlog_format = 1 and binlog_filter->db_ok(db) = 1
> Field_iterator_table_ref::set_field_iterator: info: field_it for 'graph2'
> is Field_iterator_table
> my_malloc: info: memory_used: 32696 size: 8152
> setup_fields: info: thd->mark_used_columns: 1
> setup_fields: info: thd->mark_used_columns: 1
> setup_conds: info: thd->mark_used_columns: 1
>
> WHERE:(after remove) 0x2c59ab8 ((`test`.`graph2`.`weight` = 1) and
> multiple equal('2', `test`.`graph2`.`latch`) and multiple equal(1,
> `test`.`graph2`.`origid`))
> my_malloc: info: memory_used: 40848 size: 1600
> SQL_SELECT::test_quick_select: info: records: 8
> SQL_SELECT::test_quick_select: info: Time to scan table: 1e9
> my_malloc: info: memory_used: 42448 size: 4056
> print_sel_tree: info: SEL_TREE: 0x2c8cb00 (tree scans) scans:
> latch,latch_2
> check_quick_select: oq-debug: records_in_range ::>> inx=0
> check_quick_select: oq-debug: records_in_range ::>> key0=2.
> check_quick_select: oq-debug: records_in_range ::>> N=10
> check_quick_select: oq-debug: records_in_range ::>> inx=1
> check_quick_select: oq-debug: records_in_range ::>> key0=2.
> print_sel_tree: info: SEL_TREE: 0x2c8cb00 (ROR scans) scans: (empty)
> get_key_scans_params: info: Returning range plan for key latch, cost 3.01,
> records 10
> SQL_SELECT::test_quick_select: info: No range reads possible, trying to
> construct index_merge
> my_malloc: info: memory_used: 46504 size: 128
> my_malloc: info: memory_used: 46632 size: 8
> my_malloc: info: memory_used: 46640 size: 4056
> my_free: info: memory_used: 50696 size: -4056
> quick range select, key latch, length: 44
> 2/1 <= X <= 2/1
> other_keys: 0x0:
> best_access_path: info: Considering ref access on key latch
> best_access_path: info: Considering ref access on key latch_2
> get_best_combination: info: type: 4
> my_malloc: info: memory_used: 46640 size: 8152
> make_join_select: info: select_cond changes 0x0 -> 0x2c8bc70 at line 8835
> tab 0x2c8b308
>
> Info about JOIN
> graph2 type: ALL q_keys: 3 refs: 0 key: -1 len: 0
> quick select used:
> quick range select, key latch, length: 44
>
> JOIN::exec: info: Sending data
> init_read_record: info: using rr_quick
> handler::read_range_first: oq-debug: index_read_idx ::>>
> search(latch:breadth_first,1,-1)
> handler::read_range_first: oq-debug: search() = 0
> handler::read_range_first: oq-debug: fill_record() ::>>
> breadth_first,1,-1,2.000000,4,4
> handler::multi_range_read_next: oq-debug: fill_record() ::>>
> breadth_first,1,-1,1.000000,3,3
> handler::multi_range_read_next: oq-debug: fill_record() ::>>
> breadth_first,1,-1,1.000000,2,2
> handler::multi_range_read_next: oq-debug: fill_record() ::>>
> breadth_first,1,-1,0.000000,1,1
> my_free: info: memory_used: 54792 size: -128
> my_free: info: memory_used: 54664 size: -4056
> my_free: info: memory_used: 50608 size: -8
> mi_update_status: info: updating status: key_file: 3072 data_file: 72
> rows: 8
> mi_update_status: info: invalidator... './test/graph_base' (status update)
> mi_lock_database: info: changed: 0 w_locks: 0
> do_select: info: 2 records output
> my_free: info: memory_used: 50600 size: -1600
> handle_select: info: res: 0 report_error: 0
> close_thread_tables: info: thd->open_tables: 0x2c84b00
> MDL_context::release_locks_stored_before: info: found lock to release
> ticket=0x2b205c0
> dispatch_command: info: query ready
> net_send_eof: info: EOF sent, so no more error sending allowed
> my_free: info: memory_used: 49000 size: -8152
> my_free: info: memory_used: 40848 size: -8152
> do_command: info: Command on socket (35) = 3 (Query)
> dispatch_command: info: command: 3
> st_select_lex::add_item_to_list: info: Item: 0x2c58d58
> mysql_execute_command: info: derived: 0 view: 0
> column_bitmaps_signal: info: read_set: 0x2c84c10 write_set: 0x2c84c30
> get_lock_data: info: count 1
> get_lock_data: info: sql_lock->table_count 1 sql_lock->lock_count 1
> lock_external: info: count 1
> mi_get_status: info: name: ./test/graph_base.MYI key_file: 3072
> data_file: 72 rows: 8 concurrent_insert: 0
>
>
> Log with number:
>
>
>
> THD::decide_logging_format: info: query: SELECT * FROM graph2 WHERE latch
> = 2 AND origid = 1 AND weight = 1
> THD::decide_logging_format: info: variables.binlog_format: 1
> THD::decide_logging_format: info: lex->get_stmt_unsafe_flags(): 0x0
> THD::decide_logging_format: info: decision: no logging since
> mysql_bin_log.is_open() = 0 and (options & OPTION_BIN_LOG) = 0x40000 and
> binlog_format = 1 and binlog_filter->db_ok(db) = 1
> Field_iterator_table_ref::set_field_iterator: info: field_it for 'graph2'
> is Field_iterator_table
> my_malloc: info: memory_used: 32696 size: 8152
> setup_fields: info: thd->mark_used_columns: 1
> setup_fields: info: thd->mark_used_columns: 1
> setup_conds: info: thd->mark_used_columns: 1
>
> WHERE:(after remove) 0x2c59ab0 ((`test`.`graph2`.`latch` = 2) and
> (`test`.`graph2`.`weight` = 1) and multiple equal(1,
> `test`.`graph2`.`origid`))
> my_malloc: info: memory_used: 40848 size: 1600
> SQL_SELECT::test_quick_select: info: records: 8
> SQL_SELECT::test_quick_select: info: Time to scan table: 1e9
> my_malloc: info: memory_used: 42448 size: 4056
> print_sel_tree: info: SEL_TREE: 0x2c8cd08 (tree scans) scans: (empty)
> print_sel_tree: info: SEL_TREE: 0x2c8cd08 (ROR scans) scans: (empty)
> get_key_scans_params: info: No 'range' table read plan found
> SQL_SELECT::test_quick_select: info: No range reads possible, trying to
> construct index_merge
> my_free: info: memory_used: 46504 size: -4056
> get_best_combination: info: type: 0
> make_join_select: info: select_cond changes 0x0 -> 0x2c8b898 at line 8835
> tab 0x2c8b0b8
>
> Info about JOIN
> graph2 type: ALL q_keys: 3 refs: 0 key: -1 len: 0
> select used
>
> JOIN::exec: info: Sending data
> init_read_record: info: using rr_sequential
> init_io_cache: info: init_io_cache: cachesize = 16384
> sub_select: oq-debug: fill_record() ::>> -,1,2,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,2,1,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,1,3,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,3,1,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,3,4,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,4,3,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,5,6,1.000000,-1,-1
> sub_select: oq-debug: fill_record() ::>> -,6,5,1.000000,-1,-1
> mi_update_status: info: updating status: key_file: 3072 data_file: 72
> rows: 8
> mi_update_status: info: invalidator... './test/graph_base' (status update)
> mi_lock_database: info: changed: 0 w_locks: 0
> do_select: info: 0 records output
> my_free: info: memory_used: 42448 size: -1600
> handle_select: info: res: 0 report_error: 0
> close_thread_tables: info: thd->open_tables: 0x2c84b00
> MDL_context::release_locks_stored_before: info: found lock to release
> ticket=0x2b5ad50
> dispatch_command: info: query ready
> net_send_eof: info: EOF sent, so no more error sending allowed
> my_free: info: memory_used: 40848 size: -8152
> my_service_thread_sleep: info: sleeping 30000000000 nano seconds
>
> --
> Mailing list: https://launchpad.net/~oqgraph-dev
> Post to : oqgraph-dev@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~oqgraph-dev
> More help : https://help.launchpad.net/ListHelp
>
Follow ups
References