From c594ab792179ced153d4b3073382b3ed1967c658 Mon Sep 17 00:00:00 2001 From: "sasha@asksasha.com" <> Date: Thu, 18 Aug 2005 21:40:14 -0600 Subject: [PATCH] updated patch for BUG#4680 (incomplete DROP DATABASE breaking replication). We binlog the DROP TABLE for each table that was actually dropped. Per Sergei's suggestion a fixed buffer for the DROP TABLE query is pre-allocated from THD pool, and logging now is done in batches - new batch is started if the buffer becomes full. Reduced memory usage by reusing the table list instead of accumulating a list of dropped table names. Also fixed the problem if the table was not actually dropped, eg due to permissions. Extended the test case to make sure batched query logging does work. --- .bzrignore | 2 + mysql-test/r/rpl_drop_db.result | 1005 +++++++++++++++++++++++++++++++ mysql-test/t/rpl_drop_db.test | 13 + sql/mysql_priv.h | 2 +- sql/sql_db.cc | 85 ++- sql/sql_table.cc | 23 +- sql/table.h | 3 + 7 files changed, 1085 insertions(+), 48 deletions(-) diff --git a/.bzrignore b/.bzrignore index 7a10ce9db69..f9f9c146692 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1054,3 +1054,5 @@ vio/test-sslclient vio/test-sslserver vio/viotest-ssl ndb/tools/ndb_config +support-files/MacOSX/postflight +support-files/MacOSX/preflight diff --git a/mysql-test/r/rpl_drop_db.result b/mysql-test/r/rpl_drop_db.result index bafbfe3a1ed..01a2af5341b 100644 --- a/mysql-test/r/rpl_drop_db.result +++ b/mysql-test/r/rpl_drop_db.result @@ -16,6 +16,1011 @@ ERROR HY000: Error dropping database (can't rmdir './d1/', errno: 17) use d1; show tables; Tables_in_d1 +create table d1.t1000(n int); +create table d1.t999(n int); +create table d1.t998(n int); +create table d1.t997(n int); +create table d1.t996(n int); +create table d1.t995(n int); +create table d1.t994(n int); +create table d1.t993(n int); +create table d1.t992(n int); +create table d1.t991(n int); +create table d1.t990(n int); +create table d1.t989(n int); +create table d1.t988(n int); +create table d1.t987(n int); +create table d1.t986(n int); +create table d1.t985(n int); +create table d1.t984(n int); +create table d1.t983(n int); +create table d1.t982(n int); +create table d1.t981(n int); +create table d1.t980(n int); +create table d1.t979(n int); +create table d1.t978(n int); +create table d1.t977(n int); +create table d1.t976(n int); +create table d1.t975(n int); +create table d1.t974(n int); +create table d1.t973(n int); +create table d1.t972(n int); +create table d1.t971(n int); +create table d1.t970(n int); +create table d1.t969(n int); +create table d1.t968(n int); +create table d1.t967(n int); +create table d1.t966(n int); +create table d1.t965(n int); +create table d1.t964(n int); +create table d1.t963(n int); +create table d1.t962(n int); +create table d1.t961(n int); +create table d1.t960(n int); +create table d1.t959(n int); +create table d1.t958(n int); +create table d1.t957(n int); +create table d1.t956(n int); +create table d1.t955(n int); +create table d1.t954(n int); +create table d1.t953(n int); +create table d1.t952(n int); +create table d1.t951(n int); +create table d1.t950(n int); +create table d1.t949(n int); +create table d1.t948(n int); +create table d1.t947(n int); +create table d1.t946(n int); +create table d1.t945(n int); +create table d1.t944(n int); +create table d1.t943(n int); +create table d1.t942(n int); +create table d1.t941(n int); +create table d1.t940(n int); +create table d1.t939(n int); +create table d1.t938(n int); +create table d1.t937(n int); +create table d1.t936(n int); +create table d1.t935(n int); +create table d1.t934(n int); +create table d1.t933(n int); +create table d1.t932(n int); +create table d1.t931(n int); +create table d1.t930(n int); +create table d1.t929(n int); +create table d1.t928(n int); +create table d1.t927(n int); +create table d1.t926(n int); +create table d1.t925(n int); +create table d1.t924(n int); +create table d1.t923(n int); +create table d1.t922(n int); +create table d1.t921(n int); +create table d1.t920(n int); +create table d1.t919(n int); +create table d1.t918(n int); +create table d1.t917(n int); +create table d1.t916(n int); +create table d1.t915(n int); +create table d1.t914(n int); +create table d1.t913(n int); +create table d1.t912(n int); +create table d1.t911(n int); +create table d1.t910(n int); +create table d1.t909(n int); +create table d1.t908(n int); +create table d1.t907(n int); +create table d1.t906(n int); +create table d1.t905(n int); +create table d1.t904(n int); +create table d1.t903(n int); +create table d1.t902(n int); +create table d1.t901(n int); +create table d1.t900(n int); +create table d1.t899(n int); +create table d1.t898(n int); +create table d1.t897(n int); +create table d1.t896(n int); +create table d1.t895(n int); +create table d1.t894(n int); +create table d1.t893(n int); +create table d1.t892(n int); +create table d1.t891(n int); +create table d1.t890(n int); +create table d1.t889(n int); +create table d1.t888(n int); +create table d1.t887(n int); +create table d1.t886(n int); +create table d1.t885(n int); +create table d1.t884(n int); +create table d1.t883(n int); +create table d1.t882(n int); +create table d1.t881(n int); +create table d1.t880(n int); +create table d1.t879(n int); +create table d1.t878(n int); +create table d1.t877(n int); +create table d1.t876(n int); +create table d1.t875(n int); +create table d1.t874(n int); +create table d1.t873(n int); +create table d1.t872(n int); +create table d1.t871(n int); +create table d1.t870(n int); +create table d1.t869(n int); +create table d1.t868(n int); +create table d1.t867(n int); +create table d1.t866(n int); +create table d1.t865(n int); +create table d1.t864(n int); +create table d1.t863(n int); +create table d1.t862(n int); +create table d1.t861(n int); +create table d1.t860(n int); +create table d1.t859(n int); +create table d1.t858(n int); +create table d1.t857(n int); +create table d1.t856(n int); +create table d1.t855(n int); +create table d1.t854(n int); +create table d1.t853(n int); +create table d1.t852(n int); +create table d1.t851(n int); +create table d1.t850(n int); +create table d1.t849(n int); +create table d1.t848(n int); +create table d1.t847(n int); +create table d1.t846(n int); +create table d1.t845(n int); +create table d1.t844(n int); +create table d1.t843(n int); +create table d1.t842(n int); +create table d1.t841(n int); +create table d1.t840(n int); +create table d1.t839(n int); +create table d1.t838(n int); +create table d1.t837(n int); +create table d1.t836(n int); +create table d1.t835(n int); +create table d1.t834(n int); +create table d1.t833(n int); +create table d1.t832(n int); +create table d1.t831(n int); +create table d1.t830(n int); +create table d1.t829(n int); +create table d1.t828(n int); +create table d1.t827(n int); +create table d1.t826(n int); +create table d1.t825(n int); +create table d1.t824(n int); +create table d1.t823(n int); +create table d1.t822(n int); +create table d1.t821(n int); +create table d1.t820(n int); +create table d1.t819(n int); +create table d1.t818(n int); +create table d1.t817(n int); +create table d1.t816(n int); +create table d1.t815(n int); +create table d1.t814(n int); +create table d1.t813(n int); +create table d1.t812(n int); +create table d1.t811(n int); +create table d1.t810(n int); +create table d1.t809(n int); +create table d1.t808(n int); +create table d1.t807(n int); +create table d1.t806(n int); +create table d1.t805(n int); +create table d1.t804(n int); +create table d1.t803(n int); +create table d1.t802(n int); +create table d1.t801(n int); +create table d1.t800(n int); +create table d1.t799(n int); +create table d1.t798(n int); +create table d1.t797(n int); +create table d1.t796(n int); +create table d1.t795(n int); +create table d1.t794(n int); +create table d1.t793(n int); +create table d1.t792(n int); +create table d1.t791(n int); +create table d1.t790(n int); +create table d1.t789(n int); +create table d1.t788(n int); +create table d1.t787(n int); +create table d1.t786(n int); +create table d1.t785(n int); +create table d1.t784(n int); +create table d1.t783(n int); +create table d1.t782(n int); +create table d1.t781(n int); +create table d1.t780(n int); +create table d1.t779(n int); +create table d1.t778(n int); +create table d1.t777(n int); +create table d1.t776(n int); +create table d1.t775(n int); +create table d1.t774(n int); +create table d1.t773(n int); +create table d1.t772(n int); +create table d1.t771(n int); +create table d1.t770(n int); +create table d1.t769(n int); +create table d1.t768(n int); +create table d1.t767(n int); +create table d1.t766(n int); +create table d1.t765(n int); +create table d1.t764(n int); +create table d1.t763(n int); +create table d1.t762(n int); +create table d1.t761(n int); +create table d1.t760(n int); +create table d1.t759(n int); +create table d1.t758(n int); +create table d1.t757(n int); +create table d1.t756(n int); +create table d1.t755(n int); +create table d1.t754(n int); +create table d1.t753(n int); +create table d1.t752(n int); +create table d1.t751(n int); +create table d1.t750(n int); +create table d1.t749(n int); +create table d1.t748(n int); +create table d1.t747(n int); +create table d1.t746(n int); +create table d1.t745(n int); +create table d1.t744(n int); +create table d1.t743(n int); +create table d1.t742(n int); +create table d1.t741(n int); +create table d1.t740(n int); +create table d1.t739(n int); +create table d1.t738(n int); +create table d1.t737(n int); +create table d1.t736(n int); +create table d1.t735(n int); +create table d1.t734(n int); +create table d1.t733(n int); +create table d1.t732(n int); +create table d1.t731(n int); +create table d1.t730(n int); +create table d1.t729(n int); +create table d1.t728(n int); +create table d1.t727(n int); +create table d1.t726(n int); +create table d1.t725(n int); +create table d1.t724(n int); +create table d1.t723(n int); +create table d1.t722(n int); +create table d1.t721(n int); +create table d1.t720(n int); +create table d1.t719(n int); +create table d1.t718(n int); +create table d1.t717(n int); +create table d1.t716(n int); +create table d1.t715(n int); +create table d1.t714(n int); +create table d1.t713(n int); +create table d1.t712(n int); +create table d1.t711(n int); +create table d1.t710(n int); +create table d1.t709(n int); +create table d1.t708(n int); +create table d1.t707(n int); +create table d1.t706(n int); +create table d1.t705(n int); +create table d1.t704(n int); +create table d1.t703(n int); +create table d1.t702(n int); +create table d1.t701(n int); +create table d1.t700(n int); +create table d1.t699(n int); +create table d1.t698(n int); +create table d1.t697(n int); +create table d1.t696(n int); +create table d1.t695(n int); +create table d1.t694(n int); +create table d1.t693(n int); +create table d1.t692(n int); +create table d1.t691(n int); +create table d1.t690(n int); +create table d1.t689(n int); +create table d1.t688(n int); +create table d1.t687(n int); +create table d1.t686(n int); +create table d1.t685(n int); +create table d1.t684(n int); +create table d1.t683(n int); +create table d1.t682(n int); +create table d1.t681(n int); +create table d1.t680(n int); +create table d1.t679(n int); +create table d1.t678(n int); +create table d1.t677(n int); +create table d1.t676(n int); +create table d1.t675(n int); +create table d1.t674(n int); +create table d1.t673(n int); +create table d1.t672(n int); +create table d1.t671(n int); +create table d1.t670(n int); +create table d1.t669(n int); +create table d1.t668(n int); +create table d1.t667(n int); +create table d1.t666(n int); +create table d1.t665(n int); +create table d1.t664(n int); +create table d1.t663(n int); +create table d1.t662(n int); +create table d1.t661(n int); +create table d1.t660(n int); +create table d1.t659(n int); +create table d1.t658(n int); +create table d1.t657(n int); +create table d1.t656(n int); +create table d1.t655(n int); +create table d1.t654(n int); +create table d1.t653(n int); +create table d1.t652(n int); +create table d1.t651(n int); +create table d1.t650(n int); +create table d1.t649(n int); +create table d1.t648(n int); +create table d1.t647(n int); +create table d1.t646(n int); +create table d1.t645(n int); +create table d1.t644(n int); +create table d1.t643(n int); +create table d1.t642(n int); +create table d1.t641(n int); +create table d1.t640(n int); +create table d1.t639(n int); +create table d1.t638(n int); +create table d1.t637(n int); +create table d1.t636(n int); +create table d1.t635(n int); +create table d1.t634(n int); +create table d1.t633(n int); +create table d1.t632(n int); +create table d1.t631(n int); +create table d1.t630(n int); +create table d1.t629(n int); +create table d1.t628(n int); +create table d1.t627(n int); +create table d1.t626(n int); +create table d1.t625(n int); +create table d1.t624(n int); +create table d1.t623(n int); +create table d1.t622(n int); +create table d1.t621(n int); +create table d1.t620(n int); +create table d1.t619(n int); +create table d1.t618(n int); +create table d1.t617(n int); +create table d1.t616(n int); +create table d1.t615(n int); +create table d1.t614(n int); +create table d1.t613(n int); +create table d1.t612(n int); +create table d1.t611(n int); +create table d1.t610(n int); +create table d1.t609(n int); +create table d1.t608(n int); +create table d1.t607(n int); +create table d1.t606(n int); +create table d1.t605(n int); +create table d1.t604(n int); +create table d1.t603(n int); +create table d1.t602(n int); +create table d1.t601(n int); +create table d1.t600(n int); +create table d1.t599(n int); +create table d1.t598(n int); +create table d1.t597(n int); +create table d1.t596(n int); +create table d1.t595(n int); +create table d1.t594(n int); +create table d1.t593(n int); +create table d1.t592(n int); +create table d1.t591(n int); +create table d1.t590(n int); +create table d1.t589(n int); +create table d1.t588(n int); +create table d1.t587(n int); +create table d1.t586(n int); +create table d1.t585(n int); +create table d1.t584(n int); +create table d1.t583(n int); +create table d1.t582(n int); +create table d1.t581(n int); +create table d1.t580(n int); +create table d1.t579(n int); +create table d1.t578(n int); +create table d1.t577(n int); +create table d1.t576(n int); +create table d1.t575(n int); +create table d1.t574(n int); +create table d1.t573(n int); +create table d1.t572(n int); +create table d1.t571(n int); +create table d1.t570(n int); +create table d1.t569(n int); +create table d1.t568(n int); +create table d1.t567(n int); +create table d1.t566(n int); +create table d1.t565(n int); +create table d1.t564(n int); +create table d1.t563(n int); +create table d1.t562(n int); +create table d1.t561(n int); +create table d1.t560(n int); +create table d1.t559(n int); +create table d1.t558(n int); +create table d1.t557(n int); +create table d1.t556(n int); +create table d1.t555(n int); +create table d1.t554(n int); +create table d1.t553(n int); +create table d1.t552(n int); +create table d1.t551(n int); +create table d1.t550(n int); +create table d1.t549(n int); +create table d1.t548(n int); +create table d1.t547(n int); +create table d1.t546(n int); +create table d1.t545(n int); +create table d1.t544(n int); +create table d1.t543(n int); +create table d1.t542(n int); +create table d1.t541(n int); +create table d1.t540(n int); +create table d1.t539(n int); +create table d1.t538(n int); +create table d1.t537(n int); +create table d1.t536(n int); +create table d1.t535(n int); +create table d1.t534(n int); +create table d1.t533(n int); +create table d1.t532(n int); +create table d1.t531(n int); +create table d1.t530(n int); +create table d1.t529(n int); +create table d1.t528(n int); +create table d1.t527(n int); +create table d1.t526(n int); +create table d1.t525(n int); +create table d1.t524(n int); +create table d1.t523(n int); +create table d1.t522(n int); +create table d1.t521(n int); +create table d1.t520(n int); +create table d1.t519(n int); +create table d1.t518(n int); +create table d1.t517(n int); +create table d1.t516(n int); +create table d1.t515(n int); +create table d1.t514(n int); +create table d1.t513(n int); +create table d1.t512(n int); +create table d1.t511(n int); +create table d1.t510(n int); +create table d1.t509(n int); +create table d1.t508(n int); +create table d1.t507(n int); +create table d1.t506(n int); +create table d1.t505(n int); +create table d1.t504(n int); +create table d1.t503(n int); +create table d1.t502(n int); +create table d1.t501(n int); +create table d1.t500(n int); +create table d1.t499(n int); +create table d1.t498(n int); +create table d1.t497(n int); +create table d1.t496(n int); +create table d1.t495(n int); +create table d1.t494(n int); +create table d1.t493(n int); +create table d1.t492(n int); +create table d1.t491(n int); +create table d1.t490(n int); +create table d1.t489(n int); +create table d1.t488(n int); +create table d1.t487(n int); +create table d1.t486(n int); +create table d1.t485(n int); +create table d1.t484(n int); +create table d1.t483(n int); +create table d1.t482(n int); +create table d1.t481(n int); +create table d1.t480(n int); +create table d1.t479(n int); +create table d1.t478(n int); +create table d1.t477(n int); +create table d1.t476(n int); +create table d1.t475(n int); +create table d1.t474(n int); +create table d1.t473(n int); +create table d1.t472(n int); +create table d1.t471(n int); +create table d1.t470(n int); +create table d1.t469(n int); +create table d1.t468(n int); +create table d1.t467(n int); +create table d1.t466(n int); +create table d1.t465(n int); +create table d1.t464(n int); +create table d1.t463(n int); +create table d1.t462(n int); +create table d1.t461(n int); +create table d1.t460(n int); +create table d1.t459(n int); +create table d1.t458(n int); +create table d1.t457(n int); +create table d1.t456(n int); +create table d1.t455(n int); +create table d1.t454(n int); +create table d1.t453(n int); +create table d1.t452(n int); +create table d1.t451(n int); +create table d1.t450(n int); +create table d1.t449(n int); +create table d1.t448(n int); +create table d1.t447(n int); +create table d1.t446(n int); +create table d1.t445(n int); +create table d1.t444(n int); +create table d1.t443(n int); +create table d1.t442(n int); +create table d1.t441(n int); +create table d1.t440(n int); +create table d1.t439(n int); +create table d1.t438(n int); +create table d1.t437(n int); +create table d1.t436(n int); +create table d1.t435(n int); +create table d1.t434(n int); +create table d1.t433(n int); +create table d1.t432(n int); +create table d1.t431(n int); +create table d1.t430(n int); +create table d1.t429(n int); +create table d1.t428(n int); +create table d1.t427(n int); +create table d1.t426(n int); +create table d1.t425(n int); +create table d1.t424(n int); +create table d1.t423(n int); +create table d1.t422(n int); +create table d1.t421(n int); +create table d1.t420(n int); +create table d1.t419(n int); +create table d1.t418(n int); +create table d1.t417(n int); +create table d1.t416(n int); +create table d1.t415(n int); +create table d1.t414(n int); +create table d1.t413(n int); +create table d1.t412(n int); +create table d1.t411(n int); +create table d1.t410(n int); +create table d1.t409(n int); +create table d1.t408(n int); +create table d1.t407(n int); +create table d1.t406(n int); +create table d1.t405(n int); +create table d1.t404(n int); +create table d1.t403(n int); +create table d1.t402(n int); +create table d1.t401(n int); +create table d1.t400(n int); +create table d1.t399(n int); +create table d1.t398(n int); +create table d1.t397(n int); +create table d1.t396(n int); +create table d1.t395(n int); +create table d1.t394(n int); +create table d1.t393(n int); +create table d1.t392(n int); +create table d1.t391(n int); +create table d1.t390(n int); +create table d1.t389(n int); +create table d1.t388(n int); +create table d1.t387(n int); +create table d1.t386(n int); +create table d1.t385(n int); +create table d1.t384(n int); +create table d1.t383(n int); +create table d1.t382(n int); +create table d1.t381(n int); +create table d1.t380(n int); +create table d1.t379(n int); +create table d1.t378(n int); +create table d1.t377(n int); +create table d1.t376(n int); +create table d1.t375(n int); +create table d1.t374(n int); +create table d1.t373(n int); +create table d1.t372(n int); +create table d1.t371(n int); +create table d1.t370(n int); +create table d1.t369(n int); +create table d1.t368(n int); +create table d1.t367(n int); +create table d1.t366(n int); +create table d1.t365(n int); +create table d1.t364(n int); +create table d1.t363(n int); +create table d1.t362(n int); +create table d1.t361(n int); +create table d1.t360(n int); +create table d1.t359(n int); +create table d1.t358(n int); +create table d1.t357(n int); +create table d1.t356(n int); +create table d1.t355(n int); +create table d1.t354(n int); +create table d1.t353(n int); +create table d1.t352(n int); +create table d1.t351(n int); +create table d1.t350(n int); +create table d1.t349(n int); +create table d1.t348(n int); +create table d1.t347(n int); +create table d1.t346(n int); +create table d1.t345(n int); +create table d1.t344(n int); +create table d1.t343(n int); +create table d1.t342(n int); +create table d1.t341(n int); +create table d1.t340(n int); +create table d1.t339(n int); +create table d1.t338(n int); +create table d1.t337(n int); +create table d1.t336(n int); +create table d1.t335(n int); +create table d1.t334(n int); +create table d1.t333(n int); +create table d1.t332(n int); +create table d1.t331(n int); +create table d1.t330(n int); +create table d1.t329(n int); +create table d1.t328(n int); +create table d1.t327(n int); +create table d1.t326(n int); +create table d1.t325(n int); +create table d1.t324(n int); +create table d1.t323(n int); +create table d1.t322(n int); +create table d1.t321(n int); +create table d1.t320(n int); +create table d1.t319(n int); +create table d1.t318(n int); +create table d1.t317(n int); +create table d1.t316(n int); +create table d1.t315(n int); +create table d1.t314(n int); +create table d1.t313(n int); +create table d1.t312(n int); +create table d1.t311(n int); +create table d1.t310(n int); +create table d1.t309(n int); +create table d1.t308(n int); +create table d1.t307(n int); +create table d1.t306(n int); +create table d1.t305(n int); +create table d1.t304(n int); +create table d1.t303(n int); +create table d1.t302(n int); +create table d1.t301(n int); +create table d1.t300(n int); +create table d1.t299(n int); +create table d1.t298(n int); +create table d1.t297(n int); +create table d1.t296(n int); +create table d1.t295(n int); +create table d1.t294(n int); +create table d1.t293(n int); +create table d1.t292(n int); +create table d1.t291(n int); +create table d1.t290(n int); +create table d1.t289(n int); +create table d1.t288(n int); +create table d1.t287(n int); +create table d1.t286(n int); +create table d1.t285(n int); +create table d1.t284(n int); +create table d1.t283(n int); +create table d1.t282(n int); +create table d1.t281(n int); +create table d1.t280(n int); +create table d1.t279(n int); +create table d1.t278(n int); +create table d1.t277(n int); +create table d1.t276(n int); +create table d1.t275(n int); +create table d1.t274(n int); +create table d1.t273(n int); +create table d1.t272(n int); +create table d1.t271(n int); +create table d1.t270(n int); +create table d1.t269(n int); +create table d1.t268(n int); +create table d1.t267(n int); +create table d1.t266(n int); +create table d1.t265(n int); +create table d1.t264(n int); +create table d1.t263(n int); +create table d1.t262(n int); +create table d1.t261(n int); +create table d1.t260(n int); +create table d1.t259(n int); +create table d1.t258(n int); +create table d1.t257(n int); +create table d1.t256(n int); +create table d1.t255(n int); +create table d1.t254(n int); +create table d1.t253(n int); +create table d1.t252(n int); +create table d1.t251(n int); +create table d1.t250(n int); +create table d1.t249(n int); +create table d1.t248(n int); +create table d1.t247(n int); +create table d1.t246(n int); +create table d1.t245(n int); +create table d1.t244(n int); +create table d1.t243(n int); +create table d1.t242(n int); +create table d1.t241(n int); +create table d1.t240(n int); +create table d1.t239(n int); +create table d1.t238(n int); +create table d1.t237(n int); +create table d1.t236(n int); +create table d1.t235(n int); +create table d1.t234(n int); +create table d1.t233(n int); +create table d1.t232(n int); +create table d1.t231(n int); +create table d1.t230(n int); +create table d1.t229(n int); +create table d1.t228(n int); +create table d1.t227(n int); +create table d1.t226(n int); +create table d1.t225(n int); +create table d1.t224(n int); +create table d1.t223(n int); +create table d1.t222(n int); +create table d1.t221(n int); +create table d1.t220(n int); +create table d1.t219(n int); +create table d1.t218(n int); +create table d1.t217(n int); +create table d1.t216(n int); +create table d1.t215(n int); +create table d1.t214(n int); +create table d1.t213(n int); +create table d1.t212(n int); +create table d1.t211(n int); +create table d1.t210(n int); +create table d1.t209(n int); +create table d1.t208(n int); +create table d1.t207(n int); +create table d1.t206(n int); +create table d1.t205(n int); +create table d1.t204(n int); +create table d1.t203(n int); +create table d1.t202(n int); +create table d1.t201(n int); +create table d1.t200(n int); +create table d1.t199(n int); +create table d1.t198(n int); +create table d1.t197(n int); +create table d1.t196(n int); +create table d1.t195(n int); +create table d1.t194(n int); +create table d1.t193(n int); +create table d1.t192(n int); +create table d1.t191(n int); +create table d1.t190(n int); +create table d1.t189(n int); +create table d1.t188(n int); +create table d1.t187(n int); +create table d1.t186(n int); +create table d1.t185(n int); +create table d1.t184(n int); +create table d1.t183(n int); +create table d1.t182(n int); +create table d1.t181(n int); +create table d1.t180(n int); +create table d1.t179(n int); +create table d1.t178(n int); +create table d1.t177(n int); +create table d1.t176(n int); +create table d1.t175(n int); +create table d1.t174(n int); +create table d1.t173(n int); +create table d1.t172(n int); +create table d1.t171(n int); +create table d1.t170(n int); +create table d1.t169(n int); +create table d1.t168(n int); +create table d1.t167(n int); +create table d1.t166(n int); +create table d1.t165(n int); +create table d1.t164(n int); +create table d1.t163(n int); +create table d1.t162(n int); +create table d1.t161(n int); +create table d1.t160(n int); +create table d1.t159(n int); +create table d1.t158(n int); +create table d1.t157(n int); +create table d1.t156(n int); +create table d1.t155(n int); +create table d1.t154(n int); +create table d1.t153(n int); +create table d1.t152(n int); +create table d1.t151(n int); +create table d1.t150(n int); +create table d1.t149(n int); +create table d1.t148(n int); +create table d1.t147(n int); +create table d1.t146(n int); +create table d1.t145(n int); +create table d1.t144(n int); +create table d1.t143(n int); +create table d1.t142(n int); +create table d1.t141(n int); +create table d1.t140(n int); +create table d1.t139(n int); +create table d1.t138(n int); +create table d1.t137(n int); +create table d1.t136(n int); +create table d1.t135(n int); +create table d1.t134(n int); +create table d1.t133(n int); +create table d1.t132(n int); +create table d1.t131(n int); +create table d1.t130(n int); +create table d1.t129(n int); +create table d1.t128(n int); +create table d1.t127(n int); +create table d1.t126(n int); +create table d1.t125(n int); +create table d1.t124(n int); +create table d1.t123(n int); +create table d1.t122(n int); +create table d1.t121(n int); +create table d1.t120(n int); +create table d1.t119(n int); +create table d1.t118(n int); +create table d1.t117(n int); +create table d1.t116(n int); +create table d1.t115(n int); +create table d1.t114(n int); +create table d1.t113(n int); +create table d1.t112(n int); +create table d1.t111(n int); +create table d1.t110(n int); +create table d1.t109(n int); +create table d1.t108(n int); +create table d1.t107(n int); +create table d1.t106(n int); +create table d1.t105(n int); +create table d1.t104(n int); +create table d1.t103(n int); +create table d1.t102(n int); +create table d1.t101(n int); +create table d1.t100(n int); +create table d1.t99(n int); +create table d1.t98(n int); +create table d1.t97(n int); +create table d1.t96(n int); +create table d1.t95(n int); +create table d1.t94(n int); +create table d1.t93(n int); +create table d1.t92(n int); +create table d1.t91(n int); +create table d1.t90(n int); +create table d1.t89(n int); +create table d1.t88(n int); +create table d1.t87(n int); +create table d1.t86(n int); +create table d1.t85(n int); +create table d1.t84(n int); +create table d1.t83(n int); +create table d1.t82(n int); +create table d1.t81(n int); +create table d1.t80(n int); +create table d1.t79(n int); +create table d1.t78(n int); +create table d1.t77(n int); +create table d1.t76(n int); +create table d1.t75(n int); +create table d1.t74(n int); +create table d1.t73(n int); +create table d1.t72(n int); +create table d1.t71(n int); +create table d1.t70(n int); +create table d1.t69(n int); +create table d1.t68(n int); +create table d1.t67(n int); +create table d1.t66(n int); +create table d1.t65(n int); +create table d1.t64(n int); +create table d1.t63(n int); +create table d1.t62(n int); +create table d1.t61(n int); +create table d1.t60(n int); +create table d1.t59(n int); +create table d1.t58(n int); +create table d1.t57(n int); +create table d1.t56(n int); +create table d1.t55(n int); +create table d1.t54(n int); +create table d1.t53(n int); +create table d1.t52(n int); +create table d1.t51(n int); +create table d1.t50(n int); +create table d1.t49(n int); +create table d1.t48(n int); +create table d1.t47(n int); +create table d1.t46(n int); +create table d1.t45(n int); +create table d1.t44(n int); +create table d1.t43(n int); +create table d1.t42(n int); +create table d1.t41(n int); +create table d1.t40(n int); +create table d1.t39(n int); +create table d1.t38(n int); +create table d1.t37(n int); +create table d1.t36(n int); +create table d1.t35(n int); +create table d1.t34(n int); +create table d1.t33(n int); +create table d1.t32(n int); +create table d1.t31(n int); +create table d1.t30(n int); +create table d1.t29(n int); +create table d1.t28(n int); +create table d1.t27(n int); +create table d1.t26(n int); +create table d1.t25(n int); +create table d1.t24(n int); +create table d1.t23(n int); +create table d1.t22(n int); +create table d1.t21(n int); +create table d1.t20(n int); +create table d1.t19(n int); +create table d1.t18(n int); +create table d1.t17(n int); +create table d1.t16(n int); +create table d1.t15(n int); +create table d1.t14(n int); +create table d1.t13(n int); +create table d1.t12(n int); +create table d1.t11(n int); +create table d1.t10(n int); +create table d1.t9(n int); +create table d1.t8(n int); +create table d1.t7(n int); +create table d1.t6(n int); +create table d1.t5(n int); +create table d1.t4(n int); +create table d1.t3(n int); +create table d1.t2(n int); +create table d1.t1(n int); +drop database d1; +ERROR HY000: Error dropping database (can't rmdir './d1/', errno: 17) +use d1; +show tables; +Tables_in_d1 use test; create table t1 (n int); insert into t1 values (1234); diff --git a/mysql-test/t/rpl_drop_db.test b/mysql-test/t/rpl_drop_db.test index ef0ab4be6fd..71dc22f705f 100644 --- a/mysql-test/t/rpl_drop_db.test +++ b/mysql-test/t/rpl_drop_db.test @@ -17,6 +17,19 @@ create table d1.t3 (n int); drop database d1; use d1; show tables; + +# test the branch of the code that deals with the query buffer overflow + +let $1=1000; +while ($1) +{ + eval create table d1.t$1(n int); + dec $1; +} +--error 1010 +drop database d1; +use d1; +show tables; use test; create table t1 (n int); insert into t1 values (1234); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 946bb117e9e..0af3ea3af63 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -447,7 +447,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, bool drop_temporary, bool log_query); int mysql_rm_table_part2_with_lock(THD *thd, TABLE_LIST *tables, bool if_exists, bool drop_temporary, - bool log_query, List *dropped_tables); + bool log_query); int quick_rm_table(enum db_type base,const char *db, const char *table_name); bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 0155fca0466..6dcc7be0904 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -25,14 +25,20 @@ #include #endif +#define MAX_DROP_TABLE_Q_LEN 1024 + const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; static TYPELIB deletable_extentions= {array_elements(del_exts)-1,"del_exts", del_exts, NULL}; static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, - const char *db, const char *path, - uint level, List *dropped_tables); + const char *db, const char *path, uint level, + TABLE_LIST** dropped_tables); + +static inline void write_to_binlog(THD* thd, char* query, uint q_len, + char* db, uint db_len); + /* Database options hash */ static HASH dboptions; static my_bool dboptions_init= 0; @@ -57,6 +63,19 @@ static byte* dboptions_get_key(my_dbopt_t *opt, uint *length, return (byte*) opt->name; } +/* + Helper function to write a query to binlog used by mysql_rm_db() + */ +static inline void write_to_binlog(THD* thd, char* query, uint q_len, + char* db, uint db_len) +{ + Query_log_event qinfo(thd, query, q_len, 0, 0); + qinfo.error_code= 0; + qinfo.db= db; + qinfo.db_len= db_len; + mysql_bin_log.write(&qinfo); +} + /* Function to free dboptions hash element @@ -584,8 +603,8 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) int error= 0; char path[FN_REFLEN+16], tmp_db[NAME_LEN+1]; MY_DIR *dirp; - List dropped_tables; uint length; + TABLE_LIST* dropped_tables= 0; DBUG_ENTER("mysql_rm_db"); VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); @@ -625,7 +644,7 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) error= -1; if ((deleted= mysql_rm_known_files(thd, dirp, db, path, 0, - &dropped_tables)) >= 0) + &dropped_tables)) >= 0) { ha_drop_database(path); query_cache_invalidate1(db); @@ -675,36 +694,44 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) send_ok(thd, (ulong) deleted); thd->server_status&= ~SERVER_STATUS_DB_DROPPED; } - else if (!dropped_tables.is_empty() && mysql_bin_log.is_open()) + else if (mysql_bin_log.is_open()) { - List_iterator it(dropped_tables); - String* dropped_table; - int q_len= 11; /* drop table */ - int db_len= strlen(db); + char* query= thd->alloc(MAX_DROP_TABLE_Q_LEN); - for (;(dropped_table= it++);) - { - q_len += dropped_table->length() + 2 + db_len; - } - q_len--; /* no last comma */ - - char* query= thd->alloc(q_len); if (!query) goto exit; /* not much else we can do */ char* p= strmov(query,"drop table "); - it.rewind(); + char* p_end= query + MAX_DROP_TABLE_Q_LEN; + TABLE_LIST* tbl; + bool last_query_needs_write= 0; + uint db_len= strlen(db); - for (;(dropped_table= it++);) + for (tbl= dropped_tables;tbl;tbl= tbl->next) { - p= strmov(p,db); - *p++ = '.'; - p= strnmov(p,dropped_table->ptr(),dropped_table->length()); + if (!tbl->was_dropped) + continue; + + /* 3 for the quotes and the comma*/ + uint tbl_name_len= strlen(tbl->real_name) + 3; + if (p + tbl_name_len + 1 >= p_end) + { + *--p= 0; /* kill , */ + write_to_binlog(thd, query, p - query, db, db_len); + p= query + 11; /* reuse the initial "drop table" */ + } + + *p++ = '`'; + p= strmov(p,tbl->real_name); + *p++ = '`'; *p++ = ','; + last_query_needs_write= 1; } - *--p= 0; - Query_log_event qinfo(thd, query, q_len, 0, 0); - qinfo.error_code= 0; - mysql_bin_log.write(&qinfo); + + if (last_query_needs_write) + { + *--p= 0; + write_to_binlog(thd, query, p - query, db, db_len); + } } exit: @@ -750,7 +777,7 @@ exit2: */ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, - const char *org_path, uint level, List *dropped_tables) + const char *org_path, uint level, TABLE_LIST** dropped_tables) { long deleted=0; ulong found_other_files=0; @@ -839,8 +866,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, } } if (thd->killed || - (tot_list && mysql_rm_table_part2_with_lock(thd, tot_list, 1, 0, - 1,dropped_tables))) + (tot_list && mysql_rm_table_part2_with_lock(thd, tot_list, 1, 0, 1))) goto err; /* Remove RAID directories */ @@ -853,6 +879,9 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, } my_dirend(dirp); + if (dropped_tables) + *dropped_tables= tot_list; + /* If the directory is a symbolic link, remove the link first, then remove the directory the symbolic link pointed at diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e948a65f301..80ac9e007b9 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -156,8 +156,7 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists, int mysql_rm_table_part2_with_lock(THD *thd, TABLE_LIST *tables, bool if_exists, - bool drop_temporary, bool dont_log_query, - List* dropped_tables) + bool drop_temporary, bool dont_log_query) { int error; thd->mysys_var->current_mutex= &LOCK_open; @@ -166,23 +165,6 @@ int mysql_rm_table_part2_with_lock(THD *thd, error=mysql_rm_table_part2(thd,tables, if_exists, drop_temporary, dont_log_query); - /* - For now we assume that if we got success all the tables in the list - were actually dropped, otherwise, assume none were dropped. - TODO: fix it to work with a partial drop - extremely rare case, but - can happen. - */ - if (!error && dropped_tables) - { - TABLE_LIST* tbl; - - for (tbl= tables; tbl; tbl= tbl->next) - { - String *dropped_table= new (thd->mem_root) - String(tbl->real_name,&my_charset_latin1); - dropped_tables->push_back(dropped_table); - } - } pthread_mutex_unlock(&LOCK_open); @@ -238,6 +220,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, for (table=tables ; table ; table=table->next) { char *db=table->db; + table->was_dropped= 0; mysql_ha_flush(thd, table, MYSQL_HA_CLOSE_FINAL); if (!close_temporary_table(thd, db, table->real_name)) { @@ -298,6 +281,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, wrong_tables.append(','); wrong_tables.append(String(table->real_name,system_charset_info)); } + else + table->was_dropped= 1; } thd->tmp_table_used= tmp_table_deleted; error= 0; diff --git a/sql/table.h b/sql/table.h index 77153e5d8cd..fb742acf804 100644 --- a/sql/table.h +++ b/sql/table.h @@ -235,6 +235,9 @@ typedef struct st_table_list bool cacheable_table; /* stop PS caching */ /* used in multi-upd privelege check */ bool table_in_update_from_clause; + + /* used for proper partially successful DROP DATABASE binlogging */ + bool was_dropped; } TABLE_LIST; typedef struct st_changed_table_list