diff --git a/EXCEPTIONS-CLIENT b/EXCEPTIONS-CLIENT index 19b86cab32b..c570ff7ba24 100644 --- a/EXCEPTIONS-CLIENT +++ b/EXCEPTIONS-CLIENT @@ -4,7 +4,7 @@ The MySQL AB Exception for Free/Libre and Open Source Software-only Applications Using MySQL Client Libraries (the "FLOSS Exception"). -Version 0.5, 30 August 2006 +Version 0.6, 7 March 2007 Exception Intent @@ -59,10 +59,12 @@ Apache Software License 1.0/1.1/2.0 Apple Public Source License 2.0 Artistic license From Perl 5.8.0 BSD license "July 22 1999" +Common Development and Distribution License (CDDL) 1.0 Common Public License 1.0 +Eclipse Public License 1.0 GNU Library or "Lesser" General Public License (LGPL) 2.0/2.1 Jabber Open Source License 1.0 -MIT license --- +MIT license (As listed in file MIT-License.txt) --- Mozilla Public License (MPL) 1.0/1.1 Open Software License 2.0 OpenSSL license (with original SSLeay license) "2003" ("1998") diff --git a/VC++Files/mysys/mysys.dsp b/VC++Files/mysys/mysys.dsp index 0f1b4bd5d54..a920a0bd967 100644 --- a/VC++Files/mysys/mysys.dsp +++ b/VC++Files/mysys/mysys.dsp @@ -557,10 +557,6 @@ SOURCE=.\my_windac.c # End Source File # Begin Source File -SOURCE=.\my_winsem.c -# End Source File -# Begin Source File - SOURCE=.\my_winthread.c # End Source File # Begin Source File diff --git a/VC++Files/mysys/mysys.vcproj b/VC++Files/mysys/mysys.vcproj index 87100ce8e5e..73aa649394e 100644 --- a/VC++Files/mysys/mysys.vcproj +++ b/VC++Files/mysys/mysys.vcproj @@ -4323,49 +4323,6 @@ PreprocessorDefinitions=""/> - - - - - - - - - - - - - - - - - -#elif !defined(__bsdi__) -#ifdef __WIN__ -typedef HANDLE sem_t; -#else -typedef struct { - pthread_mutex_t mutex; - pthread_cond_t cond; - uint count; -} sem_t; -#endif /* __WIN__ */ - -int sem_init(sem_t * sem, int pshared, unsigned int value); -int sem_destroy(sem_t * sem); -int sem_trywait(sem_t * sem); -int sem_wait(sem_t * sem); -int sem_post(sem_t * sem); -int sem_post_multiple(sem_t * sem, unsigned int count); -int sem_getvalue(sem_t * sem, unsigned int * sval); - -#endif /* !__bsdi__ */ - -C_MODE_END - -#endif /* THREAD */ - -#endif /* !_my_semaphore_h_ */ diff --git a/myisam/mi_create.c b/myisam/mi_create.c index d46672444e0..ea1d8c7b83e 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -157,6 +157,10 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, rec--; if (rec->type == (int) FIELD_SKIP_ZERO && rec->length == 1) { + /* + NOTE1: here we change a field type FIELD_SKIP_ZERO -> + FIELD_NORMAL + */ rec->type=(int) FIELD_NORMAL; packed--; min_pack_length++; diff --git a/myisam/mi_open.c b/myisam/mi_open.c index f7edaf34494..274933679ef 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -1199,7 +1199,7 @@ int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, File file_to_dup __attr int mi_open_keyfile(MYISAM_SHARE *share) { if ((share->kfile=my_open(share->unique_file_name, share->mode | O_SHARE, - MYF(MY_WME))) < 0) + MYF(MY_WME))) < 0) return 1; return 0; } diff --git a/myisam/rt_index.c b/myisam/rt_index.c index edb33ec10b9..cf144839dd1 100644 --- a/myisam/rt_index.c +++ b/myisam/rt_index.c @@ -184,6 +184,7 @@ int rtree_find_first(MI_INFO *info, uint keynr, uchar *key, uint key_length, /* Save searched key, include data pointer. The data pointer is required if the search_flag contains MBR_DATA. + (minimum bounding rectangle) */ memcpy(info->first_mbr_key, key, keyinfo->keylength); info->last_rkey_length = key_length; @@ -538,16 +539,19 @@ static int rtree_insert_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, uint nod_flag; uchar *page_buf; int res; + DBUG_ENTER("rtree_insert_req"); if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length + MI_MAX_KEY_BUFF))) { my_errno = HA_ERR_OUT_OF_MEM; - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } if (!_mi_fetch_keypage(info, keyinfo, page, DFLT_INIT_HITS, page_buf, 0)) goto err1; nod_flag = mi_test_if_nod(page_buf); + DBUG_PRINT("rtree", ("page: %lu level: %d ins_level: %d nod_flag: %u", + (ulong) page, level, ins_level, nod_flag)); if ((ins_level == -1 && nod_flag) || /* key: go down to leaf */ (ins_level > -1 && ins_level > level)) /* branch: go down to ins_level */ @@ -599,11 +603,11 @@ static int rtree_insert_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, ok: my_afree((byte*)page_buf); - return res; + DBUG_RETURN(res); err1: my_afree((byte*)page_buf); - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } @@ -623,18 +627,19 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key, MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; int res; my_off_t new_page; - + DBUG_ENTER("rtree_insert_level"); + if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) { if ((old_root = _mi_new(info, keyinfo, DFLT_INIT_HITS)) == HA_OFFSET_ERROR) - return -1; + DBUG_RETURN(-1); info->buff_used = 1; mi_putint(info->buff, 2, 0); res = rtree_add_key(info, keyinfo, key, key_length, info->buff, NULL); if (_mi_write_keypage(info, keyinfo, old_root, DFLT_INIT_HITS, info->buff)) - return 1; + DBUG_RETURN(1); info->s->state.key_root[keynr] = old_root; - return res; + DBUG_RETURN(res); } switch ((res = rtree_insert_req(info, keyinfo, key, key_length, @@ -651,11 +656,12 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key, uchar *new_key; uint nod_flag = info->s->base.key_reflength; + DBUG_PRINT("rtree", ("root was split, grow a new root")); if (!(new_root_buf = (uchar*)my_alloca((uint)keyinfo->block_length + MI_MAX_KEY_BUFF))) { my_errno = HA_ERR_OUT_OF_MEM; - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } mi_putint(new_root_buf, 2, nod_flag); @@ -681,12 +687,14 @@ static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key, DFLT_INIT_HITS, new_root_buf)) goto err1; info->s->state.key_root[keynr] = new_root; + DBUG_PRINT("rtree", ("new root page: %lu level: %d nod_flag: %u", + (ulong) new_root, 0, mi_test_if_nod(new_root_buf))); my_afree((byte*)new_root_buf); break; err1: my_afree((byte*)new_root_buf); - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } default: case -1: /* error */ @@ -694,7 +702,7 @@ err1: break; } } - return res; + DBUG_RETURN(res); } @@ -708,8 +716,10 @@ err1: int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length) { - return (!key_length || - (rtree_insert_level(info, keynr, key, key_length, -1) == -1)) ? -1 : 0; + DBUG_ENTER("rtree_insert"); + DBUG_RETURN((!key_length || + (rtree_insert_level(info, keynr, key, key_length, -1) == -1)) ? + -1 : 0); } @@ -724,6 +734,8 @@ int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length) static int rtree_fill_reinsert_list(stPageList *ReinsertList, my_off_t page, int level) { + DBUG_ENTER("rtree_fill_reinsert_list"); + DBUG_PRINT("rtree", ("page: %lu level: %d", (ulong) page, level)); if (ReinsertList->n_pages == ReinsertList->m_pages) { ReinsertList->m_pages += REINSERT_BUFFER_INC; @@ -735,10 +747,10 @@ static int rtree_fill_reinsert_list(stPageList *ReinsertList, my_off_t page, ReinsertList->pages[ReinsertList->n_pages].offs = page; ReinsertList->pages[ReinsertList->n_pages].level = level; ReinsertList->n_pages++; - return 0; + DBUG_RETURN(0); err1: - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } @@ -762,15 +774,18 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, uint nod_flag; uchar *page_buf; int res; + DBUG_ENTER("rtree_delete_req"); if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) { my_errno = HA_ERR_OUT_OF_MEM; - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } if (!_mi_fetch_keypage(info, keyinfo, page, DFLT_INIT_HITS, page_buf, 0)) goto err1; nod_flag = mi_test_if_nod(page_buf); + DBUG_PRINT("rtree", ("page: %lu level: %d nod_flag: %u", + (ulong) page, level, nod_flag)); k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); last = rt_PAGE_END(page_buf); @@ -791,6 +806,7 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, if (*page_size + key_length >= rt_PAGE_MIN_SIZE(keyinfo->block_length)) { /* OK */ + /* Calculate a new key value (MBR) for the shrinked block. */ if (rtree_set_key_mbr(info, keyinfo, k, key_length, _mi_kpos(nod_flag, k))) goto err1; @@ -800,10 +816,23 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, } else { - /* too small: delete key & add it descendant to reinsert list */ + /* + Too small: delete key & add it descendant to reinsert list. + Store position and level of the block so that it can be + accessed later for inserting the remaining keys. + */ + DBUG_PRINT("rtree", ("too small. move block to reinsert list")); if (rtree_fill_reinsert_list(ReinsertList, _mi_kpos(nod_flag, k), level + 1)) goto err1; + /* + Delete the key that references the block. This makes the + block disappear from the index. Hence we need to insert + its remaining keys later. Note: if the block is a branch + block, we do not only remove this block, but the whole + subtree. So we need to re-insert its keys on the same + level later to reintegrate the subtrees. + */ rtree_delete_key(info, page_buf, k, key_length, nod_flag); if (_mi_write_keypage(info, keyinfo, page, DFLT_INIT_HITS, page_buf)) @@ -863,11 +892,11 @@ static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, ok: my_afree((byte*)page_buf); - return res; + DBUG_RETURN(res); err1: my_afree((byte*)page_buf); - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } @@ -885,12 +914,15 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) stPageList ReinsertList; my_off_t old_root; MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + DBUG_ENTER("rtree_delete"); if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) { my_errno= HA_ERR_END_OF_FILE; - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } + DBUG_PRINT("rtree", ("starting deletion at root page: %lu", + (ulong) old_root)); ReinsertList.pages = NULL; ReinsertList.n_pages = 0; @@ -899,12 +931,12 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) switch (rtree_delete_req(info, keyinfo, key, key_length, old_root, &page_size, &ReinsertList, 0)) { - case 2: + case 2: /* empty */ { info->s->state.key_root[keynr] = HA_OFFSET_ERROR; - return 0; + DBUG_RETURN(0); } - case 0: + case 0: /* deleted */ { uint nod_flag; ulong i; @@ -923,16 +955,34 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) DFLT_INIT_HITS, page_buf, 0)) goto err1; nod_flag = mi_test_if_nod(page_buf); + DBUG_PRINT("rtree", ("reinserting keys from " + "page: %lu level: %d nod_flag: %u", + (ulong) ReinsertList.pages[i].offs, + ReinsertList.pages[i].level, nod_flag)); + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); last = rt_PAGE_END(page_buf); for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) { - if (rtree_insert_level(info, keynr, k, key_length, - ReinsertList.pages[i].level) == -1) + int res; + if ((res= rtree_insert_level(info, keynr, k, key_length, + ReinsertList.pages[i].level)) == -1) { my_afree((byte*)page_buf); goto err1; } + if (res) + { + ulong j; + DBUG_PRINT("rtree", ("root has been split, adjust levels")); + for (j= i; j < ReinsertList.n_pages; j++) + { + ReinsertList.pages[j].level++; + DBUG_PRINT("rtree", ("keys from page: %lu now level: %d", + (ulong) ReinsertList.pages[i].offs, + ReinsertList.pages[i].level)); + } + } } my_afree((byte*)page_buf); if (_mi_dispose(info, keyinfo, ReinsertList.pages[i].offs, @@ -959,20 +1009,20 @@ int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) info->s->state.key_root[keynr] = new_root; } info->update= HA_STATE_DELETED; - return 0; + DBUG_RETURN(0); err1: - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } case 1: /* not found */ { my_errno = HA_ERR_KEY_NOT_FOUND; - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } default: case -1: /* error */ { - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ } } } diff --git a/myisam/rt_key.c b/myisam/rt_key.c index cb6a82c51f6..fe59af3c605 100644 --- a/myisam/rt_key.c +++ b/myisam/rt_key.c @@ -34,6 +34,7 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, { uint page_size = mi_getint(page_buf); uint nod_flag = mi_test_if_nod(page_buf); + DBUG_ENTER("rtree_add_key"); if (page_size + key_length + info->s->base.rec_reflength <= keyinfo->block_length) @@ -42,22 +43,26 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, if (nod_flag) { /* save key */ + DBUG_ASSERT(_mi_kpos(nod_flag, key) < info->state->key_file_length); memcpy(rt_PAGE_END(page_buf), key - nod_flag, key_length + nod_flag); page_size += key_length + nod_flag; } else { /* save key */ + DBUG_ASSERT(_mi_dpos(info, nod_flag, key + key_length + + info->s->base.rec_reflength) < + info->state->data_file_length + info->s->base.pack_reclength); memcpy(rt_PAGE_END(page_buf), key, key_length + info->s->base.rec_reflength); page_size += key_length + info->s->base.rec_reflength; } mi_putint(page_buf, page_size, nod_flag); - return 0; + DBUG_RETURN(0); } - return (rtree_split_page(info, keyinfo, page_buf, key, key_length, - new_page) ? -1 : 1); + DBUG_RETURN((rtree_split_page(info, keyinfo, page_buf, key, key_length, + new_page) ? -1 : 1)); } /* @@ -89,11 +94,13 @@ int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key, int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, uint key_length, my_off_t child_page) { + DBUG_ENTER("rtree_set_key_mbr"); + if (!_mi_fetch_keypage(info, keyinfo, child_page, DFLT_INIT_HITS, info->buff, 0)) - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ - return rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length); + DBUG_RETURN(rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length)); } #endif /*HAVE_RTREE_KEYS*/ diff --git a/myisam/rt_split.c b/myisam/rt_split.c index 9f25ee608d8..0f6dc872958 100644 --- a/myisam/rt_split.c +++ b/myisam/rt_split.c @@ -264,13 +264,15 @@ int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint full_length= key_length + (nod_flag ? nod_flag : info->s->base.rec_reflength); int max_keys= (mi_getint(page)-2) / (full_length); + DBUG_ENTER("rtree_split_page"); + DBUG_PRINT("rtree", ("splitting block")); n_dim = keyinfo->keysegs / 2; if (!(coord_buf= (double*) my_alloca(n_dim * 2 * sizeof(double) * (max_keys + 1 + 4) + sizeof(SplitStruct) * (max_keys + 1)))) - return -1; + DBUG_RETURN(-1); /* purecov: inspected */ task= (SplitStruct *)(coord_buf + n_dim * 2 * (max_keys + 1 + 4)); @@ -341,12 +343,13 @@ int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key, else err_code= _mi_write_keypage(info, keyinfo, *new_page_offs, DFLT_INIT_HITS, new_page); + DBUG_PRINT("rtree", ("split new block: %lu", (ulong) *new_page_offs)); my_afree((byte*)new_page); split_err: my_afree((byte*) coord_buf); - return err_code; + DBUG_RETURN(err_code); } #endif /*HAVE_RTREE_KEYS*/ diff --git a/mysql-test/r/delayed.result b/mysql-test/r/delayed.result index 6295fceec2b..82a308c63e7 100644 --- a/mysql-test/r/delayed.result +++ b/mysql-test/r/delayed.result @@ -243,3 +243,10 @@ SET @@session.auto_increment_offset= @bug20830_old_session_auto_increment_offset; SET @@session.auto_increment_increment= @bug20830_old_session_auto_increment_increment; +CREATE TABLE t1(a BIT); +INSERT DELAYED INTO t1 VALUES(1); +FLUSH TABLE t1; +SELECT HEX(a) FROM t1; +HEX(a) +1 +DROP TABLE t1; diff --git a/mysql-test/r/gis-rtree.result b/mysql-test/r/gis-rtree.result index 4ca2bc98d82..e4b52fc0392 100644 --- a/mysql-test/r/gis-rtree.result +++ b/mysql-test/r/gis-rtree.result @@ -873,6 +873,558 @@ SELECT 1 FROM t1 WHERE foo != PointFromWKB(POINT(0,0)); 1 1 DROP TABLE t1; +CREATE TABLE t1 (id bigint(12) unsigned NOT NULL auto_increment, +c2 varchar(15) collate utf8_bin default NULL, +c1 varchar(15) collate utf8_bin default NULL, +c3 varchar(10) collate utf8_bin default NULL, +spatial_point point NOT NULL, +PRIMARY KEY(id), +SPATIAL KEY (spatial_point(32)) +)ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES +('y', 's', 'j', GeomFromText('POINT(167 74)')), +('r', 'n', 'd', GeomFromText('POINT(215 118)')), +('g', 'n', 'e', GeomFromText('POINT(203 98)')), +('h', 'd', 'd', GeomFromText('POINT(54 193)')), +('r', 'x', 'y', GeomFromText('POINT(47 69)')), +('t', 'q', 'r', GeomFromText('POINT(109 42)')), +('a', 'z', 'd', GeomFromText('POINT(0 154)')), +('x', 'v', 'o', GeomFromText('POINT(174 131)')), +('b', 'r', 'a', GeomFromText('POINT(114 253)')), +('x', 'z', 'i', GeomFromText('POINT(163 21)')), +('w', 'p', 'i', GeomFromText('POINT(42 102)')), +('g', 'j', 'j', GeomFromText('POINT(170 133)')), +('m', 'g', 'n', GeomFromText('POINT(28 22)')), +('b', 'z', 'h', GeomFromText('POINT(174 28)')), +('q', 'k', 'f', GeomFromText('POINT(233 73)')), +('w', 'w', 'a', GeomFromText('POINT(124 200)')), +('t', 'j', 'w', GeomFromText('POINT(252 101)')), +('d', 'r', 'd', GeomFromText('POINT(98 18)')), +('w', 'o', 'y', GeomFromText('POINT(165 31)')), +('y', 'h', 't', GeomFromText('POINT(14 220)')), +('d', 'p', 'u', GeomFromText('POINT(223 196)')), +('g', 'y', 'g', GeomFromText('POINT(207 96)')), +('x', 'm', 'n', GeomFromText('POINT(214 3)')), +('g', 'v', 'e', GeomFromText('POINT(140 205)')), +('g', 'm', 'm', GeomFromText('POINT(10 236)')), +('i', 'r', 'j', GeomFromText('POINT(137 228)')), +('w', 's', 'p', GeomFromText('POINT(115 6)')), +('o', 'n', 'k', GeomFromText('POINT(158 129)')), +('j', 'h', 'l', GeomFromText('POINT(129 72)')), +('f', 'x', 'l', GeomFromText('POINT(139 207)')), +('u', 'd', 'n', GeomFromText('POINT(125 109)')), +('b', 'a', 'z', GeomFromText('POINT(30 32)')), +('m', 'h', 'o', GeomFromText('POINT(251 251)')), +('f', 'r', 'd', GeomFromText('POINT(243 211)')), +('b', 'd', 'r', GeomFromText('POINT(232 80)')), +('g', 'k', 'v', GeomFromText('POINT(15 100)')), +('i', 'f', 'c', GeomFromText('POINT(109 66)')), +('r', 't', 'j', GeomFromText('POINT(178 6)')), +('y', 'n', 'f', GeomFromText('POINT(233 211)')), +('f', 'y', 'm', GeomFromText('POINT(99 16)')), +('z', 'q', 'l', GeomFromText('POINT(39 49)')), +('j', 'c', 'r', GeomFromText('POINT(75 187)')), +('c', 'y', 'y', GeomFromText('POINT(246 253)')), +('w', 'u', 'd', GeomFromText('POINT(56 190)')), +('n', 'q', 'm', GeomFromText('POINT(73 149)')), +('d', 'y', 'a', GeomFromText('POINT(134 6)')), +('z', 's', 'w', GeomFromText('POINT(216 225)')), +('d', 'u', 'k', GeomFromText('POINT(132 70)')), +('f', 'v', 't', GeomFromText('POINT(187 141)')), +('r', 'r', 'a', GeomFromText('POINT(152 39)')), +('y', 'p', 'o', GeomFromText('POINT(45 27)')), +('p', 'n', 'm', GeomFromText('POINT(228 148)')), +('e', 'g', 'e', GeomFromText('POINT(88 81)')), +('m', 'a', 'h', GeomFromText('POINT(35 29)')), +('m', 'h', 'f', GeomFromText('POINT(30 71)')), +('h', 'k', 'i', GeomFromText('POINT(244 78)')), +('z', 'v', 'd', GeomFromText('POINT(241 38)')), +('q', 'l', 'j', GeomFromText('POINT(13 71)')), +('s', 'p', 'g', GeomFromText('POINT(108 38)')), +('q', 's', 'j', GeomFromText('POINT(92 101)')), +('l', 'h', 'g', GeomFromText('POINT(120 78)')), +('w', 't', 'b', GeomFromText('POINT(193 109)')), +('b', 's', 's', GeomFromText('POINT(223 211)')), +('w', 'w', 'y', GeomFromText('POINT(122 42)')), +('q', 'c', 'c', GeomFromText('POINT(104 102)')), +('w', 'g', 'n', GeomFromText('POINT(213 120)')), +('p', 'q', 'a', GeomFromText('POINT(247 148)')), +('c', 'z', 'e', GeomFromText('POINT(18 106)')), +('z', 'u', 'n', GeomFromText('POINT(70 133)')), +('j', 'n', 'x', GeomFromText('POINT(232 13)')), +('e', 'h', 'f', GeomFromText('POINT(22 135)')), +('w', 'l', 'f', GeomFromText('POINT(9 180)')), +('a', 'v', 'q', GeomFromText('POINT(163 228)')), +('i', 'z', 'o', GeomFromText('POINT(180 100)')), +('e', 'c', 'l', GeomFromText('POINT(182 231)')), +('c', 'k', 'o', GeomFromText('POINT(19 60)')), +('q', 'f', 'p', GeomFromText('POINT(79 95)')), +('m', 'd', 'r', GeomFromText('POINT(3 127)')), +('m', 'e', 't', GeomFromText('POINT(136 154)')), +('w', 'w', 'w', GeomFromText('POINT(102 15)')), +('l', 'n', 'q', GeomFromText('POINT(71 196)')), +('p', 'k', 'c', GeomFromText('POINT(47 139)')), +('j', 'o', 'r', GeomFromText('POINT(177 128)')), +('j', 'q', 'a', GeomFromText('POINT(170 6)')), +('b', 'a', 'o', GeomFromText('POINT(63 211)')), +('g', 's', 'o', GeomFromText('POINT(144 251)')), +('w', 'u', 'w', GeomFromText('POINT(221 214)')), +('g', 'a', 'm', GeomFromText('POINT(14 102)')), +('u', 'q', 'z', GeomFromText('POINT(86 200)')), +('k', 'a', 'm', GeomFromText('POINT(144 222)')), +('j', 'u', 'r', GeomFromText('POINT(216 142)')), +('q', 'k', 'v', GeomFromText('POINT(121 236)')), +('p', 'o', 'r', GeomFromText('POINT(108 102)')), +('b', 'd', 'x', GeomFromText('POINT(127 198)')), +('k', 's', 'a', GeomFromText('POINT(2 150)')), +('f', 'm', 'f', GeomFromText('POINT(160 191)')), +('q', 'y', 'x', GeomFromText('POINT(98 111)')), +('o', 'f', 'm', GeomFromText('POINT(232 218)')), +('c', 'w', 'j', GeomFromText('POINT(156 165)')), +('s', 'q', 'v', GeomFromText('POINT(98 161)')); +SET @@RAND_SEED1=692635050, @@RAND_SEED2=297339954; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=159925977, @@RAND_SEED2=942570618; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=328169745, @@RAND_SEED2=410451954; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=178507359, @@RAND_SEED2=332493072; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=1034033013, @@RAND_SEED2=558966507; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +UPDATE t1 set spatial_point=GeomFromText('POINT(230 9)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(95 35)') where c1 like 'j%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(93 99)') where c1 like 'a%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(19 81)') where c1 like 'r%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(20 177)') where c1 like 'h%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(221 193)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(195 205)') where c1 like 'd%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(15 213)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(214 63)') where c1 like 'n%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(243 171)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(198 82)') where c1 like 'y%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES +('f', 'y', 'p', GeomFromText('POINT(109 235)')), +('b', 'e', 'v', GeomFromText('POINT(20 48)')), +('i', 'u', 'f', GeomFromText('POINT(15 55)')), +('o', 'r', 'z', GeomFromText('POINT(105 64)')), +('a', 'p', 'a', GeomFromText('POINT(142 236)')), +('g', 'i', 'k', GeomFromText('POINT(10 49)')), +('x', 'z', 'x', GeomFromText('POINT(192 200)')), +('c', 'v', 'r', GeomFromText('POINT(94 168)')), +('y', 'z', 'e', GeomFromText('POINT(141 51)')), +('h', 'm', 'd', GeomFromText('POINT(35 251)')), +('v', 'm', 'q', GeomFromText('POINT(44 90)')), +('j', 'l', 'z', GeomFromText('POINT(67 237)')), +('i', 'v', 'a', GeomFromText('POINT(75 14)')), +('b', 'q', 't', GeomFromText('POINT(153 33)')), +('e', 'm', 'a', GeomFromText('POINT(247 49)')), +('l', 'y', 'g', GeomFromText('POINT(56 203)')), +('v', 'o', 'r', GeomFromText('POINT(90 54)')), +('r', 'n', 'd', GeomFromText('POINT(135 83)')), +('j', 't', 'u', GeomFromText('POINT(174 239)')), +('u', 'n', 'g', GeomFromText('POINT(104 191)')), +('p', 'q', 'y', GeomFromText('POINT(63 171)')), +('o', 'q', 'p', GeomFromText('POINT(192 103)')), +('f', 'x', 'e', GeomFromText('POINT(244 30)')), +('n', 'x', 'c', GeomFromText('POINT(92 103)')), +('r', 'q', 'z', GeomFromText('POINT(166 20)')), +('s', 'a', 'j', GeomFromText('POINT(137 205)')), +('z', 't', 't', GeomFromText('POINT(99 134)')), +('o', 'm', 'j', GeomFromText('POINT(217 3)')), +('n', 'h', 'j', GeomFromText('POINT(211 17)')), +('v', 'v', 'a', GeomFromText('POINT(41 137)')), +('q', 'o', 'j', GeomFromText('POINT(5 92)')), +('z', 'y', 'e', GeomFromText('POINT(175 212)')), +('j', 'z', 'h', GeomFromText('POINT(224 194)')), +('a', 'g', 'm', GeomFromText('POINT(31 119)')), +('p', 'c', 'f', GeomFromText('POINT(17 221)')), +('t', 'h', 'k', GeomFromText('POINT(26 203)')), +('u', 'w', 'p', GeomFromText('POINT(47 185)')), +('z', 'a', 'c', GeomFromText('POINT(61 133)')), +('u', 'k', 'a', GeomFromText('POINT(210 115)')), +('k', 'f', 'h', GeomFromText('POINT(125 113)')), +('t', 'v', 'y', GeomFromText('POINT(12 239)')), +('u', 'v', 'd', GeomFromText('POINT(90 24)')), +('m', 'y', 'w', GeomFromText('POINT(25 243)')), +('d', 'n', 'g', GeomFromText('POINT(122 92)')), +('z', 'm', 'f', GeomFromText('POINT(235 110)')), +('q', 'd', 'f', GeomFromText('POINT(233 217)')), +('a', 'v', 'u', GeomFromText('POINT(69 59)')), +('x', 'k', 'p', GeomFromText('POINT(240 14)')), +('i', 'v', 'r', GeomFromText('POINT(154 42)')), +('w', 'h', 'l', GeomFromText('POINT(178 156)')), +('d', 'h', 'n', GeomFromText('POINT(65 157)')), +('c', 'k', 'z', GeomFromText('POINT(62 33)')), +('e', 'l', 'w', GeomFromText('POINT(162 1)')), +('r', 'f', 'i', GeomFromText('POINT(127 71)')), +('q', 'm', 'c', GeomFromText('POINT(63 118)')), +('c', 'h', 'u', GeomFromText('POINT(205 203)')), +('d', 't', 'p', GeomFromText('POINT(234 87)')), +('s', 'g', 'h', GeomFromText('POINT(149 34)')), +('o', 'b', 'q', GeomFromText('POINT(159 179)')), +('k', 'u', 'f', GeomFromText('POINT(202 254)')), +('u', 'f', 'g', GeomFromText('POINT(70 15)')), +('x', 's', 'b', GeomFromText('POINT(25 181)')), +('s', 'c', 'g', GeomFromText('POINT(252 17)')), +('a', 'c', 'f', GeomFromText('POINT(89 67)')), +('r', 'e', 'q', GeomFromText('POINT(55 54)')), +('f', 'i', 'k', GeomFromText('POINT(178 230)')), +('p', 'e', 'l', GeomFromText('POINT(198 28)')), +('w', 'o', 'd', GeomFromText('POINT(204 189)')), +('c', 'a', 'g', GeomFromText('POINT(230 178)')), +('r', 'o', 'e', GeomFromText('POINT(61 116)')), +('w', 'a', 'a', GeomFromText('POINT(178 237)')), +('v', 'd', 'e', GeomFromText('POINT(70 85)')), +('k', 'c', 'e', GeomFromText('POINT(147 118)')), +('d', 'q', 't', GeomFromText('POINT(218 77)')), +('k', 'g', 'f', GeomFromText('POINT(192 113)')), +('w', 'n', 'e', GeomFromText('POINT(92 124)')), +('r', 'm', 'q', GeomFromText('POINT(130 65)')), +('o', 'r', 'r', GeomFromText('POINT(174 233)')), +('k', 'n', 't', GeomFromText('POINT(175 147)')), +('q', 'm', 'r', GeomFromText('POINT(18 208)')), +('l', 'd', 'i', GeomFromText('POINT(13 104)')), +('w', 'o', 'y', GeomFromText('POINT(207 39)')), +('p', 'u', 'o', GeomFromText('POINT(114 31)')), +('y', 'a', 'p', GeomFromText('POINT(106 59)')), +('a', 'x', 'z', GeomFromText('POINT(17 57)')), +('v', 'h', 'x', GeomFromText('POINT(170 13)')), +('t', 's', 'u', GeomFromText('POINT(84 18)')), +('z', 'z', 'f', GeomFromText('POINT(250 197)')), +('l', 'z', 't', GeomFromText('POINT(59 80)')), +('j', 'g', 's', GeomFromText('POINT(54 26)')), +('g', 'v', 'm', GeomFromText('POINT(89 98)')), +('q', 'v', 'b', GeomFromText('POINT(39 240)')), +('x', 'k', 'v', GeomFromText('POINT(246 207)')), +('k', 'u', 'i', GeomFromText('POINT(105 111)')), +('w', 'z', 's', GeomFromText('POINT(235 8)')), +('d', 'd', 'd', GeomFromText('POINT(105 4)')), +('c', 'z', 'q', GeomFromText('POINT(13 140)')), +('m', 'k', 'i', GeomFromText('POINT(208 120)')), +('g', 'a', 'g', GeomFromText('POINT(9 182)')), +('z', 'j', 'r', GeomFromText('POINT(149 153)')), +('h', 'f', 'g', GeomFromText('POINT(81 236)')), +('m', 'e', 'q', GeomFromText('POINT(209 215)')), +('c', 'h', 'y', GeomFromText('POINT(235 70)')), +('i', 'e', 'g', GeomFromText('POINT(138 26)')), +('m', 't', 'u', GeomFromText('POINT(119 237)')), +('o', 'w', 's', GeomFromText('POINT(193 166)')), +('f', 'm', 'q', GeomFromText('POINT(85 96)')), +('x', 'l', 'x', GeomFromText('POINT(58 115)')), +('x', 'q', 'u', GeomFromText('POINT(108 210)')), +('b', 'h', 'i', GeomFromText('POINT(250 139)')), +('y', 'd', 'x', GeomFromText('POINT(199 135)')), +('w', 'h', 'p', GeomFromText('POINT(247 233)')), +('p', 'z', 't', GeomFromText('POINT(148 249)')), +('q', 'a', 'u', GeomFromText('POINT(174 78)')), +('v', 't', 'm', GeomFromText('POINT(70 228)')), +('t', 'n', 'f', GeomFromText('POINT(123 2)')), +('x', 't', 'b', GeomFromText('POINT(35 50)')), +('r', 'j', 'f', GeomFromText('POINT(200 51)')), +('s', 'q', 'o', GeomFromText('POINT(23 184)')), +('u', 'v', 'z', GeomFromText('POINT(7 113)')), +('v', 'u', 'l', GeomFromText('POINT(145 190)')), +('o', 'k', 'i', GeomFromText('POINT(161 122)')), +('l', 'y', 'e', GeomFromText('POINT(17 232)')), +('t', 'b', 'e', GeomFromText('POINT(120 50)')), +('e', 's', 'u', GeomFromText('POINT(254 1)')), +('d', 'd', 'u', GeomFromText('POINT(167 140)')), +('o', 'b', 'x', GeomFromText('POINT(186 237)')), +('m', 's', 's', GeomFromText('POINT(172 149)')), +('t', 'y', 'a', GeomFromText('POINT(149 85)')), +('x', 't', 'r', GeomFromText('POINT(10 165)')), +('g', 'c', 'e', GeomFromText('POINT(95 165)')), +('e', 'e', 'z', GeomFromText('POINT(98 65)')), +('f', 'v', 'i', GeomFromText('POINT(149 144)')), +('o', 'p', 'm', GeomFromText('POINT(233 67)')), +('t', 'u', 'b', GeomFromText('POINT(109 215)')), +('o', 'o', 'b', GeomFromText('POINT(130 48)')), +('e', 'm', 'h', GeomFromText('POINT(88 189)')), +('e', 'v', 'y', GeomFromText('POINT(55 29)')), +('e', 't', 'm', GeomFromText('POINT(129 55)')), +('p', 'p', 'i', GeomFromText('POINT(126 222)')), +('c', 'i', 'c', GeomFromText('POINT(19 158)')), +('c', 'b', 's', GeomFromText('POINT(13 19)')), +('u', 'y', 'a', GeomFromText('POINT(114 5)')), +('a', 'o', 'f', GeomFromText('POINT(227 232)')), +('t', 'c', 'z', GeomFromText('POINT(63 62)')), +('d', 'o', 'k', GeomFromText('POINT(48 228)')), +('x', 'c', 'e', GeomFromText('POINT(204 2)')), +('e', 'e', 'g', GeomFromText('POINT(125 43)')), +('o', 'r', 'f', GeomFromText('POINT(171 140)')); +UPDATE t1 set spatial_point=GeomFromText('POINT(163 157)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(53 151)') where c1 like 'd%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(96 183)') where c1 like 'r%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(57 91)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(202 110)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(120 137)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(207 147)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(31 125)') where c1 like 'e%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(27 36)') where c1 like 'r%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES +('b', 'c', 'e', GeomFromText('POINT(41 137)')), +('p', 'y', 'k', GeomFromText('POINT(50 22)')), +('s', 'c', 'h', GeomFromText('POINT(208 173)')), +('x', 'u', 'l', GeomFromText('POINT(199 175)')), +('s', 'r', 'h', GeomFromText('POINT(85 192)')), +('j', 'k', 'u', GeomFromText('POINT(18 25)')), +('p', 'w', 'h', GeomFromText('POINT(152 197)')), +('e', 'd', 'c', GeomFromText('POINT(229 3)')), +('o', 'x', 'k', GeomFromText('POINT(187 155)')), +('o', 'b', 'k', GeomFromText('POINT(208 150)')), +('d', 'a', 'j', GeomFromText('POINT(70 87)')), +('f', 'e', 'k', GeomFromText('POINT(156 96)')), +('u', 'y', 'p', GeomFromText('POINT(239 193)')), +('n', 'v', 'p', GeomFromText('POINT(223 98)')), +('z', 'j', 'r', GeomFromText('POINT(87 89)')), +('h', 'x', 'x', GeomFromText('POINT(92 0)')), +('r', 'v', 'r', GeomFromText('POINT(159 139)')), +('v', 'g', 'g', GeomFromText('POINT(16 229)')), +('z', 'k', 'u', GeomFromText('POINT(99 52)')), +('p', 'p', 'o', GeomFromText('POINT(105 125)')), +('w', 'h', 'y', GeomFromText('POINT(105 154)')), +('v', 'y', 'z', GeomFromText('POINT(134 238)')), +('x', 'o', 'o', GeomFromText('POINT(178 88)')), +('z', 'w', 'd', GeomFromText('POINT(123 60)')), +('q', 'f', 'u', GeomFromText('POINT(64 90)')), +('s', 'n', 't', GeomFromText('POINT(50 138)')), +('v', 'p', 't', GeomFromText('POINT(114 91)')), +('a', 'o', 'n', GeomFromText('POINT(78 43)')), +('k', 'u', 'd', GeomFromText('POINT(185 161)')), +('w', 'd', 'n', GeomFromText('POINT(25 92)')), +('k', 'w', 'a', GeomFromText('POINT(59 238)')), +('t', 'c', 'f', GeomFromText('POINT(65 87)')), +('g', 's', 'p', GeomFromText('POINT(238 126)')), +('d', 'n', 'y', GeomFromText('POINT(107 173)')), +('l', 'a', 'w', GeomFromText('POINT(125 152)')), +('m', 'd', 'j', GeomFromText('POINT(146 53)')), +('q', 'm', 'c', GeomFromText('POINT(217 187)')), +('i', 'r', 'r', GeomFromText('POINT(6 113)')), +('e', 'j', 'b', GeomFromText('POINT(37 83)')), +('w', 'w', 'h', GeomFromText('POINT(83 199)')), +('k', 'b', 's', GeomFromText('POINT(170 64)')), +('s', 'b', 'c', GeomFromText('POINT(163 130)')), +('c', 'h', 'a', GeomFromText('POINT(141 3)')), +('k', 'j', 'u', GeomFromText('POINT(143 76)')), +('r', 'h', 'o', GeomFromText('POINT(243 92)')), +('i', 'd', 'b', GeomFromText('POINT(205 13)')), +('r', 'y', 'q', GeomFromText('POINT(138 8)')), +('m', 'o', 'i', GeomFromText('POINT(36 45)')), +('v', 'g', 'm', GeomFromText('POINT(0 40)')), +('f', 'e', 'i', GeomFromText('POINT(76 6)')), +('c', 'q', 'q', GeomFromText('POINT(115 248)')), +('x', 'c', 'i', GeomFromText('POINT(29 74)')), +('l', 's', 't', GeomFromText('POINT(83 18)')), +('t', 't', 'a', GeomFromText('POINT(26 168)')), +('u', 'n', 'x', GeomFromText('POINT(200 110)')), +('j', 'b', 'd', GeomFromText('POINT(216 136)')), +('s', 'p', 'w', GeomFromText('POINT(38 156)')), +('f', 'b', 'v', GeomFromText('POINT(29 186)')), +('v', 'e', 'r', GeomFromText('POINT(149 40)')), +('v', 't', 'm', GeomFromText('POINT(184 24)')), +('y', 'g', 'a', GeomFromText('POINT(219 105)')), +('s', 'f', 'i', GeomFromText('POINT(114 130)')), +('e', 'q', 'h', GeomFromText('POINT(203 135)')), +('h', 'g', 'b', GeomFromText('POINT(9 208)')), +('o', 'l', 'r', GeomFromText('POINT(245 79)')), +('s', 's', 'v', GeomFromText('POINT(238 198)')), +('w', 'w', 'z', GeomFromText('POINT(209 232)')), +('v', 'd', 'n', GeomFromText('POINT(30 193)')), +('q', 'w', 'k', GeomFromText('POINT(133 18)')), +('o', 'h', 'o', GeomFromText('POINT(42 140)')), +('f', 'f', 'h', GeomFromText('POINT(145 1)')), +('u', 's', 'r', GeomFromText('POINT(70 62)')), +('x', 'n', 'q', GeomFromText('POINT(33 86)')), +('u', 'p', 'v', GeomFromText('POINT(232 220)')), +('z', 'e', 'a', GeomFromText('POINT(130 69)')), +('r', 'u', 'z', GeomFromText('POINT(243 241)')), +('b', 'n', 't', GeomFromText('POINT(120 12)')), +('u', 'f', 's', GeomFromText('POINT(190 212)')), +('a', 'd', 'q', GeomFromText('POINT(235 191)')), +('f', 'q', 'm', GeomFromText('POINT(176 2)')), +('n', 'c', 's', GeomFromText('POINT(218 163)')), +('e', 'm', 'h', GeomFromText('POINT(163 108)')), +('c', 'f', 'l', GeomFromText('POINT(220 115)')), +('c', 'v', 'q', GeomFromText('POINT(66 45)')), +('w', 'v', 'x', GeomFromText('POINT(251 220)')), +('f', 'w', 'z', GeomFromText('POINT(146 149)')), +('h', 'n', 'h', GeomFromText('POINT(148 128)')), +('y', 'k', 'v', GeomFromText('POINT(28 110)')), +('c', 'x', 'q', GeomFromText('POINT(13 13)')), +('e', 'd', 's', GeomFromText('POINT(91 190)')), +('c', 'w', 'c', GeomFromText('POINT(10 231)')), +('u', 'j', 'n', GeomFromText('POINT(250 21)')), +('w', 'n', 'x', GeomFromText('POINT(141 69)')), +('f', 'p', 'y', GeomFromText('POINT(228 246)')), +('d', 'q', 'f', GeomFromText('POINT(194 22)')), +('d', 'z', 'l', GeomFromText('POINT(233 181)')), +('c', 'a', 'q', GeomFromText('POINT(183 96)')), +('m', 'i', 'd', GeomFromText('POINT(117 226)')), +('z', 'y', 'y', GeomFromText('POINT(62 81)')), +('g', 'v', 'm', GeomFromText('POINT(66 158)')); +SET @@RAND_SEED1=481064922, @@RAND_SEED2=438133497; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=280535103, @@RAND_SEED2=444518646; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=1072017234, @@RAND_SEED2=484203885; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=358851897, @@RAND_SEED2=358495224; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=509031459, @@RAND_SEED2=675962925; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +UPDATE t1 set spatial_point=GeomFromText('POINT(61 203)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(202 194)') where c1 like 'f%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(228 18)') where c1 like 'h%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(88 18)') where c1 like 'l%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(176 94)') where c1 like 'e%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(44 47)') where c1 like 'g%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(95 191)') where c1 like 'b%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(179 218)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(239 40)') where c1 like 'g%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(248 41)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(167 82)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(13 104)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(139 84)') where c1 like 'a%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(145 108)') where c1 like 'p%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(147 57)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(217 144)') where c1 like 'n%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(160 224)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(38 28)') where c1 like 'j%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(104 114)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(88 19)') where c1 like 'c%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES +('f', 'x', 'p', GeomFromText('POINT(92 181)')), +('s', 'i', 'c', GeomFromText('POINT(49 60)')), +('c', 'c', 'i', GeomFromText('POINT(7 57)')), +('n', 'g', 'k', GeomFromText('POINT(252 105)')), +('g', 'b', 'm', GeomFromText('POINT(180 11)')), +('u', 'l', 'r', GeomFromText('POINT(32 90)')), +('c', 'x', 'e', GeomFromText('POINT(143 24)')), +('x', 'u', 'a', GeomFromText('POINT(123 92)')), +('s', 'b', 'h', GeomFromText('POINT(190 108)')), +('c', 'x', 'b', GeomFromText('POINT(104 100)')), +('i', 'd', 't', GeomFromText('POINT(214 104)')), +('r', 'w', 'g', GeomFromText('POINT(29 67)')), +('b', 'f', 'g', GeomFromText('POINT(149 46)')), +('r', 'r', 'd', GeomFromText('POINT(242 196)')), +('j', 'l', 'a', GeomFromText('POINT(90 196)')), +('e', 't', 'b', GeomFromText('POINT(190 64)')), +('l', 'x', 'w', GeomFromText('POINT(250 73)')), +('q', 'y', 'r', GeomFromText('POINT(120 182)')), +('s', 'j', 'a', GeomFromText('POINT(180 175)')), +('n', 'i', 'y', GeomFromText('POINT(124 136)')), +('s', 'x', 's', GeomFromText('POINT(176 209)')), +('u', 'f', 's', GeomFromText('POINT(215 173)')), +('m', 'j', 'x', GeomFromText('POINT(44 140)')), +('v', 'g', 'x', GeomFromText('POINT(177 233)')), +('u', 't', 'b', GeomFromText('POINT(136 197)')), +('f', 'g', 'b', GeomFromText('POINT(10 8)')), +('v', 'c', 'j', GeomFromText('POINT(13 81)')), +('d', 's', 'q', GeomFromText('POINT(200 100)')), +('a', 'p', 'j', GeomFromText('POINT(33 40)')), +('i', 'c', 'g', GeomFromText('POINT(168 204)')), +('k', 'h', 'i', GeomFromText('POINT(93 243)')), +('s', 'b', 's', GeomFromText('POINT(157 13)')), +('v', 'l', 'l', GeomFromText('POINT(103 6)')), +('r', 'b', 'k', GeomFromText('POINT(244 137)')), +('l', 'd', 'r', GeomFromText('POINT(162 254)')), +('q', 'b', 'z', GeomFromText('POINT(136 246)')), +('x', 'x', 'p', GeomFromText('POINT(120 37)')), +('m', 'e', 'z', GeomFromText('POINT(203 167)')), +('q', 'n', 'p', GeomFromText('POINT(94 119)')), +('b', 'g', 'u', GeomFromText('POINT(93 248)')), +('r', 'v', 'v', GeomFromText('POINT(53 88)')), +('y', 'a', 'i', GeomFromText('POINT(98 219)')), +('a', 's', 'g', GeomFromText('POINT(173 138)')), +('c', 'a', 't', GeomFromText('POINT(235 135)')), +('q', 'm', 'd', GeomFromText('POINT(224 208)')), +('e', 'p', 'k', GeomFromText('POINT(161 238)')), +('n', 'g', 'q', GeomFromText('POINT(35 204)')), +('t', 't', 'x', GeomFromText('POINT(230 178)')), +('w', 'f', 'a', GeomFromText('POINT(150 221)')), +('z', 'm', 'z', GeomFromText('POINT(119 42)')), +('l', 'j', 's', GeomFromText('POINT(97 96)')), +('f', 'z', 'x', GeomFromText('POINT(208 65)')), +('i', 'v', 'c', GeomFromText('POINT(145 79)')), +('l', 'f', 'k', GeomFromText('POINT(83 234)')), +('u', 'a', 's', GeomFromText('POINT(250 49)')), +('o', 'k', 'p', GeomFromText('POINT(46 50)')), +('d', 'e', 'z', GeomFromText('POINT(30 198)')), +('r', 'r', 'l', GeomFromText('POINT(78 189)')), +('y', 'l', 'f', GeomFromText('POINT(188 132)')), +('d', 'q', 'm', GeomFromText('POINT(247 107)')), +('p', 'j', 'n', GeomFromText('POINT(148 227)')), +('b', 'o', 'i', GeomFromText('POINT(172 25)')), +('e', 'v', 'd', GeomFromText('POINT(94 248)')), +('q', 'd', 'f', GeomFromText('POINT(15 29)')), +('w', 'b', 'b', GeomFromText('POINT(74 111)')), +('g', 'q', 'f', GeomFromText('POINT(107 215)')), +('o', 'h', 'r', GeomFromText('POINT(25 168)')), +('u', 't', 'w', GeomFromText('POINT(251 188)')), +('h', 's', 'w', GeomFromText('POINT(254 247)')), +('f', 'f', 'b', GeomFromText('POINT(166 103)')); +SET @@RAND_SEED1=866613816, @@RAND_SEED2=92289615; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES +('l', 'c', 'l', GeomFromText('POINT(202 98)')), +('k', 'c', 'b', GeomFromText('POINT(46 206)')), +('r', 'y', 'm', GeomFromText('POINT(74 140)')), +('y', 'z', 'd', GeomFromText('POINT(200 160)')), +('s', 'y', 's', GeomFromText('POINT(156 205)')), +('u', 'v', 'p', GeomFromText('POINT(86 82)')), +('j', 's', 's', GeomFromText('POINT(91 233)')), +('x', 'j', 'f', GeomFromText('POINT(3 14)')), +('l', 'z', 'v', GeomFromText('POINT(123 156)')), +('h', 'i', 'o', GeomFromText('POINT(145 229)')), +('o', 'r', 'd', GeomFromText('POINT(15 22)')), +('f', 'x', 't', GeomFromText('POINT(21 60)')), +('t', 'g', 'h', GeomFromText('POINT(50 153)')), +('g', 'u', 'b', GeomFromText('POINT(82 85)')), +('v', 'a', 'p', GeomFromText('POINT(231 178)')), +('n', 'v', 'o', GeomFromText('POINT(183 25)')), +('j', 'n', 'm', GeomFromText('POINT(50 144)')), +('e', 'f', 'i', GeomFromText('POINT(46 16)')), +('d', 'w', 'a', GeomFromText('POINT(66 6)')), +('f', 'x', 'a', GeomFromText('POINT(107 197)')), +('m', 'o', 'a', GeomFromText('POINT(142 80)')), +('q', 'l', 'g', GeomFromText('POINT(251 23)')), +('c', 's', 's', GeomFromText('POINT(158 43)')), +('y', 'd', 'o', GeomFromText('POINT(196 228)')), +('d', 'p', 'l', GeomFromText('POINT(107 5)')), +('h', 'a', 'b', GeomFromText('POINT(183 166)')), +('m', 'w', 'p', GeomFromText('POINT(19 59)')), +('b', 'y', 'o', GeomFromText('POINT(178 30)')), +('x', 'w', 'i', GeomFromText('POINT(168 94)')), +('t', 'k', 'z', GeomFromText('POINT(171 5)')), +('r', 'm', 'a', GeomFromText('POINT(222 19)')), +('u', 'v', 'e', GeomFromText('POINT(224 80)')), +('q', 'r', 'k', GeomFromText('POINT(212 218)')), +('d', 'p', 'j', GeomFromText('POINT(169 7)')), +('d', 'r', 'v', GeomFromText('POINT(193 23)')), +('n', 'y', 'y', GeomFromText('POINT(130 178)')), +('m', 'z', 'r', GeomFromText('POINT(81 200)')), +('j', 'e', 'w', GeomFromText('POINT(145 239)')), +('v', 'h', 'x', GeomFromText('POINT(24 105)')), +('z', 'm', 'a', GeomFromText('POINT(175 129)')), +('b', 'c', 'v', GeomFromText('POINT(213 10)')), +('t', 't', 'u', GeomFromText('POINT(2 129)')), +('r', 's', 'v', GeomFromText('POINT(209 192)')), +('x', 'p', 'g', GeomFromText('POINT(43 63)')), +('t', 'e', 'u', GeomFromText('POINT(139 210)')), +('l', 'e', 't', GeomFromText('POINT(245 148)')), +('a', 'i', 'k', GeomFromText('POINT(167 195)')), +('m', 'o', 'h', GeomFromText('POINT(206 120)')), +('g', 'z', 's', GeomFromText('POINT(169 240)')), +('z', 'u', 's', GeomFromText('POINT(202 120)')), +('i', 'b', 'a', GeomFromText('POINT(216 18)')), +('w', 'y', 'g', GeomFromText('POINT(119 236)')), +('h', 'y', 'p', GeomFromText('POINT(161 24)')); +UPDATE t1 set spatial_point=GeomFromText('POINT(33 100)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(41 46)') where c1 like 'f%'; +CHECK TABLE t1 EXTENDED; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; CREATE TABLE t1(foo GEOMETRY NOT NULL, SPATIAL INDEX(foo) ); INSERT INTO t1(foo) VALUES (NULL); ERROR 23000: Column 'foo' cannot be null diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 87ac5c12fda..e45e5853c0c 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -803,6 +803,24 @@ CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, tm1; +CREATE TABLE t1(c1 INT) ENGINE=MyISAM; +CREATE TABLE t2(c1 INT) ENGINE=MERGE UNION=(t1); +INSERT DELAYED INTO t2 VALUES(1); +ERROR HY000: Table storage engine for 't2' doesn't have this option +DROP TABLE t1, t2; +CREATE TABLE t1(c1 VARCHAR(1)); +CREATE TABLE m1 LIKE t1; +ALTER TABLE m1 ENGINE=MERGE UNION=(t1); +SELECT * FROM m1; +c1 +DROP TABLE t1, m1; +CREATE TABLE t1(c1 VARCHAR(4), c2 TINYINT, c3 TINYINT, c4 TINYINT, +c5 TINYINT, c6 TINYINT, c7 TINYINT, c8 TINYINT, c9 TINYINT); +CREATE TABLE m1 LIKE t1; +ALTER TABLE m1 ENGINE=MERGE UNION=(t1); +SELECT * FROM m1; +c1 c2 c3 c4 c5 c6 c7 c8 c9 +DROP TABLE t1, m1; create table t1 (b bit(1)); create table t2 (b bit(1)); create table tm (b bit(1)) engine = merge union = (t1,t2); diff --git a/mysql-test/r/ndb_single_user.result b/mysql-test/r/ndb_single_user.result new file mode 100644 index 00000000000..711d343fffb --- /dev/null +++ b/mysql-test/r/ndb_single_user.result @@ -0,0 +1,46 @@ +use test; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; +create table t1 (a int key, b int unique, c int) engine ndb; +ERROR HY000: Can't create table './test/t1.frm' (errno: 155) +create table t1 (a int key, b int unique, c int) engine ndb; +insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); +create table t2 as select * from t1; +select * from t1 where a = 1; +a b c +1 1 0 +select * from t1 where b = 4; +a b c +4 4 0 +select * from t1 where a > 4 order by a; +a b c +5 5 0 +6 6 0 +7 7 0 +8 8 0 +9 9 0 +10 10 0 +update t1 set b=102 where a = 2; +update t1 set b=103 where b = 3; +update t1 set b=b+100; +update t1 set b=b+100 where a > 7; +delete from t1; +insert into t1 select * from t2; +drop table t1; +ERROR 42S02: Unknown table 't1' +create index new_index on t1 (c); +ERROR 42S02: Table 'test.t1' doesn't exist +insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); +ERROR 42S02: Table 'test.t1' doesn't exist +select * from t1 where a = 1; +ERROR 42S02: Table 'test.t1' doesn't exist +select * from t1 where b = 4; +ERROR 42S02: Table 'test.t1' doesn't exist +update t1 set b=102 where a = 2; +ERROR 42S02: Table 'test.t1' doesn't exist +update t1 set b=103 where b = 3; +ERROR 42S02: Table 'test.t1' doesn't exist +update t1 set b=b+100; +ERROR 42S02: Table 'test.t1' doesn't exist +update t1 set b=b+100 where a > 7; +ERROR 42S02: Table 'test.t1' doesn't exist +drop table t1; diff --git a/mysql-test/t/delayed.test b/mysql-test/t/delayed.test index fe8bc167e0f..773927f6015 100644 --- a/mysql-test/t/delayed.test +++ b/mysql-test/t/delayed.test @@ -234,3 +234,11 @@ SET @@session.auto_increment_offset= SET @@session.auto_increment_increment= @bug20830_old_session_auto_increment_increment; +# +# BUG#26238 - inserted delayed always inserts 0 for BIT columns +# +CREATE TABLE t1(a BIT); +INSERT DELAYED INTO t1 VALUES(1); +FLUSH TABLE t1; +SELECT HEX(a) FROM t1; +DROP TABLE t1; diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index df56165950f..2116e9f51e0 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -12,3 +12,4 @@ ndb_load : Bug#17233 user_limits : Bug#23921 random failure of user_limits.test +ndb_single_user : Bug#27021 Error codes in mysqld in single user mode varies diff --git a/mysql-test/t/gis-rtree.test b/mysql-test/t/gis-rtree.test index 1704fe7dc80..3368aea9741 100644 --- a/mysql-test/t/gis-rtree.test +++ b/mysql-test/t/gis-rtree.test @@ -241,6 +241,562 @@ INSERT INTO t1 (foo) VALUES (PointFromWKB(POINT(0,1))); INSERT INTO t1 (foo) VALUES (PointFromWKB(POINT(0,0))); SELECT 1 FROM t1 WHERE foo != PointFromWKB(POINT(0,0)); DROP TABLE t1; + +# +# Bug#25673 - spatial index corruption, error 126 incorrect key file for table +# +CREATE TABLE t1 (id bigint(12) unsigned NOT NULL auto_increment, + c2 varchar(15) collate utf8_bin default NULL, + c1 varchar(15) collate utf8_bin default NULL, + c3 varchar(10) collate utf8_bin default NULL, + spatial_point point NOT NULL, + PRIMARY KEY(id), + SPATIAL KEY (spatial_point(32)) + )ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +# +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES + ('y', 's', 'j', GeomFromText('POINT(167 74)')), + ('r', 'n', 'd', GeomFromText('POINT(215 118)')), + ('g', 'n', 'e', GeomFromText('POINT(203 98)')), + ('h', 'd', 'd', GeomFromText('POINT(54 193)')), + ('r', 'x', 'y', GeomFromText('POINT(47 69)')), + ('t', 'q', 'r', GeomFromText('POINT(109 42)')), + ('a', 'z', 'd', GeomFromText('POINT(0 154)')), + ('x', 'v', 'o', GeomFromText('POINT(174 131)')), + ('b', 'r', 'a', GeomFromText('POINT(114 253)')), + ('x', 'z', 'i', GeomFromText('POINT(163 21)')), + ('w', 'p', 'i', GeomFromText('POINT(42 102)')), + ('g', 'j', 'j', GeomFromText('POINT(170 133)')), + ('m', 'g', 'n', GeomFromText('POINT(28 22)')), + ('b', 'z', 'h', GeomFromText('POINT(174 28)')), + ('q', 'k', 'f', GeomFromText('POINT(233 73)')), + ('w', 'w', 'a', GeomFromText('POINT(124 200)')), + ('t', 'j', 'w', GeomFromText('POINT(252 101)')), + ('d', 'r', 'd', GeomFromText('POINT(98 18)')), + ('w', 'o', 'y', GeomFromText('POINT(165 31)')), + ('y', 'h', 't', GeomFromText('POINT(14 220)')), + ('d', 'p', 'u', GeomFromText('POINT(223 196)')), + ('g', 'y', 'g', GeomFromText('POINT(207 96)')), + ('x', 'm', 'n', GeomFromText('POINT(214 3)')), + ('g', 'v', 'e', GeomFromText('POINT(140 205)')), + ('g', 'm', 'm', GeomFromText('POINT(10 236)')), + ('i', 'r', 'j', GeomFromText('POINT(137 228)')), + ('w', 's', 'p', GeomFromText('POINT(115 6)')), + ('o', 'n', 'k', GeomFromText('POINT(158 129)')), + ('j', 'h', 'l', GeomFromText('POINT(129 72)')), + ('f', 'x', 'l', GeomFromText('POINT(139 207)')), + ('u', 'd', 'n', GeomFromText('POINT(125 109)')), + ('b', 'a', 'z', GeomFromText('POINT(30 32)')), + ('m', 'h', 'o', GeomFromText('POINT(251 251)')), + ('f', 'r', 'd', GeomFromText('POINT(243 211)')), + ('b', 'd', 'r', GeomFromText('POINT(232 80)')), + ('g', 'k', 'v', GeomFromText('POINT(15 100)')), + ('i', 'f', 'c', GeomFromText('POINT(109 66)')), + ('r', 't', 'j', GeomFromText('POINT(178 6)')), + ('y', 'n', 'f', GeomFromText('POINT(233 211)')), + ('f', 'y', 'm', GeomFromText('POINT(99 16)')), + ('z', 'q', 'l', GeomFromText('POINT(39 49)')), + ('j', 'c', 'r', GeomFromText('POINT(75 187)')), + ('c', 'y', 'y', GeomFromText('POINT(246 253)')), + ('w', 'u', 'd', GeomFromText('POINT(56 190)')), + ('n', 'q', 'm', GeomFromText('POINT(73 149)')), + ('d', 'y', 'a', GeomFromText('POINT(134 6)')), + ('z', 's', 'w', GeomFromText('POINT(216 225)')), + ('d', 'u', 'k', GeomFromText('POINT(132 70)')), + ('f', 'v', 't', GeomFromText('POINT(187 141)')), + ('r', 'r', 'a', GeomFromText('POINT(152 39)')), + ('y', 'p', 'o', GeomFromText('POINT(45 27)')), + ('p', 'n', 'm', GeomFromText('POINT(228 148)')), + ('e', 'g', 'e', GeomFromText('POINT(88 81)')), + ('m', 'a', 'h', GeomFromText('POINT(35 29)')), + ('m', 'h', 'f', GeomFromText('POINT(30 71)')), + ('h', 'k', 'i', GeomFromText('POINT(244 78)')), + ('z', 'v', 'd', GeomFromText('POINT(241 38)')), + ('q', 'l', 'j', GeomFromText('POINT(13 71)')), + ('s', 'p', 'g', GeomFromText('POINT(108 38)')), + ('q', 's', 'j', GeomFromText('POINT(92 101)')), + ('l', 'h', 'g', GeomFromText('POINT(120 78)')), + ('w', 't', 'b', GeomFromText('POINT(193 109)')), + ('b', 's', 's', GeomFromText('POINT(223 211)')), + ('w', 'w', 'y', GeomFromText('POINT(122 42)')), + ('q', 'c', 'c', GeomFromText('POINT(104 102)')), + ('w', 'g', 'n', GeomFromText('POINT(213 120)')), + ('p', 'q', 'a', GeomFromText('POINT(247 148)')), + ('c', 'z', 'e', GeomFromText('POINT(18 106)')), + ('z', 'u', 'n', GeomFromText('POINT(70 133)')), + ('j', 'n', 'x', GeomFromText('POINT(232 13)')), + ('e', 'h', 'f', GeomFromText('POINT(22 135)')), + ('w', 'l', 'f', GeomFromText('POINT(9 180)')), + ('a', 'v', 'q', GeomFromText('POINT(163 228)')), + ('i', 'z', 'o', GeomFromText('POINT(180 100)')), + ('e', 'c', 'l', GeomFromText('POINT(182 231)')), + ('c', 'k', 'o', GeomFromText('POINT(19 60)')), + ('q', 'f', 'p', GeomFromText('POINT(79 95)')), + ('m', 'd', 'r', GeomFromText('POINT(3 127)')), + ('m', 'e', 't', GeomFromText('POINT(136 154)')), + ('w', 'w', 'w', GeomFromText('POINT(102 15)')), + ('l', 'n', 'q', GeomFromText('POINT(71 196)')), + ('p', 'k', 'c', GeomFromText('POINT(47 139)')), + ('j', 'o', 'r', GeomFromText('POINT(177 128)')), + ('j', 'q', 'a', GeomFromText('POINT(170 6)')), + ('b', 'a', 'o', GeomFromText('POINT(63 211)')), + ('g', 's', 'o', GeomFromText('POINT(144 251)')), + ('w', 'u', 'w', GeomFromText('POINT(221 214)')), + ('g', 'a', 'm', GeomFromText('POINT(14 102)')), + ('u', 'q', 'z', GeomFromText('POINT(86 200)')), + ('k', 'a', 'm', GeomFromText('POINT(144 222)')), + ('j', 'u', 'r', GeomFromText('POINT(216 142)')), + ('q', 'k', 'v', GeomFromText('POINT(121 236)')), + ('p', 'o', 'r', GeomFromText('POINT(108 102)')), + ('b', 'd', 'x', GeomFromText('POINT(127 198)')), + ('k', 's', 'a', GeomFromText('POINT(2 150)')), + ('f', 'm', 'f', GeomFromText('POINT(160 191)')), + ('q', 'y', 'x', GeomFromText('POINT(98 111)')), + ('o', 'f', 'm', GeomFromText('POINT(232 218)')), + ('c', 'w', 'j', GeomFromText('POINT(156 165)')), + ('s', 'q', 'v', GeomFromText('POINT(98 161)')); +SET @@RAND_SEED1=692635050, @@RAND_SEED2=297339954; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=159925977, @@RAND_SEED2=942570618; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=328169745, @@RAND_SEED2=410451954; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=178507359, @@RAND_SEED2=332493072; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=1034033013, @@RAND_SEED2=558966507; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +UPDATE t1 set spatial_point=GeomFromText('POINT(230 9)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(95 35)') where c1 like 'j%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(93 99)') where c1 like 'a%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(19 81)') where c1 like 'r%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(20 177)') where c1 like 'h%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(221 193)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(195 205)') where c1 like 'd%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(15 213)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(214 63)') where c1 like 'n%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(243 171)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(198 82)') where c1 like 'y%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES + ('f', 'y', 'p', GeomFromText('POINT(109 235)')), + ('b', 'e', 'v', GeomFromText('POINT(20 48)')), + ('i', 'u', 'f', GeomFromText('POINT(15 55)')), + ('o', 'r', 'z', GeomFromText('POINT(105 64)')), + ('a', 'p', 'a', GeomFromText('POINT(142 236)')), + ('g', 'i', 'k', GeomFromText('POINT(10 49)')), + ('x', 'z', 'x', GeomFromText('POINT(192 200)')), + ('c', 'v', 'r', GeomFromText('POINT(94 168)')), + ('y', 'z', 'e', GeomFromText('POINT(141 51)')), + ('h', 'm', 'd', GeomFromText('POINT(35 251)')), + ('v', 'm', 'q', GeomFromText('POINT(44 90)')), + ('j', 'l', 'z', GeomFromText('POINT(67 237)')), + ('i', 'v', 'a', GeomFromText('POINT(75 14)')), + ('b', 'q', 't', GeomFromText('POINT(153 33)')), + ('e', 'm', 'a', GeomFromText('POINT(247 49)')), + ('l', 'y', 'g', GeomFromText('POINT(56 203)')), + ('v', 'o', 'r', GeomFromText('POINT(90 54)')), + ('r', 'n', 'd', GeomFromText('POINT(135 83)')), + ('j', 't', 'u', GeomFromText('POINT(174 239)')), + ('u', 'n', 'g', GeomFromText('POINT(104 191)')), + ('p', 'q', 'y', GeomFromText('POINT(63 171)')), + ('o', 'q', 'p', GeomFromText('POINT(192 103)')), + ('f', 'x', 'e', GeomFromText('POINT(244 30)')), + ('n', 'x', 'c', GeomFromText('POINT(92 103)')), + ('r', 'q', 'z', GeomFromText('POINT(166 20)')), + ('s', 'a', 'j', GeomFromText('POINT(137 205)')), + ('z', 't', 't', GeomFromText('POINT(99 134)')), + ('o', 'm', 'j', GeomFromText('POINT(217 3)')), + ('n', 'h', 'j', GeomFromText('POINT(211 17)')), + ('v', 'v', 'a', GeomFromText('POINT(41 137)')), + ('q', 'o', 'j', GeomFromText('POINT(5 92)')), + ('z', 'y', 'e', GeomFromText('POINT(175 212)')), + ('j', 'z', 'h', GeomFromText('POINT(224 194)')), + ('a', 'g', 'm', GeomFromText('POINT(31 119)')), + ('p', 'c', 'f', GeomFromText('POINT(17 221)')), + ('t', 'h', 'k', GeomFromText('POINT(26 203)')), + ('u', 'w', 'p', GeomFromText('POINT(47 185)')), + ('z', 'a', 'c', GeomFromText('POINT(61 133)')), + ('u', 'k', 'a', GeomFromText('POINT(210 115)')), + ('k', 'f', 'h', GeomFromText('POINT(125 113)')), + ('t', 'v', 'y', GeomFromText('POINT(12 239)')), + ('u', 'v', 'd', GeomFromText('POINT(90 24)')), + ('m', 'y', 'w', GeomFromText('POINT(25 243)')), + ('d', 'n', 'g', GeomFromText('POINT(122 92)')), + ('z', 'm', 'f', GeomFromText('POINT(235 110)')), + ('q', 'd', 'f', GeomFromText('POINT(233 217)')), + ('a', 'v', 'u', GeomFromText('POINT(69 59)')), + ('x', 'k', 'p', GeomFromText('POINT(240 14)')), + ('i', 'v', 'r', GeomFromText('POINT(154 42)')), + ('w', 'h', 'l', GeomFromText('POINT(178 156)')), + ('d', 'h', 'n', GeomFromText('POINT(65 157)')), + ('c', 'k', 'z', GeomFromText('POINT(62 33)')), + ('e', 'l', 'w', GeomFromText('POINT(162 1)')), + ('r', 'f', 'i', GeomFromText('POINT(127 71)')), + ('q', 'm', 'c', GeomFromText('POINT(63 118)')), + ('c', 'h', 'u', GeomFromText('POINT(205 203)')), + ('d', 't', 'p', GeomFromText('POINT(234 87)')), + ('s', 'g', 'h', GeomFromText('POINT(149 34)')), + ('o', 'b', 'q', GeomFromText('POINT(159 179)')), + ('k', 'u', 'f', GeomFromText('POINT(202 254)')), + ('u', 'f', 'g', GeomFromText('POINT(70 15)')), + ('x', 's', 'b', GeomFromText('POINT(25 181)')), + ('s', 'c', 'g', GeomFromText('POINT(252 17)')), + ('a', 'c', 'f', GeomFromText('POINT(89 67)')), + ('r', 'e', 'q', GeomFromText('POINT(55 54)')), + ('f', 'i', 'k', GeomFromText('POINT(178 230)')), + ('p', 'e', 'l', GeomFromText('POINT(198 28)')), + ('w', 'o', 'd', GeomFromText('POINT(204 189)')), + ('c', 'a', 'g', GeomFromText('POINT(230 178)')), + ('r', 'o', 'e', GeomFromText('POINT(61 116)')), + ('w', 'a', 'a', GeomFromText('POINT(178 237)')), + ('v', 'd', 'e', GeomFromText('POINT(70 85)')), + ('k', 'c', 'e', GeomFromText('POINT(147 118)')), + ('d', 'q', 't', GeomFromText('POINT(218 77)')), + ('k', 'g', 'f', GeomFromText('POINT(192 113)')), + ('w', 'n', 'e', GeomFromText('POINT(92 124)')), + ('r', 'm', 'q', GeomFromText('POINT(130 65)')), + ('o', 'r', 'r', GeomFromText('POINT(174 233)')), + ('k', 'n', 't', GeomFromText('POINT(175 147)')), + ('q', 'm', 'r', GeomFromText('POINT(18 208)')), + ('l', 'd', 'i', GeomFromText('POINT(13 104)')), + ('w', 'o', 'y', GeomFromText('POINT(207 39)')), + ('p', 'u', 'o', GeomFromText('POINT(114 31)')), + ('y', 'a', 'p', GeomFromText('POINT(106 59)')), + ('a', 'x', 'z', GeomFromText('POINT(17 57)')), + ('v', 'h', 'x', GeomFromText('POINT(170 13)')), + ('t', 's', 'u', GeomFromText('POINT(84 18)')), + ('z', 'z', 'f', GeomFromText('POINT(250 197)')), + ('l', 'z', 't', GeomFromText('POINT(59 80)')), + ('j', 'g', 's', GeomFromText('POINT(54 26)')), + ('g', 'v', 'm', GeomFromText('POINT(89 98)')), + ('q', 'v', 'b', GeomFromText('POINT(39 240)')), + ('x', 'k', 'v', GeomFromText('POINT(246 207)')), + ('k', 'u', 'i', GeomFromText('POINT(105 111)')), + ('w', 'z', 's', GeomFromText('POINT(235 8)')), + ('d', 'd', 'd', GeomFromText('POINT(105 4)')), + ('c', 'z', 'q', GeomFromText('POINT(13 140)')), + ('m', 'k', 'i', GeomFromText('POINT(208 120)')), + ('g', 'a', 'g', GeomFromText('POINT(9 182)')), + ('z', 'j', 'r', GeomFromText('POINT(149 153)')), + ('h', 'f', 'g', GeomFromText('POINT(81 236)')), + ('m', 'e', 'q', GeomFromText('POINT(209 215)')), + ('c', 'h', 'y', GeomFromText('POINT(235 70)')), + ('i', 'e', 'g', GeomFromText('POINT(138 26)')), + ('m', 't', 'u', GeomFromText('POINT(119 237)')), + ('o', 'w', 's', GeomFromText('POINT(193 166)')), + ('f', 'm', 'q', GeomFromText('POINT(85 96)')), + ('x', 'l', 'x', GeomFromText('POINT(58 115)')), + ('x', 'q', 'u', GeomFromText('POINT(108 210)')), + ('b', 'h', 'i', GeomFromText('POINT(250 139)')), + ('y', 'd', 'x', GeomFromText('POINT(199 135)')), + ('w', 'h', 'p', GeomFromText('POINT(247 233)')), + ('p', 'z', 't', GeomFromText('POINT(148 249)')), + ('q', 'a', 'u', GeomFromText('POINT(174 78)')), + ('v', 't', 'm', GeomFromText('POINT(70 228)')), + ('t', 'n', 'f', GeomFromText('POINT(123 2)')), + ('x', 't', 'b', GeomFromText('POINT(35 50)')), + ('r', 'j', 'f', GeomFromText('POINT(200 51)')), + ('s', 'q', 'o', GeomFromText('POINT(23 184)')), + ('u', 'v', 'z', GeomFromText('POINT(7 113)')), + ('v', 'u', 'l', GeomFromText('POINT(145 190)')), + ('o', 'k', 'i', GeomFromText('POINT(161 122)')), + ('l', 'y', 'e', GeomFromText('POINT(17 232)')), + ('t', 'b', 'e', GeomFromText('POINT(120 50)')), + ('e', 's', 'u', GeomFromText('POINT(254 1)')), + ('d', 'd', 'u', GeomFromText('POINT(167 140)')), + ('o', 'b', 'x', GeomFromText('POINT(186 237)')), + ('m', 's', 's', GeomFromText('POINT(172 149)')), + ('t', 'y', 'a', GeomFromText('POINT(149 85)')), + ('x', 't', 'r', GeomFromText('POINT(10 165)')), + ('g', 'c', 'e', GeomFromText('POINT(95 165)')), + ('e', 'e', 'z', GeomFromText('POINT(98 65)')), + ('f', 'v', 'i', GeomFromText('POINT(149 144)')), + ('o', 'p', 'm', GeomFromText('POINT(233 67)')), + ('t', 'u', 'b', GeomFromText('POINT(109 215)')), + ('o', 'o', 'b', GeomFromText('POINT(130 48)')), + ('e', 'm', 'h', GeomFromText('POINT(88 189)')), + ('e', 'v', 'y', GeomFromText('POINT(55 29)')), + ('e', 't', 'm', GeomFromText('POINT(129 55)')), + ('p', 'p', 'i', GeomFromText('POINT(126 222)')), + ('c', 'i', 'c', GeomFromText('POINT(19 158)')), + ('c', 'b', 's', GeomFromText('POINT(13 19)')), + ('u', 'y', 'a', GeomFromText('POINT(114 5)')), + ('a', 'o', 'f', GeomFromText('POINT(227 232)')), + ('t', 'c', 'z', GeomFromText('POINT(63 62)')), + ('d', 'o', 'k', GeomFromText('POINT(48 228)')), + ('x', 'c', 'e', GeomFromText('POINT(204 2)')), + ('e', 'e', 'g', GeomFromText('POINT(125 43)')), + ('o', 'r', 'f', GeomFromText('POINT(171 140)')); +UPDATE t1 set spatial_point=GeomFromText('POINT(163 157)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(53 151)') where c1 like 'd%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(96 183)') where c1 like 'r%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(57 91)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(202 110)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(120 137)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(207 147)') where c1 like 'c%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(31 125)') where c1 like 'e%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(27 36)') where c1 like 'r%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES + ('b', 'c', 'e', GeomFromText('POINT(41 137)')), + ('p', 'y', 'k', GeomFromText('POINT(50 22)')), + ('s', 'c', 'h', GeomFromText('POINT(208 173)')), + ('x', 'u', 'l', GeomFromText('POINT(199 175)')), + ('s', 'r', 'h', GeomFromText('POINT(85 192)')), + ('j', 'k', 'u', GeomFromText('POINT(18 25)')), + ('p', 'w', 'h', GeomFromText('POINT(152 197)')), + ('e', 'd', 'c', GeomFromText('POINT(229 3)')), + ('o', 'x', 'k', GeomFromText('POINT(187 155)')), + ('o', 'b', 'k', GeomFromText('POINT(208 150)')), + ('d', 'a', 'j', GeomFromText('POINT(70 87)')), + ('f', 'e', 'k', GeomFromText('POINT(156 96)')), + ('u', 'y', 'p', GeomFromText('POINT(239 193)')), + ('n', 'v', 'p', GeomFromText('POINT(223 98)')), + ('z', 'j', 'r', GeomFromText('POINT(87 89)')), + ('h', 'x', 'x', GeomFromText('POINT(92 0)')), + ('r', 'v', 'r', GeomFromText('POINT(159 139)')), + ('v', 'g', 'g', GeomFromText('POINT(16 229)')), + ('z', 'k', 'u', GeomFromText('POINT(99 52)')), + ('p', 'p', 'o', GeomFromText('POINT(105 125)')), + ('w', 'h', 'y', GeomFromText('POINT(105 154)')), + ('v', 'y', 'z', GeomFromText('POINT(134 238)')), + ('x', 'o', 'o', GeomFromText('POINT(178 88)')), + ('z', 'w', 'd', GeomFromText('POINT(123 60)')), + ('q', 'f', 'u', GeomFromText('POINT(64 90)')), + ('s', 'n', 't', GeomFromText('POINT(50 138)')), + ('v', 'p', 't', GeomFromText('POINT(114 91)')), + ('a', 'o', 'n', GeomFromText('POINT(78 43)')), + ('k', 'u', 'd', GeomFromText('POINT(185 161)')), + ('w', 'd', 'n', GeomFromText('POINT(25 92)')), + ('k', 'w', 'a', GeomFromText('POINT(59 238)')), + ('t', 'c', 'f', GeomFromText('POINT(65 87)')), + ('g', 's', 'p', GeomFromText('POINT(238 126)')), + ('d', 'n', 'y', GeomFromText('POINT(107 173)')), + ('l', 'a', 'w', GeomFromText('POINT(125 152)')), + ('m', 'd', 'j', GeomFromText('POINT(146 53)')), + ('q', 'm', 'c', GeomFromText('POINT(217 187)')), + ('i', 'r', 'r', GeomFromText('POINT(6 113)')), + ('e', 'j', 'b', GeomFromText('POINT(37 83)')), + ('w', 'w', 'h', GeomFromText('POINT(83 199)')), + ('k', 'b', 's', GeomFromText('POINT(170 64)')), + ('s', 'b', 'c', GeomFromText('POINT(163 130)')), + ('c', 'h', 'a', GeomFromText('POINT(141 3)')), + ('k', 'j', 'u', GeomFromText('POINT(143 76)')), + ('r', 'h', 'o', GeomFromText('POINT(243 92)')), + ('i', 'd', 'b', GeomFromText('POINT(205 13)')), + ('r', 'y', 'q', GeomFromText('POINT(138 8)')), + ('m', 'o', 'i', GeomFromText('POINT(36 45)')), + ('v', 'g', 'm', GeomFromText('POINT(0 40)')), + ('f', 'e', 'i', GeomFromText('POINT(76 6)')), + ('c', 'q', 'q', GeomFromText('POINT(115 248)')), + ('x', 'c', 'i', GeomFromText('POINT(29 74)')), + ('l', 's', 't', GeomFromText('POINT(83 18)')), + ('t', 't', 'a', GeomFromText('POINT(26 168)')), + ('u', 'n', 'x', GeomFromText('POINT(200 110)')), + ('j', 'b', 'd', GeomFromText('POINT(216 136)')), + ('s', 'p', 'w', GeomFromText('POINT(38 156)')), + ('f', 'b', 'v', GeomFromText('POINT(29 186)')), + ('v', 'e', 'r', GeomFromText('POINT(149 40)')), + ('v', 't', 'm', GeomFromText('POINT(184 24)')), + ('y', 'g', 'a', GeomFromText('POINT(219 105)')), + ('s', 'f', 'i', GeomFromText('POINT(114 130)')), + ('e', 'q', 'h', GeomFromText('POINT(203 135)')), + ('h', 'g', 'b', GeomFromText('POINT(9 208)')), + ('o', 'l', 'r', GeomFromText('POINT(245 79)')), + ('s', 's', 'v', GeomFromText('POINT(238 198)')), + ('w', 'w', 'z', GeomFromText('POINT(209 232)')), + ('v', 'd', 'n', GeomFromText('POINT(30 193)')), + ('q', 'w', 'k', GeomFromText('POINT(133 18)')), + ('o', 'h', 'o', GeomFromText('POINT(42 140)')), + ('f', 'f', 'h', GeomFromText('POINT(145 1)')), + ('u', 's', 'r', GeomFromText('POINT(70 62)')), + ('x', 'n', 'q', GeomFromText('POINT(33 86)')), + ('u', 'p', 'v', GeomFromText('POINT(232 220)')), + ('z', 'e', 'a', GeomFromText('POINT(130 69)')), + ('r', 'u', 'z', GeomFromText('POINT(243 241)')), + ('b', 'n', 't', GeomFromText('POINT(120 12)')), + ('u', 'f', 's', GeomFromText('POINT(190 212)')), + ('a', 'd', 'q', GeomFromText('POINT(235 191)')), + ('f', 'q', 'm', GeomFromText('POINT(176 2)')), + ('n', 'c', 's', GeomFromText('POINT(218 163)')), + ('e', 'm', 'h', GeomFromText('POINT(163 108)')), + ('c', 'f', 'l', GeomFromText('POINT(220 115)')), + ('c', 'v', 'q', GeomFromText('POINT(66 45)')), + ('w', 'v', 'x', GeomFromText('POINT(251 220)')), + ('f', 'w', 'z', GeomFromText('POINT(146 149)')), + ('h', 'n', 'h', GeomFromText('POINT(148 128)')), + ('y', 'k', 'v', GeomFromText('POINT(28 110)')), + ('c', 'x', 'q', GeomFromText('POINT(13 13)')), + ('e', 'd', 's', GeomFromText('POINT(91 190)')), + ('c', 'w', 'c', GeomFromText('POINT(10 231)')), + ('u', 'j', 'n', GeomFromText('POINT(250 21)')), + ('w', 'n', 'x', GeomFromText('POINT(141 69)')), + ('f', 'p', 'y', GeomFromText('POINT(228 246)')), + ('d', 'q', 'f', GeomFromText('POINT(194 22)')), + ('d', 'z', 'l', GeomFromText('POINT(233 181)')), + ('c', 'a', 'q', GeomFromText('POINT(183 96)')), + ('m', 'i', 'd', GeomFromText('POINT(117 226)')), + ('z', 'y', 'y', GeomFromText('POINT(62 81)')), + ('g', 'v', 'm', GeomFromText('POINT(66 158)')); +SET @@RAND_SEED1=481064922, @@RAND_SEED2=438133497; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=280535103, @@RAND_SEED2=444518646; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=1072017234, @@RAND_SEED2=484203885; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=358851897, @@RAND_SEED2=358495224; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +SET @@RAND_SEED1=509031459, @@RAND_SEED2=675962925; +DELETE FROM t1 ORDER BY RAND() LIMIT 10; +UPDATE t1 set spatial_point=GeomFromText('POINT(61 203)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(202 194)') where c1 like 'f%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(228 18)') where c1 like 'h%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(88 18)') where c1 like 'l%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(176 94)') where c1 like 'e%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(44 47)') where c1 like 'g%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(95 191)') where c1 like 'b%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(179 218)') where c1 like 'y%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(239 40)') where c1 like 'g%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(248 41)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(167 82)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(13 104)') where c1 like 'u%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(139 84)') where c1 like 'a%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(145 108)') where c1 like 'p%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(147 57)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(217 144)') where c1 like 'n%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(160 224)') where c1 like 'w%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(38 28)') where c1 like 'j%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(104 114)') where c1 like 'q%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(88 19)') where c1 like 'c%'; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES + ('f', 'x', 'p', GeomFromText('POINT(92 181)')), + ('s', 'i', 'c', GeomFromText('POINT(49 60)')), + ('c', 'c', 'i', GeomFromText('POINT(7 57)')), + ('n', 'g', 'k', GeomFromText('POINT(252 105)')), + ('g', 'b', 'm', GeomFromText('POINT(180 11)')), + ('u', 'l', 'r', GeomFromText('POINT(32 90)')), + ('c', 'x', 'e', GeomFromText('POINT(143 24)')), + ('x', 'u', 'a', GeomFromText('POINT(123 92)')), + ('s', 'b', 'h', GeomFromText('POINT(190 108)')), + ('c', 'x', 'b', GeomFromText('POINT(104 100)')), + ('i', 'd', 't', GeomFromText('POINT(214 104)')), + ('r', 'w', 'g', GeomFromText('POINT(29 67)')), + ('b', 'f', 'g', GeomFromText('POINT(149 46)')), + ('r', 'r', 'd', GeomFromText('POINT(242 196)')), + ('j', 'l', 'a', GeomFromText('POINT(90 196)')), + ('e', 't', 'b', GeomFromText('POINT(190 64)')), + ('l', 'x', 'w', GeomFromText('POINT(250 73)')), + ('q', 'y', 'r', GeomFromText('POINT(120 182)')), + ('s', 'j', 'a', GeomFromText('POINT(180 175)')), + ('n', 'i', 'y', GeomFromText('POINT(124 136)')), + ('s', 'x', 's', GeomFromText('POINT(176 209)')), + ('u', 'f', 's', GeomFromText('POINT(215 173)')), + ('m', 'j', 'x', GeomFromText('POINT(44 140)')), + ('v', 'g', 'x', GeomFromText('POINT(177 233)')), + ('u', 't', 'b', GeomFromText('POINT(136 197)')), + ('f', 'g', 'b', GeomFromText('POINT(10 8)')), + ('v', 'c', 'j', GeomFromText('POINT(13 81)')), + ('d', 's', 'q', GeomFromText('POINT(200 100)')), + ('a', 'p', 'j', GeomFromText('POINT(33 40)')), + ('i', 'c', 'g', GeomFromText('POINT(168 204)')), + ('k', 'h', 'i', GeomFromText('POINT(93 243)')), + ('s', 'b', 's', GeomFromText('POINT(157 13)')), + ('v', 'l', 'l', GeomFromText('POINT(103 6)')), + ('r', 'b', 'k', GeomFromText('POINT(244 137)')), + ('l', 'd', 'r', GeomFromText('POINT(162 254)')), + ('q', 'b', 'z', GeomFromText('POINT(136 246)')), + ('x', 'x', 'p', GeomFromText('POINT(120 37)')), + ('m', 'e', 'z', GeomFromText('POINT(203 167)')), + ('q', 'n', 'p', GeomFromText('POINT(94 119)')), + ('b', 'g', 'u', GeomFromText('POINT(93 248)')), + ('r', 'v', 'v', GeomFromText('POINT(53 88)')), + ('y', 'a', 'i', GeomFromText('POINT(98 219)')), + ('a', 's', 'g', GeomFromText('POINT(173 138)')), + ('c', 'a', 't', GeomFromText('POINT(235 135)')), + ('q', 'm', 'd', GeomFromText('POINT(224 208)')), + ('e', 'p', 'k', GeomFromText('POINT(161 238)')), + ('n', 'g', 'q', GeomFromText('POINT(35 204)')), + ('t', 't', 'x', GeomFromText('POINT(230 178)')), + ('w', 'f', 'a', GeomFromText('POINT(150 221)')), + ('z', 'm', 'z', GeomFromText('POINT(119 42)')), + ('l', 'j', 's', GeomFromText('POINT(97 96)')), + ('f', 'z', 'x', GeomFromText('POINT(208 65)')), + ('i', 'v', 'c', GeomFromText('POINT(145 79)')), + ('l', 'f', 'k', GeomFromText('POINT(83 234)')), + ('u', 'a', 's', GeomFromText('POINT(250 49)')), + ('o', 'k', 'p', GeomFromText('POINT(46 50)')), + ('d', 'e', 'z', GeomFromText('POINT(30 198)')), + ('r', 'r', 'l', GeomFromText('POINT(78 189)')), + ('y', 'l', 'f', GeomFromText('POINT(188 132)')), + ('d', 'q', 'm', GeomFromText('POINT(247 107)')), + ('p', 'j', 'n', GeomFromText('POINT(148 227)')), + ('b', 'o', 'i', GeomFromText('POINT(172 25)')), + ('e', 'v', 'd', GeomFromText('POINT(94 248)')), + ('q', 'd', 'f', GeomFromText('POINT(15 29)')), + ('w', 'b', 'b', GeomFromText('POINT(74 111)')), + ('g', 'q', 'f', GeomFromText('POINT(107 215)')), + ('o', 'h', 'r', GeomFromText('POINT(25 168)')), + ('u', 't', 'w', GeomFromText('POINT(251 188)')), + ('h', 's', 'w', GeomFromText('POINT(254 247)')), + ('f', 'f', 'b', GeomFromText('POINT(166 103)')); +SET @@RAND_SEED1=866613816, @@RAND_SEED2=92289615; +INSERT INTO t1 (c2, c1, c3, spatial_point) VALUES + ('l', 'c', 'l', GeomFromText('POINT(202 98)')), + ('k', 'c', 'b', GeomFromText('POINT(46 206)')), + ('r', 'y', 'm', GeomFromText('POINT(74 140)')), + ('y', 'z', 'd', GeomFromText('POINT(200 160)')), + ('s', 'y', 's', GeomFromText('POINT(156 205)')), + ('u', 'v', 'p', GeomFromText('POINT(86 82)')), + ('j', 's', 's', GeomFromText('POINT(91 233)')), + ('x', 'j', 'f', GeomFromText('POINT(3 14)')), + ('l', 'z', 'v', GeomFromText('POINT(123 156)')), + ('h', 'i', 'o', GeomFromText('POINT(145 229)')), + ('o', 'r', 'd', GeomFromText('POINT(15 22)')), + ('f', 'x', 't', GeomFromText('POINT(21 60)')), + ('t', 'g', 'h', GeomFromText('POINT(50 153)')), + ('g', 'u', 'b', GeomFromText('POINT(82 85)')), + ('v', 'a', 'p', GeomFromText('POINT(231 178)')), + ('n', 'v', 'o', GeomFromText('POINT(183 25)')), + ('j', 'n', 'm', GeomFromText('POINT(50 144)')), + ('e', 'f', 'i', GeomFromText('POINT(46 16)')), + ('d', 'w', 'a', GeomFromText('POINT(66 6)')), + ('f', 'x', 'a', GeomFromText('POINT(107 197)')), + ('m', 'o', 'a', GeomFromText('POINT(142 80)')), + ('q', 'l', 'g', GeomFromText('POINT(251 23)')), + ('c', 's', 's', GeomFromText('POINT(158 43)')), + ('y', 'd', 'o', GeomFromText('POINT(196 228)')), + ('d', 'p', 'l', GeomFromText('POINT(107 5)')), + ('h', 'a', 'b', GeomFromText('POINT(183 166)')), + ('m', 'w', 'p', GeomFromText('POINT(19 59)')), + ('b', 'y', 'o', GeomFromText('POINT(178 30)')), + ('x', 'w', 'i', GeomFromText('POINT(168 94)')), + ('t', 'k', 'z', GeomFromText('POINT(171 5)')), + ('r', 'm', 'a', GeomFromText('POINT(222 19)')), + ('u', 'v', 'e', GeomFromText('POINT(224 80)')), + ('q', 'r', 'k', GeomFromText('POINT(212 218)')), + ('d', 'p', 'j', GeomFromText('POINT(169 7)')), + ('d', 'r', 'v', GeomFromText('POINT(193 23)')), + ('n', 'y', 'y', GeomFromText('POINT(130 178)')), + ('m', 'z', 'r', GeomFromText('POINT(81 200)')), + ('j', 'e', 'w', GeomFromText('POINT(145 239)')), + ('v', 'h', 'x', GeomFromText('POINT(24 105)')), + ('z', 'm', 'a', GeomFromText('POINT(175 129)')), + ('b', 'c', 'v', GeomFromText('POINT(213 10)')), + ('t', 't', 'u', GeomFromText('POINT(2 129)')), + ('r', 's', 'v', GeomFromText('POINT(209 192)')), + ('x', 'p', 'g', GeomFromText('POINT(43 63)')), + ('t', 'e', 'u', GeomFromText('POINT(139 210)')), + ('l', 'e', 't', GeomFromText('POINT(245 148)')), + ('a', 'i', 'k', GeomFromText('POINT(167 195)')), + ('m', 'o', 'h', GeomFromText('POINT(206 120)')), + ('g', 'z', 's', GeomFromText('POINT(169 240)')), + ('z', 'u', 's', GeomFromText('POINT(202 120)')), + ('i', 'b', 'a', GeomFromText('POINT(216 18)')), + ('w', 'y', 'g', GeomFromText('POINT(119 236)')), + ('h', 'y', 'p', GeomFromText('POINT(161 24)')); +UPDATE t1 set spatial_point=GeomFromText('POINT(33 100)') where c1 like 't%'; +UPDATE t1 set spatial_point=GeomFromText('POINT(41 46)') where c1 like 'f%'; +CHECK TABLE t1 EXTENDED; +DROP TABLE t1; + # End of 4.1 tests # diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index f2a021051b6..07923fa020c 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -430,6 +430,32 @@ CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; DROP TABLE t1, tm1; +# +# Bug#26464 - insert delayed + update + merge = corruption +# +CREATE TABLE t1(c1 INT) ENGINE=MyISAM; +CREATE TABLE t2(c1 INT) ENGINE=MERGE UNION=(t1); +--error 1031 +INSERT DELAYED INTO t2 VALUES(1); +DROP TABLE t1, t2; + +# +# BUG#26881 - Large MERGE tables report incorrect specification when no +# differences in tables +# +CREATE TABLE t1(c1 VARCHAR(1)); +CREATE TABLE m1 LIKE t1; +ALTER TABLE m1 ENGINE=MERGE UNION=(t1); +SELECT * FROM m1; +DROP TABLE t1, m1; + +CREATE TABLE t1(c1 VARCHAR(4), c2 TINYINT, c3 TINYINT, c4 TINYINT, + c5 TINYINT, c6 TINYINT, c7 TINYINT, c8 TINYINT, c9 TINYINT); +CREATE TABLE m1 LIKE t1; +ALTER TABLE m1 ENGINE=MERGE UNION=(t1); +SELECT * FROM m1; +DROP TABLE t1, m1; + # End of 4.1 tests # diff --git a/mysql-test/t/ndb_single_user.test b/mysql-test/t/ndb_single_user.test new file mode 100644 index 00000000000..c655124f79f --- /dev/null +++ b/mysql-test/t/ndb_single_user.test @@ -0,0 +1,84 @@ +-- source include/have_ndb.inc +-- source include/have_multi_ndb.inc +-- source include/ndb_default_cluster.inc +-- source include/not_embedded.inc + +--disable_warnings +use test; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; +--enable_warnings + +# operations allowed while cluster is in single user mode + +--connection server1 +--let $node_id= `SHOW STATUS LIKE 'Ndb_cluster_node_id'` +--disable_query_log +--eval set @node_id= SUBSTRING('$node_id', 20)+0 +--enable_query_log +--let $node_id= `SELECT @node_id` +--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "enter single user mode $node_id" >> $NDB_TOOLS_OUTPUT +--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" --single-user >> $NDB_TOOLS_OUTPUT + +# verify that we are indeed in single user mode +--connection server2 +--error 1005 +create table t1 (a int key, b int unique, c int) engine ndb; + +# test some sql on first mysqld +--connection server1 +create table t1 (a int key, b int unique, c int) engine ndb; +insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); +create table t2 as select * from t1; +# read with pk +select * from t1 where a = 1; +# read with unique index +select * from t1 where b = 4; +# read with ordered index +select * from t1 where a > 4 order by a; +# update with pk +update t1 set b=102 where a = 2; +# update with unique index +update t1 set b=103 where b = 3; +# update with full table scan +update t1 set b=b+100; +# update with ordered insex scan +update t1 set b=b+100 where a > 7; +# delete with full table scan +delete from t1; +insert into t1 select * from t2; + +# test some sql on other mysqld +--connection server2 +--error 1051 +drop table t1; +--error 1146 +#--error 1296 +create index new_index on t1 (c); +--error 1146 +#--error 1296 +insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); +--error 1146 +#--error 1296 +select * from t1 where a = 1; +--error 1146 +#--error 1296 +select * from t1 where b = 4; +--error 1146 +#--error 1296 +update t1 set b=102 where a = 2; +--error 1146 +#--error 1296 +update t1 set b=103 where b = 3; +--error 1146 +#--error 1296 +update t1 set b=b+100; +--error 1146 +#--error 1296 +update t1 set b=b+100 where a > 7; + +--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT +--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT + +# cleanup +--connection server1 +drop table t1; diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 77933d57d21..f529b559fb0 100755 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -39,7 +39,7 @@ ADD_LIBRARY(mysys array.c charset-def.c charset.c checksum.c default.c default_m my_mkdir.c my_mmap.c my_net.c my_once.c my_open.c my_pread.c my_pthread.c my_quick.c my_read.c my_realloc.c my_redel.c my_rename.c my_seek.c my_sleep.c my_static.c my_symlink.c my_symlink2.c my_sync.c my_thr_init.c my_wincond.c - my_windac.c my_winsem.c my_winthread.c my_write.c ptr_cmp.c queues.c + my_windac.c my_winthread.c my_write.c ptr_cmp.c queues.c rijndael.c safemalloc.c sha1.c string.c thr_alarm.c thr_lock.c thr_mutex.c thr_rwlock.c tree.c typelib.c base64.c my_memmem.c my_getpagesize.c) diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 8f810598a47..a835492e670 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -50,7 +50,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ my_sync.c my_getopt.c my_mkdir.c \ default_modify.c default.c \ my_compress.c checksum.c raid.cc \ - my_net.c my_semaphore.c my_port.c my_sleep.c \ + my_net.c my_port.c my_sleep.c \ charset.c charset-def.c my_bitmap.c my_bit.c md5.c \ my_gethostbyname.c rijndael.c my_aes.c sha1.c \ my_handler.c my_netware.c my_largepage.c \ @@ -58,7 +58,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c my_mmap.c \ my_windac.c my_access.c base64.c my_libwrap.c EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c mf_soundex.c my_conio.c \ - my_wincond.c my_winsem.c my_winthread.c CMakeLists.txt + my_wincond.c my_winthread.c CMakeLists.txt libmysys_a_LIBADD = @THREAD_LOBJECTS@ # test_dir_DEPENDENCIES= $(LIBRARIES) # testhash_DEPENDENCIES= $(LIBRARIES) diff --git a/mysys/my_semaphore.c b/mysys/my_semaphore.c deleted file mode 100644 index efabd4b42d9..00000000000 --- a/mysys/my_semaphore.c +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2003 MySQL AB - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* - Simple implementation of semaphores, needed to compile MySQL on systems - that doesn't support semaphores. -*/ - -#include -#include -#include - -#if !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD) - -int sem_init(sem_t * sem, int pshared, uint value) -{ - sem->count=value; - pthread_cond_init(&sem->cond, 0); - pthread_mutex_init(&sem->mutex, 0); - return 0; -} - -int sem_destroy(sem_t * sem) -{ - int err1,err2; - err1=pthread_cond_destroy(&sem->cond); - err2=pthread_mutex_destroy(&sem->mutex); - if (err1 || err2) - { - errno=err1 ? err1 : err2; - return -1; - } - return 0; -} - -int sem_wait(sem_t * sem) -{ - if ((errno=pthread_mutex_lock(&sem->mutex))) - return -1; - while (!sem->count) - pthread_cond_wait(&sem->cond, &sem->mutex); - if (errno) - return -1; - sem->count--; /* mutex is locked here */ - pthread_mutex_unlock(&sem->mutex); - return 0; -} - -int sem_trywait(sem_t * sem) -{ - if ((errno=pthread_mutex_lock(&sem->mutex))) - return -1; - if (sem->count) - sem->count--; - else - errno=EAGAIN; - pthread_mutex_unlock(&sem->mutex); - return errno ? -1 : 0; -} - - -int sem_post(sem_t * sem) -{ - if ((errno=pthread_mutex_lock(&sem->mutex))) - return -1; - sem->count++; - pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */ - pthread_cond_signal(&sem->cond); /* first: x_unlock or x_signal ? */ - return 0; -} - -int sem_post_multiple(sem_t * sem, uint count) -{ - if ((errno=pthread_mutex_lock(&sem->mutex))) - return -1; - sem->count+=count; - pthread_mutex_unlock(&sem->mutex); /* does it really matter what to do */ - pthread_cond_broadcast(&sem->cond); /* first: x_unlock or x_broadcast ? */ - return 0; -} - -int sem_getvalue(sem_t * sem, uint *sval) -{ - if ((errno=pthread_mutex_lock(&sem->mutex))) - return -1; - *sval=sem->count; - pthread_mutex_unlock(&sem->mutex); - return 0; -} - -#endif /* !defined(__WIN__) && !defined(HAVE_SEMAPHORE_H) && defined(THREAD) */ diff --git a/mysys/my_winsem.c b/mysys/my_winsem.c deleted file mode 100644 index e2713d189b2..00000000000 --- a/mysys/my_winsem.c +++ /dev/null @@ -1,406 +0,0 @@ -/* - * ------------------------------------------------------------- - * - * Module: my_semaphore.c (Original: semaphore.c from pthreads library) - * - * Purpose: - * Semaphores aren't actually part of the PThreads standard. - * They are defined by the POSIX Standard: - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * ------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright (C) 1998 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA - */ - -/* - NEED_SEM is not used in MySQL and should only be needed under - Windows CE. - - The big changes compared to the original version was to not allocate - any additional memory in sem_init() but to instead store everthing - we need in sem_t. - - TODO: - To get HAVE_CREATESEMAPHORE we have to define the struct - in my_semaphore.h -*/ - -#include "mysys_priv.h" -#ifdef __WIN__ -#include "my_semaphore.h" -#include - -/* - DOCPUBLIC - This function initializes an unnamed semaphore. the - initial value of the semaphore is 'value' - - PARAMETERS - sem Pointer to an instance of sem_t - - pshared If zero, this semaphore may only be shared between - threads in the same process. - If nonzero, the semaphore can be shared between - processes - - value Initial value of the semaphore counter - - RESULTS - 0 Successfully created semaphore, - -1 Failed, error in errno - - ERRNO - EINVAL 'sem' is not a valid semaphore, - ENOSPC A required resource has been exhausted, - ENOSYS Semaphores are not supported, - EPERM The process lacks appropriate privilege - -*/ - -int -sem_init (sem_t *sem, int pshared, unsigned int value) -{ - int result = 0; - - if (pshared != 0) - { - /* - We don't support creating a semaphore that can be shared between - processes - */ - result = EPERM; - } - else - { -#ifndef HAVE_CREATESEMAPHORE - sem->value = value; - sem->event = CreateEvent(NULL, - FALSE, /* manual reset */ - FALSE, /* initial state */ - NULL); - if (!sem->event) - result = ENOSPC; - else - { - if (value) - SetEvent(sem->event); - InitializeCriticalSection(&sem->sem_lock_cs); - } -#else /* HAVE_CREATESEMAPHORE */ - *sem = CreateSemaphore (NULL, /* Always NULL */ - value, /* Initial value */ - 0x7FFFFFFFL, /* Maximum value */ - NULL); /* Name */ - if (!*sem) - result = ENOSPC; -#endif /* HAVE_CREATESEMAPHORE */ - } - if (result != 0) - { - errno = result; - return -1; - } - return 0; -} /* sem_init */ - - -/* - DOCPUBLIC - This function destroys an unnamed semaphore. - - PARAMETERS - sem Pointer to an instance of sem_t - - RESULTS - 0 Successfully destroyed semaphore, - -1 Failed, error in errno - ERRNO - EINVAL 'sem' is not a valid semaphore, - ENOSYS Semaphores are not supported, - EBUSY Threads (or processes) are currently blocked on 'sem' -*/ - -int -sem_destroy (sem_t * sem) -{ - int result = 0; - -#ifdef EXTRA_DEBUG - if (sem == NULL || *sem == NULL) - { - errno=EINVAL; - return; - } -#endif /* EXTRA_DEBUG */ - -#ifndef HAVE_CREATESEMAPHORE - if (! CloseHandle(sem->event)) - result = EINVAL; - else - DeleteCriticalSection(&sem->sem_lock_cs); -#else /* HAVE_CREATESEMAPHORE */ - if (!CloseHandle(*sem)) - result = EINVAL; -#endif /* HAVE_CREATESEMAPHORE */ - if (result) - { - errno = result; - return -1; - } - *sem=0; /* Safety */ - return 0; -} /* sem_destroy */ - - -/* - DOCPUBLIC - This function tries to wait on a semaphore. If the - semaphore value is greater than zero, it decreases - its value by one. If the semaphore value is zero, then - this function returns immediately with the error EAGAIN - - PARAMETERS - sem Pointer to an instance of sem_t - - RESULTS - 0 Successfully decreased semaphore, - -1 Failed, error in errno - - ERRNO - EAGAIN The semaphore was already locked, - EINVAL 'sem' is not a valid semaphore, - ENOSYS Semaphores are not supported, - EINTR The function was interrupted by a signal, - EDEADLK A deadlock condition was detected. -*/ - -int -sem_trywait(sem_t * sem) -{ -#ifndef HAVE_CREATESEMAPHORE - /* not yet implemented! */ - int errno = EINVAL; - return -1; -#else /* HAVE_CREATESEMAPHORE */ -#ifdef EXTRA_DEBUG - if (sem == NULL || *sem == NULL) - { - errno=EINVAL; - return -1; - } -#endif /* EXTRA_DEBUG */ - if (WaitForSingleObject (*sem, 0) == WAIT_TIMEOUT) - { - errno= EAGAIN; - return -1; - } - return 0; -#endif /* HAVE_CREATESEMAPHORE */ - -} /* sem_trywait */ - - -#ifndef HAVE_CREATESEMAPHORE - -static void -ptw32_decrease_semaphore(sem_t * sem) -{ - EnterCriticalSection(&sem->sem_lock_cs); - DBUG_ASSERT(sem->value != 0); - sem->value--; - if (sem->value != 0) - SetEvent(sem->event); - LeaveCriticalSection(&sem->sem_lock_cs); -} - -static BOOL -ptw32_increase_semaphore(sem_t * sem, unsigned int n) -{ - BOOL result=FALSE; - - EnterCriticalSection(&sem->sem_lock_cs); - if (sem->value + n > sem->value) - { - sem->value += n; - SetEvent(sem->event); - result = TRUE; - } - LeaveCriticalSection(&sem->sem_lock_cs); - return result; -} - -#endif /* HAVE_CREATESEMAPHORE */ - - -/* - ------------------------------------------------------ - DOCPUBLIC - This function waits on a semaphore. If the - semaphore value is greater than zero, it decreases - its value by one. If the semaphore value is zero, then - the calling thread (or process) is blocked until it can - successfully decrease the value or until interrupted by - a signal. - - PARAMETERS - sem Pointer to an instance of sem_t - - RESULTS - 0 Successfully decreased semaphore, - -1 Failed, error in errno - - ERRNO - EINVAL 'Sem' is not a valid semaphore, - ENOSYS Semaphores are not supported, - EINTR The function was interrupted by a signal, - EDEADLK A deadlock condition was detected. -*/ - -int -sem_wait(sem_t *sem) -{ - int result; - -#ifdef EXTRA_DEBUG - if (sem == NULL || *sem == NULL) - { - errno=EINVAL; - return -1; - } -#endif /* EXTRA_DEBUG */ - -#ifndef HAVE_CREATESEMAPHORE - result=WaitForSingleObject(sem->event, INFINITE); -#else - result=WaitForSingleObject(*sem, INFINITE); -#endif - if (result == WAIT_FAILED || result == WAIT_ABANDONED_0) - result = EINVAL; - else if (result == WAIT_TIMEOUT) - result = ETIMEDOUT; - else - result=0; - if (result) - { - errno = result; - return -1; - } -#ifndef HAVE_CREATESEMAPHORE - ptw32_decrease_semaphore(sem); -#endif /* HAVE_CREATESEMAPHORE */ - return 0; -} - - -/* - ------------------------------------------------------ - DOCPUBLIC - This function posts a wakeup to a semaphore. If there - are waiting threads (or processes), one is awakened; - otherwise, the semaphore value is incremented by one. - - PARAMETERS - sem Pointer to an instance of sem_t - - RESULTS - 0 Successfully posted semaphore, - -1 Failed, error in errno - - ERRNO - EINVAL 'sem' is not a valid semaphore, - ENOSYS Semaphores are not supported, - -*/ - -int -sem_post (sem_t * sem) -{ -#ifdef EXTRA_DEBUG - if (sem == NULL || *sem == NULL) - { - errno=EINVAL; - return -1; - } -#endif /* EXTRA_DEBUG */ - -#ifndef HAVE_CREATESEMAPHORE - if (! ptw32_increase_semaphore(sem, 1)) -#else /* HAVE_CREATESEMAPHORE */ - if (! ReleaseSemaphore(*sem, 1, 0)) -#endif /* HAVE_CREATESEMAPHORE */ - { - errno=EINVAL; - return -1; - } - return 0; -} - - -/* - ------------------------------------------------------ - DOCPUBLIC - This function posts multiple wakeups to a semaphore. If there - are waiting threads (or processes), n <= count are awakened; - the semaphore value is incremented by count - n. - - PARAMETERS - sem Pointer to an instance of sem_t - count Counter, must be greater than zero. - - RESULTS - 0 Successfully posted semaphore, - -1 Failed, error in errno - - ERRNO - EINVAL 'sem' is not a valid semaphore or count is less - than or equal to zero. -*/ - -int -sem_post_multiple (sem_t * sem, unsigned int count) -{ -#ifdef EXTRA_DEBUG - if (sem == NULL || *sem == NULL || count <= 0) - { - errno=EINVAL; - return -1; - } -#endif /* EXTRA_DEBUG */ -#ifndef HAVE_CREATESEMAPHORE - if (! ptw32_increase_semaphore (sem, count)) -#else /* HAVE_CREATESEMAPHORE */ - if (! ReleaseSemaphore(*sem, count, 0)) -#endif /* HAVE_CREATESEMAPHORE */ - { - errno = EINVAL; - return -1; - } - return 0; -} - -int -sem_getvalue (sem_t *sem, unsigned int *sval) -{ - errno = ENOSYS; - return -1; -} /* sem_getvalue */ - -#endif /* __WIN__ */ diff --git a/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/ndb/src/kernel/blocks/dbdict/Dbdict.cpp index 9c4ca9f26d9..e2091dd509a 100644 --- a/ndb/src/kernel/blocks/dbdict/Dbdict.cpp +++ b/ndb/src/kernel/blocks/dbdict/Dbdict.cpp @@ -2910,9 +2910,7 @@ Dbdict::execCREATE_TABLE_REQ(Signal* signal){ break; } - if(getNodeState().getSingleUserMode() && - (refToNode(signal->getSendersBlockRef()) != - getNodeState().getSingleUserApi())) + if (checkSingleUserMode(signal->getSendersBlockRef())) { jam(); parseRecord.errorCode = CreateTableRef::SingleUser; @@ -3081,9 +3079,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal) return; } - if(getNodeState().getSingleUserMode() && - (refToNode(signal->getSendersBlockRef()) != - getNodeState().getSingleUserApi())) + if (checkSingleUserMode(signal->getSendersBlockRef())) { jam(); alterTableRef(signal, req, AlterTableRef::SingleUser); @@ -5414,9 +5410,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){ return; } - if(getNodeState().getSingleUserMode() && - (refToNode(signal->getSendersBlockRef()) != - getNodeState().getSingleUserApi())) + if (checkSingleUserMode(signal->getSendersBlockRef())) { jam(); dropTableRef(signal, req, DropTableRef::SingleUser); @@ -6553,9 +6547,7 @@ Dbdict::execCREATE_INDX_REQ(Signal* signal) jam(); tmperr = CreateIndxRef::Busy; } - else if(getNodeState().getSingleUserMode() && - (refToNode(senderRef) != - getNodeState().getSingleUserApi())) + else if (checkSingleUserMode(senderRef)) { jam(); tmperr = CreateIndxRef::SingleUser; @@ -7130,9 +7122,7 @@ Dbdict::execDROP_INDX_REQ(Signal* signal) jam(); tmperr = DropIndxRef::Busy; } - else if(getNodeState().getSingleUserMode() && - (refToNode(senderRef) != - getNodeState().getSingleUserApi())) + else if (checkSingleUserMode(senderRef)) { jam(); tmperr = DropIndxRef::SingleUser; @@ -10574,4 +10564,20 @@ Dbdict::getMetaAttribute(MetaData::Attribute& attr, const MetaData::Table& table return 0; } +/* + return 1 if all of the below is true + a) node in single user mode + b) senderRef is not a db node + c) senderRef nodeid is not the singleUserApi +*/ + +int Dbdict::checkSingleUserMode(Uint32 senderRef) +{ + Uint32 nodeId = refToNode(senderRef); + return + getNodeState().getSingleUserMode() && + (getNodeInfo(nodeId).m_type != NodeInfo::DB) && + (nodeId != getNodeState().getSingleUserApi()); +} + CArray g_key_descriptor_pool; diff --git a/ndb/src/kernel/blocks/dbdict/Dbdict.hpp b/ndb/src/kernel/blocks/dbdict/Dbdict.hpp index 823e8898864..b2a99751413 100644 --- a/ndb/src/kernel/blocks/dbdict/Dbdict.hpp +++ b/ndb/src/kernel/blocks/dbdict/Dbdict.hpp @@ -2003,6 +2003,8 @@ private: int getMetaTable(MetaData::Table& table, const char* tableName); int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, Uint32 attributeId); int getMetaAttribute(MetaData::Attribute& attribute, const MetaData::Table& table, const char* attributeName); + + int checkSingleUserMode(Uint32 senderRef); }; #endif diff --git a/ndb/src/ndbapi/NdbBlob.cpp b/ndb/src/ndbapi/NdbBlob.cpp index 00b7441a37c..f0e6bf2e720 100644 --- a/ndb/src/ndbapi/NdbBlob.cpp +++ b/ndb/src/ndbapi/NdbBlob.cpp @@ -800,7 +800,9 @@ NdbBlob::writeDataPrivate(const char* buf, Uint32 bytes) DBUG_RETURN(-1); Uint32 n = thePartSize - off; if (n > len) { - memset(thePartBuf.data + off + len, theFillChar, n - len); + /* If we are adding data at the end, fill rest of part. */ + if (pos + len >= theLength) + memset(thePartBuf.data + off + len, theFillChar, n - len); n = len; } memcpy(thePartBuf.data + off, buf, n); diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index 2203a2d1c7a..395767e423a 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -880,6 +880,7 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal, r = m_transporter->sendSignal(signal, aNodeId); } if(r != 0){ + m_error.code= 4007; m_transporter->unlock_mutex(); continue; } @@ -903,7 +904,10 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal, * Handle error codes */ if(m_waiter.m_state == WAIT_NODE_FAILURE) + { + m_error.code = 4013; continue; + } if(m_waiter.m_state == WST_WAIT_TIMEOUT) { diff --git a/ndb/src/ndbapi/NdbRecAttr.cpp b/ndb/src/ndbapi/NdbRecAttr.cpp index 18e17071777..abfbd76d2c3 100644 --- a/ndb/src/ndbapi/NdbRecAttr.cpp +++ b/ndb/src/ndbapi/NdbRecAttr.cpp @@ -55,7 +55,7 @@ NdbRecAttr::setup(const NdbColumnImpl* anAttrInfo, char* aValue) if (theStorageX) delete[] theStorageX; - + // check alignment to signal data // a future version could check alignment per data type as well @@ -181,7 +181,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) out << "[NULL]"; return out; } - + const NdbDictionary::Column* c = r.getColumn(); uint length = c->getLength(); if (length > 1) @@ -192,196 +192,200 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) if (j > 0) out << " "; - switch(r.getType()) - { - case NdbDictionary::Column::Bigunsigned: - out << r.u_64_value(); - break; - case NdbDictionary::Column::Bit: - out << hex << "H'" << r.u_32_value() << dec; - break; - case NdbDictionary::Column::Unsigned: - out << r.u_32_value(); - break; - case NdbDictionary::Column::Smallunsigned: - out << r.u_short_value(); - break; - case NdbDictionary::Column::Tinyunsigned: - out << (unsigned) r.u_char_value(); - break; - case NdbDictionary::Column::Bigint: - out << r.int64_value(); - break; - case NdbDictionary::Column::Int: - out << r.int32_value(); - break; - case NdbDictionary::Column::Smallint: - out << r.short_value(); - break; - case NdbDictionary::Column::Tinyint: - out << (int) r.char_value(); - break; - case NdbDictionary::Column::Binary: - ndbrecattr_print_string(out,"Binary",r.aRef(),r.arraySize()); - j = r.arraySize(); - break; - case NdbDictionary::Column::Char: - ndbrecattr_print_string(out,"Char",r.aRef(),r.arraySize()); - j = length; - break; - case NdbDictionary::Column::Varchar: - { - unsigned len = *(const unsigned char*)r.aRef(); - ndbrecattr_print_string(out,"Varchar", r.aRef()+1,len); - j = length; - } - break; - case NdbDictionary::Column::Varbinary: - { - unsigned len = *(const unsigned char*)r.aRef(); - ndbrecattr_print_string(out,"Varbinary", r.aRef()+1,len); - j = length; - } - break; - case NdbDictionary::Column::Float: - out << r.float_value(); - break; - case NdbDictionary::Column::Double: - out << r.double_value(); - break; - case NdbDictionary::Column::Olddecimal: - { - short len = 1 + c->getPrecision() + (c->getScale() > 0); - out.print("%.*s", len, r.aRef()); - } - break; - case NdbDictionary::Column::Olddecimalunsigned: - { - short len = 0 + c->getPrecision() + (c->getScale() > 0); - out.print("%.*s", len, r.aRef()); - } - break; - case NdbDictionary::Column::Decimal: - case NdbDictionary::Column::Decimalunsigned: - goto unknown; // TODO - break; - // for dates cut-and-paste from field.cc - case NdbDictionary::Column::Datetime: - { - ulonglong tmp=r.u_64_value(); - long part1,part2,part3; - part1=(long) (tmp/LL(1000000)); - part2=(long) (tmp - (ulonglong) part1*LL(1000000)); - char buf[40]; - char* pos=(char*) buf+19; - *pos--=0; - *pos--= (char) ('0'+(char) (part2%10)); part2/=10; - *pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10); - *pos--= ':'; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos--= ':'; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos--= (char) ('0'+(char) part3); - *pos--= '/'; - *pos--= (char) ('0'+(char) (part1%10)); part1/=10; - *pos--= (char) ('0'+(char) (part1%10)); part1/=10; - *pos--= '-'; - *pos--= (char) ('0'+(char) (part1%10)); part1/=10; - *pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10); - *pos--= '-'; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos--= (char) ('0'+(char) (part3%10)); part3/=10; - *pos=(char) ('0'+(char) part3); - out << buf; - } - break; - case NdbDictionary::Column::Date: - { - uint32 tmp=(uint32) uint3korr(r.aRef()); - int part; - char buf[40]; - char *pos=(char*) buf+10; - *pos--=0; - part=(int) (tmp & 31); - *pos--= (char) ('0'+part%10); - *pos--= (char) ('0'+part/10); - *pos--= '-'; - part=(int) (tmp >> 5 & 15); - *pos--= (char) ('0'+part%10); - *pos--= (char) ('0'+part/10); - *pos--= '-'; - part=(int) (tmp >> 9); - *pos--= (char) ('0'+part%10); part/=10; - *pos--= (char) ('0'+part%10); part/=10; - *pos--= (char) ('0'+part%10); part/=10; - *pos= (char) ('0'+part); - out << buf; - } - break; - case NdbDictionary::Column::Time: - { - long tmp=(long) sint3korr(r.aRef()); - int hour=(uint) (tmp/10000); - int minute=(uint) (tmp/100 % 100); - int second=(uint) (tmp % 100); - char buf[40]; - sprintf(buf, "%02d:%02d:%02d", hour, minute, second); - out << buf; - } - break; - case NdbDictionary::Column::Year: - { - uint year = 1900 + r.u_char_value(); - char buf[40]; - sprintf(buf, "%04d", year); - out << buf; - } - break; - case NdbDictionary::Column::Timestamp: - { - time_t time = r.u_32_value(); - out << (uint)time; - } - break; - case NdbDictionary::Column::Blob: - case NdbDictionary::Column::Text: - { - // user defined aRef() may not be aligned to Uint64 - NdbBlob::Head head; - memcpy(&head, r.aRef(), sizeof(head)); - out << head.length << ":"; - const unsigned char* p = (const unsigned char*)r.aRef() + sizeof(head); - if (r.arraySize() < sizeof(head)) - out << "***error***"; // really cannot happen - else { - unsigned n = r.arraySize() - sizeof(head); - for (unsigned k = 0; k < n && k < head.length; k++) { - if (r.getType() == NdbDictionary::Column::Blob) - out.print("%02X", (int)p[k]); - else - out.print("%c", (int)p[k]); - } - } - j = length; - } + switch(r.getType()){ + case NdbDictionary::Column::Bigunsigned: + out << r.u_64_value(); break; - case NdbDictionary::Column::Longvarchar: - { - unsigned len = uint2korr(r.aRef()); - ndbrecattr_print_string(out,"Longvarchar", r.aRef()+2,len); - j = length; + case NdbDictionary::Column::Bit: + out << hex << "H'" << r.u_32_value() << dec; + break; + case NdbDictionary::Column::Unsigned: + out << r.u_32_value(); + break; + case NdbDictionary::Column::Smallunsigned: + out << r.u_short_value(); + break; + case NdbDictionary::Column::Tinyunsigned: + out << (unsigned) r.u_char_value(); + break; + case NdbDictionary::Column::Bigint: + out << r.int64_value(); + break; + case NdbDictionary::Column::Int: + out << r.int32_value(); + break; + case NdbDictionary::Column::Smallint: + out << r.short_value(); + break; + case NdbDictionary::Column::Tinyint: + out << (int) r.char_value(); + break; + case NdbDictionary::Column::Binary: + j = r.arraySize(); + ndbrecattr_print_string(out,"Binary", r.aRef(), j); + break; + case NdbDictionary::Column::Char: + j = length; + ndbrecattr_print_string(out,"Char", r.aRef(), r.arraySize()); + break; + case NdbDictionary::Column::Varchar: + { + unsigned len = *(const unsigned char*)r.aRef(); + ndbrecattr_print_string(out,"Varchar", r.aRef()+1,len); + j = length; + } + break; + case NdbDictionary::Column::Varbinary: + { + unsigned len = *(const unsigned char*)r.aRef(); + ndbrecattr_print_string(out,"Varbinary", r.aRef()+1,len); + j = length; + } + break; + case NdbDictionary::Column::Float: + out << r.float_value(); + break; + case NdbDictionary::Column::Double: + out << r.double_value(); + break; + case NdbDictionary::Column::Olddecimal: + { + short len = 1 + c->getPrecision() + (c->getScale() > 0); + out.print("%.*s", len, r.aRef()); + } + break; + case NdbDictionary::Column::Olddecimalunsigned: + { + short len = 0 + c->getPrecision() + (c->getScale() > 0); + out.print("%.*s", len, r.aRef()); + } + break; + case NdbDictionary::Column::Decimal: + case NdbDictionary::Column::Decimalunsigned: + goto unknown; // TODO + break; + // for dates cut-and-paste from field.cc + case NdbDictionary::Column::Datetime: + { + ulonglong tmp=r.u_64_value(); + long part1,part2,part3; + part1=(long) (tmp/LL(1000000)); + part2=(long) (tmp - (ulonglong) part1*LL(1000000)); + char buf[40]; + char* pos=(char*) buf+19; + *pos--=0; + *pos--= (char) ('0'+(char) (part2%10)); part2/=10; + *pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10); + *pos--= ':'; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos--= ':'; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos--= (char) ('0'+(char) part3); + *pos--= '/'; + *pos--= (char) ('0'+(char) (part1%10)); part1/=10; + *pos--= (char) ('0'+(char) (part1%10)); part1/=10; + *pos--= '-'; + *pos--= (char) ('0'+(char) (part1%10)); part1/=10; + *pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10); + *pos--= '-'; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos--= (char) ('0'+(char) (part3%10)); part3/=10; + *pos=(char) ('0'+(char) part3); + out << buf; + } + break; + case NdbDictionary::Column::Date: + { + uint32 tmp=(uint32) uint3korr(r.aRef()); + int part; + char buf[40]; + char *pos=(char*) buf+10; + *pos--=0; + part=(int) (tmp & 31); + *pos--= (char) ('0'+part%10); + *pos--= (char) ('0'+part/10); + *pos--= '-'; + part=(int) (tmp >> 5 & 15); + *pos--= (char) ('0'+part%10); + *pos--= (char) ('0'+part/10); + *pos--= '-'; + part=(int) (tmp >> 9); + *pos--= (char) ('0'+part%10); part/=10; + *pos--= (char) ('0'+part%10); part/=10; + *pos--= (char) ('0'+part%10); part/=10; + *pos= (char) ('0'+part); + out << buf; + } + break; + case NdbDictionary::Column::Time: + { + long tmp=(long) sint3korr(r.aRef()); + int hour=(uint) (tmp/10000); + int minute=(uint) (tmp/100 % 100); + int second=(uint) (tmp % 100); + char buf[40]; + sprintf(buf, "%02d:%02d:%02d", hour, minute, second); + out << buf; + } + break; + case NdbDictionary::Column::Year: + { + uint year = 1900 + r.u_char_value(); + char buf[40]; + sprintf(buf, "%04d", year); + out << buf; + } + break; + case NdbDictionary::Column::Timestamp: + { + time_t time = r.u_32_value(); + out << (uint)time; + } + break; + case NdbDictionary::Column::Blob: + case NdbDictionary::Column::Text: + { + // user defined aRef() may not be aligned to Uint64 + NdbBlob::Head head; + memcpy(&head, r.aRef(), sizeof(head)); + out << head.length << ":"; + const unsigned char* p = (const unsigned char*)r.aRef() + sizeof(head); + if (r.arraySize() < sizeof(head)) + out << "***error***"; // really cannot happen + else { + unsigned n = r.arraySize() - sizeof(head); + for (unsigned k = 0; k < n && k < head.length; k++) { + if (r.getType() == NdbDictionary::Column::Blob) + out.print("%02X", (int)p[k]); + else + out.print("%c", (int)p[k]); } - break; - unknown: - default: /* no print functions for the rest, just print type */ - out << (int) r.getType(); - j = length; - if (j > 1) - out << " " << j << " times"; - break; } + j = length; + } + break; + case NdbDictionary::Column::Longvarchar: + { + unsigned len = uint2korr(r.aRef()); + ndbrecattr_print_string(out,"Longvarchar", r.aRef()+2,len); + j = length; + } + break; + + case NdbDictionary::Column::Undefined: + case NdbDictionary::Column::Mediumint: + case NdbDictionary::Column::Mediumunsigned: + case NdbDictionary::Column::Longvarbinary: + unknown: + //default: /* no print functions for the rest, just print type */ + out << (int) r.getType(); + j = length; + if (j > 1) + out << " " << j << " times"; + break; + } } if (length > 1) diff --git a/ndb/src/ndbapi/ndberror.c b/ndb/src/ndbapi/ndberror.c index 15445620ce9..328b0688857 100644 --- a/ndb/src/ndbapi/ndberror.c +++ b/ndb/src/ndbapi/ndberror.c @@ -137,10 +137,12 @@ ErrorBundle ErrorCodes[] = { /** * Unknown result */ + { 4007, UR, "Send to ndbd node failed" }, { 4008, UR, "Receive from NDB failed" }, { 4009, UR, "Cluster Failure" }, { 4012, UR, "Request ndbd time-out, maybe due to high load or communication problems"}, + { 4013, UR, "Request timed out in waiting for node failure"}, { 4024, UR, "Time-out, most likely caused by simple read or cluster failure" }, diff --git a/ndb/test/ndbapi/testBlobs.cpp b/ndb/test/ndbapi/testBlobs.cpp index 81072f6a12a..bc703d64f21 100644 --- a/ndb/test/ndbapi/testBlobs.cpp +++ b/ndb/test/ndbapi/testBlobs.cpp @@ -138,6 +138,7 @@ printusage() << " 2 readData / writeData" << endl << "bug tests (no blob test)" << endl << " -bug 4088 ndb api hang with mixed ops on index table" << endl + << " -bug 27018 middle partial part write clobbers rest of part" << endl << " -bug nnnn delete + write gives 626" << endl << " -bug nnnn acc crash on delete and long key" << endl ; @@ -1806,6 +1807,56 @@ bugtest_4088() return 0; } +static int +bugtest_27018() +{ + DBG("bug test 27018 - middle partial part write clobbers rest of part"); + + // insert rows + calcTups(false); + CHK(insertPk(false) == 0); + // new trans + for (unsigned k= 0; k < g_opt.m_rows; k++) + { + Tup& tup= g_tups[k]; + + CHK((g_con= g_ndb->startTransaction()) != 0); + CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0); + CHK(g_opr->updateTuple() == 0); + CHK(g_opr->equal("PK1", tup.m_pk1) == 0); + if (g_opt.m_pk2len != 0) + CHK(g_opr->equal("PK2", tup.m_pk2) == 0); + CHK(getBlobHandles(g_opr) == 0); + CHK(g_con->execute(NoCommit) == 0); + + /* Update one byte in random position. */ + Uint32 offset= urandom(tup.m_blob1.m_len); + tup.m_blob1.m_buf[0]= 0xff ^ tup.m_blob1.m_val[offset]; + CHK(g_bh1->setPos(offset) == 0); + CHK(g_bh1->writeData(&(tup.m_blob1.m_buf[0]), 1) == 0); + CHK(g_con->execute(Commit) == 0); + g_ndb->closeTransaction(g_con); + + CHK((g_con= g_ndb->startTransaction()) != 0); + CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0); + CHK(g_opr->readTuple() == 0); + CHK(g_opr->equal("PK1", tup.m_pk1) == 0); + if (g_opt.m_pk2len != 0) + CHK(g_opr->equal("PK2", tup.m_pk2) == 0); + CHK(getBlobHandles(g_opr) == 0); + + CHK(g_bh1->getValue(tup.m_blob1.m_buf, tup.m_blob1.m_len) == 0); + CHK(g_con->execute(Commit) == 0); + Uint64 len= ~0; + CHK(g_bh1->getLength(len) == 0 && len == tup.m_blob1.m_len); + tup.m_blob1.m_buf[offset]^= 0xff; + CHK(memcmp(tup.m_blob1.m_buf, tup.m_blob1.m_val, tup.m_blob1.m_len) == 0); + g_ndb->closeTransaction(g_con); + } + + return 0; +} + static int bugtest_2222() { @@ -1822,7 +1873,8 @@ static struct { int m_bug; int (*m_test)(); } g_bugtest[] = { - { 4088, bugtest_4088 } + { 4088, bugtest_4088 }, + { 27018, bugtest_27018 } }; NDB_COMMAND(testOdbcDriver, "testBlobs", "testBlobs", "testBlobs", 65535) diff --git a/ndb/tools/waiter.cpp b/ndb/tools/waiter.cpp index a3a986b2929..e221a26182e 100644 --- a/ndb/tools/waiter.cpp +++ b/ndb/tools/waiter.cpp @@ -30,12 +30,14 @@ waitClusterStatus(const char* _addr, ndb_mgm_node_status _status, unsigned int _timeout); enum ndb_waiter_options { - OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST + OPT_WAIT_STATUS_NOT_STARTED = NDB_STD_OPTIONS_LAST, + OPT_WAIT_STATUS_SINGLE_USER }; NDB_STD_OPTS_VARS; static int _no_contact = 0; static int _not_started = 0; +static int _single_user = 0; static int _timeout = 120; const char *load_default_groups[]= { "mysql_cluster",0 }; @@ -49,6 +51,10 @@ static struct my_option my_long_options[] = { "not-started", OPT_WAIT_STATUS_NOT_STARTED, "Wait for cluster not started", (gptr*) &_not_started, (gptr*) &_not_started, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, + { "single-user", OPT_WAIT_STATUS_SINGLE_USER, + "Wait for cluster to enter single user mode", + (gptr*) &_single_user, (gptr*) &_single_user, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, { "timeout", 't', "Timeout to wait", (gptr*) &_timeout, (gptr*) &_timeout, 0, GET_INT, REQUIRED_ARG, 120, 0, 0, 0, 0, 0 }, @@ -90,6 +96,10 @@ int main(int argc, char** argv){ { wait_status= NDB_MGM_NODE_STATUS_NOT_STARTED; } + else if (_single_user) + { + wait_status= NDB_MGM_NODE_STATUS_SINGLEUSER; + } else { wait_status= NDB_MGM_NODE_STATUS_STARTED; diff --git a/sql/field.h b/sql/field.h index 524380800f3..0f30f5332ff 100644 --- a/sql/field.h +++ b/sql/field.h @@ -225,7 +225,7 @@ public: ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg; } inline void move_field(char *ptr_arg) { ptr=ptr_arg; } - inline void move_field(my_ptrdiff_t ptr_diff) + virtual inline void move_field(my_ptrdiff_t ptr_diff) { ptr=ADD_TO_PTR(ptr,ptr_diff,char*); if (null_ptr) @@ -1407,6 +1407,11 @@ public: Field *new_key_field(MEM_ROOT *root, struct st_table *new_table, char *new_ptr, uchar *new_null_ptr, uint new_null_bit); + inline void move_field(my_ptrdiff_t ptr_diff) + { + Field::move_field(ptr_diff); + bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*); + } void set_bit_ptr(uchar *bit_ptr_arg, uchar bit_ofs_arg) { bit_ptr= bit_ptr_arg; diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index dd00c91e4af..10d3dbb2ec5 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -342,6 +342,12 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, RETURN VALUE 0 - Equal definitions. 1 - Different definitions. + + TODO + - compare FULLTEXT keys; + - compare SPATIAL keys; + - compare FIELD_SKIP_ZERO which is converted to FIELD_NORMAL correctly + (should be corretly detected in table2myisam). */ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, @@ -367,6 +373,28 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, { HA_KEYSEG *t1_keysegs= t1_keyinfo[i].seg; HA_KEYSEG *t2_keysegs= t2_keyinfo[i].seg; + if (t1_keyinfo[i].flag & HA_FULLTEXT && t2_keyinfo[i].flag & HA_FULLTEXT) + continue; + else if (t1_keyinfo[i].flag & HA_FULLTEXT || + t2_keyinfo[i].flag & HA_FULLTEXT) + { + DBUG_PRINT("error", ("Key %d has different definition", i)); + DBUG_PRINT("error", ("t1_fulltext= %d, t2_fulltext=%d", + test(t1_keyinfo[i].flag & HA_FULLTEXT), + test(t2_keyinfo[i].flag & HA_FULLTEXT))); + DBUG_RETURN(1); + } + if (t1_keyinfo[i].flag & HA_SPATIAL && t2_keyinfo[i].flag & HA_SPATIAL) + continue; + else if (t1_keyinfo[i].flag & HA_SPATIAL || + t2_keyinfo[i].flag & HA_SPATIAL) + { + DBUG_PRINT("error", ("Key %d has different definition", i)); + DBUG_PRINT("error", ("t1_spatial= %d, t2_spatial=%d", + test(t1_keyinfo[i].flag & HA_SPATIAL), + test(t2_keyinfo[i].flag & HA_SPATIAL))); + DBUG_RETURN(1); + } if (t1_keyinfo[i].keysegs != t2_keyinfo[i].keysegs || t1_keyinfo[i].key_alg != t2_keyinfo[i].key_alg) { @@ -403,7 +431,14 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, { MI_COLUMNDEF *t1_rec= &t1_recinfo[i]; MI_COLUMNDEF *t2_rec= &t2_recinfo[i]; - if (t1_rec->type != t2_rec->type || + /* + FIELD_SKIP_ZERO can be changed to FIELD_NORMAL in mi_create, + see NOTE1 in mi_create.c + */ + if ((t1_rec->type != t2_rec->type && + !(t1_rec->type == (int) FIELD_SKIP_ZERO && + t1_rec->length == 1 && + t2_rec->type == (int) FIELD_NORMAL)) || t1_rec->length != t2_rec->length || t1_rec->null_bit != t2_rec->null_bit) { diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h index e546dfee699..16c734e2682 100644 --- a/sql/ha_myisammrg.h +++ b/sql/ha_myisammrg.h @@ -36,8 +36,7 @@ class ha_myisammrg: public handler { return (HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_READ_RND_SAME | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_FILE_BASED | - HA_CAN_INSERT_DELAYED | HA_ANY_INDEX_MAY_BE_UNIQUE | - HA_CAN_BIT_FIELD); + HA_ANY_INDEX_MAY_BE_UNIQUE | HA_CAN_BIT_FIELD); } ulong index_flags(uint inx, uint part, bool all_parts) const {