|  | 
|  | 1 | +--source include/big_test.inc | 
|  | 2 | +--source include/have_debug.inc | 
|  | 3 | +# Actually this test is tailored for 4k, | 
|  | 4 | +# but it should pass for other sizes (8k, 16k) as well. | 
|  | 5 | +--source include/have_innodb_max_16k.inc | 
|  | 6 | + | 
|  | 7 | +SET GLOBAL innodb_compression_level = 0; | 
|  | 8 | +CREATE TABLE t1 (j1 JSON) ENGINE=InnoDB ROW_FORMAT=compressed; | 
|  | 9 | +SHOW CREATE TABLE t1; | 
|  | 10 | +# Must be long enough to force external storage. | 
|  | 11 | +# Also the length must be so that json_doc last "page" of last stream | 
|  | 12 | +# is short enough to fit on fragment page. | 
|  | 13 | +# I've used trial end error with `--manual-debug --initialize=--innodb-page-size=4k` | 
|  | 14 | +# with conditional breakpoint inside z_insert_strm() for condition remain < size | 
|  | 15 | +# to see what is the remaining size in last iteration, and then picking a lob size | 
|  | 16 | +# such that the `remain` is smaller than 1991/4 which is a criterion used to decide | 
|  | 17 | +# if we should use a fragment page. | 
|  | 18 | +# This particular value (when run with --initialize=--innodb-page-size=4k) stores the | 
|  | 19 | +# [1]-th element of JSON array in a fragment page. | 
|  | 20 | +SET @long_str = REPEAT('abcdefghijklmnopqrstuvwxyz1234', 59921); | 
|  | 21 | +# must be long enough to force new version (as opposed to storing diff in the undo log), | 
|  | 22 | +# but must be short enough to not cause complete rewrite of the blob | 
|  | 23 | +SET @medium_str_1 = REPEAT('a', 200); | 
|  | 24 | +SET @medium_str_2 = REPEAT('b', 200); | 
|  | 25 | +SET @json_doc = CONCAT('["', @long_str, '","', @medium_str_1 ,'" ]'); | 
|  | 26 | + | 
|  | 27 | +BEGIN; | 
|  | 28 | +INSERT INTO t1 (j1) VALUES (@json_doc); | 
|  | 29 | + | 
|  | 30 | +SELECT JSON_EXTRACT(j1, '$[1]') FROM t1; | 
|  | 31 | +# We need to generate enough fragments so that the index of fragments | 
|  | 32 | +# overflows first page and needs to allocate z_frag_node_page_t page. | 
|  | 33 | +--let i=0 | 
|  | 34 | +while($i<50){ | 
|  | 35 | +      UPDATE t1 SET j1 = JSON_REPLACE(j1, '$[1]', @medium_str_2); | 
|  | 36 | +      SELECT JSON_EXTRACT(j1, '$[1]') FROM t1; | 
|  | 37 | +      UPDATE t1 SET j1 = JSON_REPLACE(j1, '$[1]', @medium_str_1); | 
|  | 38 | +      SELECT JSON_EXTRACT(j1, '$[1]') FROM t1; | 
|  | 39 | +      --inc $i | 
|  | 40 | +} | 
|  | 41 | +ROLLBACK; | 
|  | 42 | + | 
|  | 43 | +DROP TABLE t1; | 
|  | 44 | +SET GLOBAL innodb_compression_level = default; | 
0 commit comments