From ef0829ef40eb4136eed4282057baa4126dd66b69 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 1 May 2021 22:29:38 +0200 Subject: [PATCH 01/98] - Major update of the json/bson/mongo table types programs. Fix several bugs, chiefly concerning CURL operations. modified: storage/connect/bson.cpp modified: storage/connect/cmgfam.cpp modified: storage/connect/cmgoconn.cpp modified: storage/connect/cmgoconn.h modified: storage/connect/colblk.h modified: storage/connect/ha_connect.cc modified: storage/connect/jmgfam.cpp modified: storage/connect/jmgoconn.cpp modified: storage/connect/jmgoconn.h modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/mysql-test/connect/r/bson_mongo_c.result modified: storage/connect/mysql-test/connect/r/json_mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_java_2.result modified: storage/connect/mysql-test/connect/r/mongo_java_3.result modified: storage/connect/mysql-test/connect/std_data/Mongo2.jar modified: storage/connect/mysql-test/connect/std_data/Mongo3.jar modified: storage/connect/tabbson.cpp modified: storage/connect/tabbson.h modified: storage/connect/tabcmg.cpp modified: storage/connect/tabcmg.h modified: storage/connect/tabjmg.cpp modified: storage/connect/tabjmg.h modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h --- storage/connect/bson.cpp | 11 +- storage/connect/cmgfam.cpp | 5 + storage/connect/cmgoconn.cpp | 467 +++++++++++------- storage/connect/cmgoconn.h | 19 +- storage/connect/colblk.h | 3 +- storage/connect/ha_connect.cc | 15 +- storage/connect/jmgfam.cpp | 12 +- storage/connect/jmgoconn.cpp | 149 ++++-- storage/connect/jmgoconn.h | 11 +- storage/connect/json.cpp | 27 +- storage/connect/json.h | 2 +- .../mysql-test/connect/r/bson_mongo_c.result | 2 +- .../mysql-test/connect/r/json_mongo_c.result | 2 +- .../mysql-test/connect/r/mongo_c.result | 34 +- .../mysql-test/connect/r/mongo_java_2.result | 24 +- .../mysql-test/connect/r/mongo_java_3.result | 24 +- .../mysql-test/connect/std_data/Mongo2.jar | Bin 623907 -> 624130 bytes .../mysql-test/connect/std_data/Mongo3.jar | Bin 1705776 -> 1706054 bytes storage/connect/tabbson.cpp | 15 +- storage/connect/tabbson.h | 8 +- storage/connect/tabcmg.cpp | 153 +++--- storage/connect/tabcmg.h | 6 +- storage/connect/tabjmg.cpp | 26 +- storage/connect/tabjmg.h | 7 +- storage/connect/tabjson.cpp | 41 +- storage/connect/tabjson.h | 4 +- 26 files changed, 673 insertions(+), 394 deletions(-) diff --git a/storage/connect/bson.cpp b/storage/connect/bson.cpp index a0a421657bd..060e8b1e394 100644 --- a/storage/connect/bson.cpp +++ b/storage/connect/bson.cpp @@ -1205,15 +1205,14 @@ void BJSON::SetArrayValue(PBVAL bap, PBVAL nvp, int n) int i = 0; PBVAL bvp = NULL; - if (bap->To_Val) - for (bvp = GetArray(bap); bvp; i++, bvp = GetNext(bvp)) - if (i == n) { - SetValueVal(bvp, nvp); - return; - } + for (bvp = GetArray(bap); i < n; i++, bvp = bvp ? GetNext(bvp) : NULL) + if (!bvp) + AddArrayValue(bap, NewVal()); if (!bvp) AddArrayValue(bap, MOF(nvp)); + else + SetValueVal(bvp, nvp); } // end of SetValue diff --git a/storage/connect/cmgfam.cpp b/storage/connect/cmgfam.cpp index 690c087c2bb..a3afc154224 100644 --- a/storage/connect/cmgfam.cpp +++ b/storage/connect/cmgfam.cpp @@ -56,6 +56,7 @@ CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL) Pcg.Coll_name = tdp->Collname; Pcg.Options = tdp->Options; Pcg.Filter = tdp->Filter; + Pcg.Line = NULL; Pcg.Pipe = tdp->Pipe && tdp->Options != NULL; Lrecl = tdp->Lrecl + tdp->Ending; } else { @@ -64,6 +65,7 @@ CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL) Pcg.Coll_name = NULL; Pcg.Options = NULL; Pcg.Filter = NULL; + Pcg.Line = NULL; Pcg.Pipe = false; Lrecl = 0; } // endif tdp @@ -88,6 +90,7 @@ CMGFAM::CMGFAM(PBDEF tdp) : DOSFAM((PDOSDEF)NULL) Pcg.Coll_name = tdp->Collname; Pcg.Options = tdp->Options; Pcg.Filter = tdp->Filter; + Pcg.Line = NULL; Pcg.Pipe = tdp->Pipe && tdp->Options != NULL; Lrecl = tdp->Lrecl + tdp->Ending; } else { @@ -96,6 +99,7 @@ CMGFAM::CMGFAM(PBDEF tdp) : DOSFAM((PDOSDEF)NULL) Pcg.Coll_name = NULL; Pcg.Options = NULL; Pcg.Filter = NULL; + Pcg.Line = NULL; Pcg.Pipe = false; Lrecl = 0; } // endif tdp @@ -280,6 +284,7 @@ int CMGFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ int CMGFAM::WriteBuffer(PGLOBAL g) { + Pcg.Line = Tdbp->GetLine(); return Cmgp->Write(g); } // end of WriteBuffer diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 474f940a8cf..7aa35253514 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -1,7 +1,7 @@ /************ CMgoConn C++ Functions Source Code File (.CPP) ***********/ -/* Name: CMgoConn.CPP Version 1.0 */ +/* Name: CMgoConn.CPP Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* */ /* This file contains the MongoDB C connection classes functions. */ /***********************************************************************/ @@ -24,7 +24,7 @@ bool CMgoConn::IsInit = false; -bool IsNum(PSZ s); +bool IsArray(PSZ s); bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s); /* --------------------------- Class INCOL --------------------------- */ @@ -47,12 +47,13 @@ void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp) break; if (!kp) { - icp = new(g) INCOL(IsNum(p)); + icp = new(g) INCOL(); kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL)); kcp->Next = NULL; kcp->Incolp = icp; kcp->Colp = NULL; kcp->Key = PlugDup(g, jp); + kcp->Array = IsArray(p); if (Klist) { for (kp = Klist; kp->Next; kp = kp->Next); @@ -73,6 +74,7 @@ void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp) kcp->Incolp = NULL; kcp->Colp = colp; kcp->Key = jp; + kcp->Array = IsArray(jp); if (Klist) { for (kp = Klist; kp->Next; kp = kp->Next); @@ -168,10 +170,11 @@ bool CMgoConn::Connect(PGLOBAL g) mongo_init(true); #endif // !__WIN__ - Uri = mongoc_uri_new(Pcg->Uristr); + Uri = mongoc_uri_new_with_error(Pcg->Uristr, &Error); if (!Uri) { - sprintf(g->Message, "Failed to parse URI: \"%s\"", Pcg->Uristr); + sprintf(g->Message, "Failed to parse URI: \"%s\" Msg: %s", + Pcg->Uristr, Error.message); return true; } // endif Uri @@ -228,8 +231,8 @@ bool CMgoConn::Connect(PGLOBAL g) int CMgoConn::CollSize(PGLOBAL g) { int cnt; - bson_t *query; - const char *jf = NULL; + bson_t* query; + const char* jf = NULL; if (Pcg->Pipe) return 10; @@ -237,7 +240,7 @@ int CMgoConn::CollSize(PGLOBAL g) jf = Pcg->Filter; if (jf) { - query = bson_new_from_json((const uint8_t *)jf, -1, &Error); + query = bson_new_from_json((const uint8_t*)jf, -1, &Error); if (!query) { htrc("Wrong filter: %s", Error.message); @@ -247,8 +250,17 @@ int CMgoConn::CollSize(PGLOBAL g) } else query = bson_new(); +#if defined(NDEBUG) cnt = (int)mongoc_collection_count(Collection, - MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error); + MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error); +#else + if (jf) + cnt = (int)mongoc_collection_count_documents(Collection, + query, NULL, NULL, NULL, &Error); + else + cnt = (int)mongoc_collection_estimated_document_count( + Collection, NULL, NULL, NULL, &Error); +#endif if (cnt < 0) { htrc("Collection count: %s", Error.message); @@ -260,30 +272,81 @@ int CMgoConn::CollSize(PGLOBAL g) } // end of CollSize /***********************************************************************/ -/* OpenDB: Data Base open routine for MONGO access method. */ +/* Project: make the projection avoid path collision. */ +/***********************************************************************/ +void CMgoConn::Project(PGLOBAL g, PSTRG s) +{ + bool m, b = false; + size_t n; + PSZ path; + PCOL cp; + PTDB tp = Pcg->Tdbp; + PTHP hp, php = NULL, * nphp = &php; + + for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { + path = cp->GetJpath(g, true); + + for (hp = php; hp; hp = hp->Next) { + if (strlen(path) < strlen(hp->Path)) { + n = strlen(path); + m = true; + } else { + n = strlen(hp->Path); + m = false; + } // endif path + + if (!strncmp(path, hp->Path, n)) + break; + + } // endfor hp + + if (!hp) { + // New path + hp = (PTHP)PlugSubAlloc(g, NULL, sizeof(PTH)); + hp->Path = path; + hp->Next = NULL; + *nphp = hp; + nphp = &hp->Next; + } else if (m) // Smaller path must replace longer one + hp->Path = path; + + } // endfor cp + + for (hp = php; hp; hp = hp->Next) { + if (b) + s->Append(",\""); + else + b = true; + + s->Append(hp->Path); + s->Append("\":1"); + } // endfor hp + +} // end of Project + +/***********************************************************************/ +/* MakeCursor: make the cursor used to retrieve documents. */ /***********************************************************************/ bool CMgoConn::MakeCursor(PGLOBAL g) { const char *p; - bool id, b = false, all = false; + bool id, all = false; PCSZ options = Pcg->Options; PTDB tp = Pcg->Tdbp; PCOL cp; PSTRG s = NULL; PFIL filp = tp->GetFilter(); - id = (tp->GetMode() != MODE_READ); + id = (tp->GetMode() == MODE_UPDATE || tp->GetMode() == MODE_DELETE); if (options && !stricmp(options, "all")) { options = NULL; all = true; - } // endif Options - - for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) - if (!strcmp(cp->GetName(), "_id")) - id = true; - else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options) + } else for (cp = tp->GetColumns(); cp && !all; cp = cp->GetNext()) + if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options) all = true; + else if (!id) + id = !strcmp(cp->GetFmt() ? cp->GetFmt() : cp->GetName(), "_id"); if (Pcg->Pipe) { if (trace(1)) @@ -311,23 +374,14 @@ bool CMgoConn::MakeCursor(PGLOBAL g) tp->SetFilter(NULL); // Not needed anymore } // endif To_Filter - if (!all && tp->GetColumns()) { + if (tp->GetColumns() && !strstr(s->GetStr(), "$project")) { // Project list s->Append(",{\"$project\":{\""); if (!id) s->Append("_id\":0,\""); - for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { - if (b) - s->Append(",\""); - else - b = true; - - s->Append(cp->GetJpath(g, true)); - s->Append("\":1"); - } // endfor cp - + Project(g, s); s->Append("}}"); } // endif all @@ -377,7 +431,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) if (MakeSelector(g, filp, s)) { strcpy(g->Message, "Failed making selector"); - return NULL; + return true; } // endif Selector tp->SetFilter(NULL); // Not needed anymore @@ -391,7 +445,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) if (!Query) { sprintf(g->Message, "Wrong filter: %s", Error.message); - return NULL; + return true; } // endif Query } else @@ -413,16 +467,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) if (!id) s->Append("_id\":0,\""); - for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { - if (b) - s->Append(",\""); - else - b = true; - - s->Append(cp->GetJpath(g, true)); - s->Append("\":1"); - } // endfor cp - + Project(g, s); s->Append("}}"); s->Resize(s->GetLength() + 1); p = s->GetStr(); @@ -435,7 +480,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) if (!Opts) { sprintf(g->Message, "Wrong options: %s", Error.message); - return NULL; + return true; } // endif Opts } // endif all @@ -495,44 +540,54 @@ void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k) key = bson_iter_key(iter); htrc("Found element key: \"%s\"\n", key); - if (BSON_ITER_HOLDS_UTF8(iter)) - htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL)); - else if (BSON_ITER_HOLDS_INT32(iter)) - htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter)); - else if (BSON_ITER_HOLDS_INT64(iter)) - htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter)); - else if (BSON_ITER_HOLDS_DOUBLE(iter)) - htrc("%s.%s=%g\n", k, key, bson_iter_double(iter)); - else if (BSON_ITER_HOLDS_DATE_TIME(iter)) - htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter)); - else if (BSON_ITER_HOLDS_OID(iter)) { - char str[25]; + switch (bson_iter_type(iter)) { + case BSON_TYPE_UTF8: + htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL)); + break; + case BSON_TYPE_INT32: + htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter)); + break; + case BSON_TYPE_INT64: + htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter)); + break; + case BSON_TYPE_DOUBLE: + htrc("%s.%s=%g\n", k, key, bson_iter_double(iter)); + break; + case BSON_TYPE_DATE_TIME: + htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter)); + break; + case BSON_TYPE_OID: { + char str[25]; - bson_oid_to_string(bson_iter_oid(iter), str); - htrc("%s.%s=%s\n", k, key, str); - } else if (BSON_ITER_HOLDS_DECIMAL128(iter)) { - char *str = NULL; - bson_decimal128_t dec; + bson_oid_to_string(bson_iter_oid(iter), str); + htrc("%s.%s=%s\n", k, key, str); + } break; + case BSON_TYPE_DECIMAL128: { + char* str = NULL; + bson_decimal128_t dec; - bson_iter_decimal128(iter, &dec); - bson_decimal128_to_string(&dec, str); - htrc("%s.%s=%s\n", k, key, str); - } else if (BSON_ITER_HOLDS_DOCUMENT(iter)) { - bson_iter_t child; + bson_iter_decimal128(iter, &dec); + bson_decimal128_to_string(&dec, str); + htrc("%s.%s=%s\n", k, key, str); + } break; + case BSON_TYPE_DOCUMENT: { + bson_iter_t child; - if (bson_iter_recurse(iter, &child)) - ShowDocument(&child, NULL, key); + if (bson_iter_recurse(iter, &child)) + ShowDocument(&child, NULL, key); - } else if (BSON_ITER_HOLDS_ARRAY(iter)) { - bson_t *arr; - bson_iter_t itar; - const uint8_t *data = NULL; - uint32_t len = 0; + } break; + case BSON_TYPE_ARRAY: { + bson_t* arr; + bson_iter_t itar; + const uint8_t* data = NULL; + uint32_t len = 0; - bson_iter_array(iter, &len, &data); - arr = bson_new_from_data(data, len); - ShowDocument(&itar, arr, key); - } // endif's + bson_iter_array(iter, &len, &data); + arr = bson_new_from_data(data, len); + ShowDocument(&itar, arr, key); + } break; + } // endswitch iter } // endwhile bson_iter_next @@ -545,7 +600,7 @@ void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k) /***********************************************************************/ void CMgoConn::MakeColumnGroups(PGLOBAL g) { - Fpc = new(g) INCOL(false); + Fpc = new(g) INCOL(); for (PCOL colp = Pcg->Tdbp->GetColumns(); colp; colp = colp->GetNext()) if (!colp->IsSpecial()) @@ -560,7 +615,7 @@ bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp) { for (PKC kp = icp->Klist; kp; kp = kp->Next) if (kp->Incolp) { - bool isdoc = !kp->Incolp->Array; + bool isdoc = !kp->Array; if (isdoc) BSON_APPEND_DOCUMENT_BEGIN(icp->Child, kp->Key, kp->Incolp->Child); @@ -582,7 +637,7 @@ bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp) } // end of DocWrite /***********************************************************************/ -/* WriteDB: Data Base write routine for DOS access method. */ +/* WriteDB: Data Base write routine for CMGO access method. */ /***********************************************************************/ int CMgoConn::Write(PGLOBAL g) { @@ -590,22 +645,45 @@ int CMgoConn::Write(PGLOBAL g) PTDB tp = Pcg->Tdbp; if (tp->GetMode() == MODE_INSERT) { - Fpc->Init(); + if (!Pcg->Line) { + Fpc->Init(); - if (DocWrite(g, Fpc)) - return RC_FX; + if (DocWrite(g, Fpc)) + return RC_FX; - if (trace(2)) { - char *str = bson_as_json(Fpc->Child, NULL); - htrc("Inserting: %s\n", str); - bson_free(str); - } // endif trace + if (trace(2)) { + char* str = bson_as_json(Fpc->Child, NULL); + htrc("Inserting: %s\n", str); + bson_free(str); + } // endif trace - if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE, - Fpc->Child, NULL, &Error)) { - sprintf(g->Message, "Mongo insert: %s", Error.message); - rc = RC_FX; - } // endif insert + if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE, + Fpc->Child, NULL, &Error)) { + sprintf(g->Message, "Mongo insert: %s", Error.message); + rc = RC_FX; + } // endif insert + + } else { + const uint8_t* val = (const uint8_t*)Pcg->Line; + bson_t* doc = bson_new_from_json(val, -1, &Error); + + if (doc && trace(2)) { + char* str = bson_as_json(doc, NULL); + htrc("Inserting: %s\n", str); + bson_free(str); + } // endif trace + + if (!doc) { + sprintf(g->Message, "bson_new_from_json: %s", Error.message); + rc = RC_FX; + } else if (!mongoc_collection_insert(Collection, + MONGOC_INSERT_NONE, doc, NULL, &Error)) { + sprintf(g->Message, "Mongo insert: %s", Error.message); + bson_destroy(doc); + rc = RC_FX; + } // endif insert + + } // endif Line } else { bool b = false; @@ -614,19 +692,26 @@ int CMgoConn::Write(PGLOBAL g) bson_iter_init(&iter, Document); - if (bson_iter_find(&iter, "_id")) { - if (BSON_ITER_HOLDS_OID(&iter)) - b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter)); - else if (BSON_ITER_HOLDS_INT32(&iter)) - b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter)); - else if (BSON_ITER_HOLDS_INT64(&iter)) - b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter)); - else if (BSON_ITER_HOLDS_DOUBLE(&iter)) - b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter)); - else if (BSON_ITER_HOLDS_UTF8(&iter)) - b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL)); - - } // endif iter + if (bson_iter_find(&iter, "_id")) + switch (bson_iter_type(&iter)) { + case BSON_TYPE_OID: + b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter)); + break; + case BSON_TYPE_UTF8: + b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL)); + break; + case BSON_TYPE_INT32: + b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter)); + break; + case BSON_TYPE_INT64: + b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter)); + break; + case BSON_TYPE_DOUBLE: + b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter)); + break; + default: + break; + } // endswitch iter if (b) { if (trace(2)) { @@ -721,7 +806,7 @@ void CMgoConn::Close(void) char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b) { char *s, *str = NULL; - char *Mbuf = (char*)PlugSubAlloc(g, NULL, colp->GetLength() + 1); + char *Mbuf = (char*)PlugSubAlloc(g, NULL, (size_t)colp->GetLength() + 1); int i, k = 0; bool ok = true; @@ -759,97 +844,100 @@ char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b) /***********************************************************************/ void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp) { - char *jpath = colp->GetJpath(g, false); - PVAL value = colp->GetValue(); + char *jpath = colp->GetJpath(g, false); + bool b = false; + PVAL value = colp->GetValue(); + bson_iter_t Iter; // Used to retrieve column value + bson_iter_t Desc; // Descendant iter - if (!strcmp(jpath, "*")) { + if (!*jpath || !strcmp(jpath, "*")) { value->SetValue_psz(Mini(g, colp, Document, false)); } else if (bson_iter_init(&Iter, Document) && bson_iter_find_descendant(&Iter, jpath, &Desc)) { - if (BSON_ITER_HOLDS_UTF8(&Desc)) - value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL)); - else if (BSON_ITER_HOLDS_INT32(&Desc)) - value->SetValue(bson_iter_int32(&Desc)); - else if (BSON_ITER_HOLDS_INT64(&Desc)) - value->SetValue(bson_iter_int64(&Desc)); - else if (BSON_ITER_HOLDS_DOUBLE(&Desc)) - value->SetValue(bson_iter_double(&Desc)); - else if (BSON_ITER_HOLDS_DATE_TIME(&Desc)) - value->SetValue(bson_iter_date_time(&Desc) / 1000); - else if (BSON_ITER_HOLDS_BOOL(&Desc)) { - bool b = bson_iter_bool(&Desc); + switch (bson_iter_type(&Desc)) { + case BSON_TYPE_UTF8: + value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL)); + break; + case BSON_TYPE_INT32: + value->SetValue(bson_iter_int32(&Desc)); + break; + case BSON_TYPE_INT64: + value->SetValue(bson_iter_int64(&Desc)); + break; + case BSON_TYPE_DOUBLE: + value->SetValue(bson_iter_double(&Desc)); + break; + case BSON_TYPE_DATE_TIME: + value->SetValue(bson_iter_date_time(&Desc) / 1000); + break; + case BSON_TYPE_BOOL: + b = bson_iter_bool(&Desc); - if (value->IsTypeNum()) - value->SetValue(b ? 1 : 0); - else - value->SetValue_psz(b ? "true" : "false"); + if (value->IsTypeNum()) + value->SetValue(b ? 1 : 0); + else + value->SetValue_psz(b ? "true" : "false"); - } else if (BSON_ITER_HOLDS_OID(&Desc)) { - char str[25]; + break; + case BSON_TYPE_OID: { + char str[25]; - bson_oid_to_string(bson_iter_oid(&Desc), str); - value->SetValue_psz(str); - } else if (BSON_ITER_HOLDS_NULL(&Iter)) { - // Apparently this does not work... - value->Reset(); - value->SetNull(true); - } else if (BSON_ITER_HOLDS_DECIMAL128(&Desc)) { - char *str = NULL; - bson_decimal128_t dec; + bson_oid_to_string(bson_iter_oid(&Desc), str); + value->SetValue_psz(str); + } break; + case BSON_TYPE_ARRAY: + b = true; + // passthru + case BSON_TYPE_DOCUMENT: + { // All this because MongoDB can return the wrong type + int i = 0; + const uint8_t *data = NULL; + uint32_t len = 0; - bson_iter_decimal128(&Desc, &dec); - bson_decimal128_to_string(&dec, str); - value->SetValue_psz(str); - bson_free(str); - } else if (BSON_ITER_HOLDS_DOCUMENT(&Iter)) { - bson_t *doc; - const uint8_t *data = NULL; - uint32_t len = 0; + for (; i < 2; i++) { + if (b) // Try array first + bson_iter_array(&Desc, &len, &data); + else + bson_iter_document(&Desc, &len, &data); - bson_iter_document(&Desc, &len, &data); + if (!data) { + len = 0; + b = !b; + } else + break; - if (data) { - doc = bson_new_from_data(data, len); - value->SetValue_psz(Mini(g, colp, doc, false)); - bson_destroy(doc); - } else { - // ... but we can come here in case of NULL! - value->Reset(); - value->SetNull(true); - } // endif data - - } else if (BSON_ITER_HOLDS_ARRAY(&Iter)) { - bson_t *arr; - const uint8_t *data = NULL; - uint32_t len = 0; - - bson_iter_array(&Desc, &len, &data); - - if (data) { - arr = bson_new_from_data(data, len); - value->SetValue_psz(Mini(g, colp, arr, true)); - bson_destroy(arr); - } else { - // This is a bug in returning the wrong type - // This fix is only for document items - bson_t *doc; - - bson_iter_document(&Desc, &len, &data); + } // endfor i if (data) { - doc = bson_new_from_data(data, len); - value->SetValue_psz(Mini(g, colp, doc, false)); + bson_t *doc = bson_new_from_data(data, len); + + value->SetValue_psz(Mini(g, colp, doc, b)); bson_destroy(doc); } else { // ... or we can also come here in case of NULL! value->Reset(); value->SetNull(true); - } // endif data + } // endif data - } // endif data + } break; + case BSON_TYPE_NULL: + // Apparently this does not work... + value->Reset(); + value->SetNull(true); + break; + case BSON_TYPE_DECIMAL128: { + char* str = NULL; + bson_decimal128_t dec; - } else - value->Reset(); + bson_iter_decimal128(&Desc, &dec); + bson_decimal128_to_string(&dec, str); + value->SetValue_psz(str); + bson_free(str); + } break; + default: + value->Reset(); + break; + } // endswitch Desc } else { // Field does not exist @@ -875,7 +963,28 @@ bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd) } else switch (colp->GetResultType()) { case TYPE_STRING: - rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue()); + if (colp->Stringify()) { + const uint8_t *val = (const uint8_t*)value->GetCharValue(); + bson_t *bsn = bson_new_from_json(val, -1, &Error); + + if (!bsn) { + sprintf (g->Message, "AddValue: %s", Error.message); + return true; + } else if (*key) { + if (*val == '[') + rc = BSON_APPEND_ARRAY(doc, key, bsn); + else + rc = BSON_APPEND_DOCUMENT(doc, key, bsn); + + } else { + bson_copy_to (bsn, doc); + rc = true; + } // endif's + + bson_free(bsn); + } else + rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue()); + break; case TYPE_INT: case TYPE_SHORT: diff --git a/storage/connect/cmgoconn.h b/storage/connect/cmgoconn.h index b1216ac576c..5c9fb4f763d 100644 --- a/storage/connect/cmgoconn.h +++ b/storage/connect/cmgoconn.h @@ -28,11 +28,8 @@ typedef struct mongo_parms { PCSZ Coll_name; PCSZ Options; PCSZ Filter; + PCSZ Line; bool Pipe; -//PCSZ User; // User connect info -//PCSZ Pwd; // Password connect info -//int Fsize; // Fetch size -//bool Scrollable; // Scrollable cursor } CMGOPARM, *PCPARM; typedef struct KEYCOL { @@ -40,15 +37,23 @@ typedef struct KEYCOL { PINCOL Incolp; PCOL Colp; char *Key; + bool Array; } *PKC; +typedef struct _path_list *PTHP; + +typedef struct _path_list { + PSZ Path; + PTHP Next; +} PTH; + /***********************************************************************/ /* Used when inserting values in a MongoDB collection. */ /***********************************************************************/ class INCOL : public BLOCK { public: // Constructor - INCOL(bool ar) { Child = bson_new(); Klist = NULL; Array = ar; } + INCOL(void) { Child = bson_new(); Klist = NULL; } // Methods void AddCol(PGLOBAL g, PCOL colp, char *jp); @@ -58,7 +63,6 @@ public: //Members bson_t *Child; PKC Klist; - bool Array; }; // end of INCOL; /***********************************************************************/ @@ -80,6 +84,7 @@ public: bool IsConnected(void) { return m_Connected; } bool Connect(PGLOBAL g); int CollSize(PGLOBAL g); + void CMgoConn::Project(PGLOBAL g, PSTRG s); bool MakeCursor(PGLOBAL g); int ReadNext(PGLOBAL g); PSZ GetDocument(PGLOBAL g); @@ -108,8 +113,6 @@ protected: bson_t *Query; // MongoDB cursor filter bson_t *Opts; // MongoDB cursor options bson_error_t Error; - bson_iter_t Iter; // Used to retrieve column value - bson_iter_t Desc; // Descendant iter PINCOL Fpc; // To insert INCOL classes PFBLOCK fp; bool m_Connected; diff --git a/storage/connect/colblk.h b/storage/connect/colblk.h index b22933d9ebb..f303528f982 100644 --- a/storage/connect/colblk.h +++ b/storage/connect/colblk.h @@ -38,7 +38,8 @@ class DllExport COLBLK : public XOBJECT { virtual PTDB GetTo_Tdb(void) {return To_Tdb;} virtual int GetClustered(void) {return 0;} virtual int IsClustered(void) {return FALSE;} - virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;} + virtual bool Stringify(void) {return FALSE;} + virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;} PCOL GetNext(void) {return Next;} PSZ GetName(void) {return Name;} int GetIndex(void) {return Index;} diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index b3c0b0c69b2..f85035d6e06 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -5470,14 +5470,13 @@ static bool add_field(String* sql, TABTYPE ttp, const char* field_name, int typ, } // endif rem if (fmt && *fmt) { - switch (ttp) { - case TAB_JSON: error |= sql->append(" JPATH='"); break; -#if defined(BSON_SUPPORT) - case TAB_BSON: error |= sql->append(" JPATH='"); break; -#endif // BSON_SUPPORT - case TAB_XML: error |= sql->append(" XPATH='"); break; - default: error |= sql->append(" FIELD_FORMAT='"); - } // endswitch ttp + switch (ttp) { + case TAB_MONGO: + case TAB_BSON: + case TAB_JSON: error |= sql->append(" JPATH='"); break; + case TAB_XML: error |= sql->append(" XPATH='"); break; + default: error |= sql->append(" FIELD_FORMAT='"); + } // endswitch ttp error |= sql->append_for_single_quote(fmt, strlen(fmt)); error |= sql->append("'"); diff --git a/storage/connect/jmgfam.cpp b/storage/connect/jmgfam.cpp index 2d45753ec63..d7f469cf4fe 100644 --- a/storage/connect/jmgfam.cpp +++ b/storage/connect/jmgfam.cpp @@ -1,11 +1,11 @@ /************ JMONGO FAM C++ Program Source Code File (.CPP) ***********/ /* PROGRAM NAME: jmgfam.cpp */ /* ------------- */ -/* Version 1.1 */ +/* Version 1.2 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 20017 - 2020 */ +/* (C) Copyright to the author Olivier BERTRAND 20017 - 2021 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -241,8 +241,8 @@ bool JMGFAM::OpenTableFile(PGLOBAL g) return true; } // endif Mode - if (Mode == MODE_INSERT) - Jcp->MakeColumnGroups(g, Tdbp); +//if (Mode == MODE_INSERT) +// Jcp->MakeColumnGroups(g, Tdbp); if (Mode != MODE_UPDATE) return Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe); @@ -346,14 +346,14 @@ int JMGFAM::ReadBuffer(PGLOBAL g) } // end of ReadBuffer /***********************************************************************/ -/* WriteBuffer: File write routine for MGO access method. */ +/* WriteBuffer: File write routine for JMG access method. */ /***********************************************************************/ int JMGFAM::WriteBuffer(PGLOBAL g) { int rc = RC_OK; if (Mode == MODE_INSERT) { - rc = Jcp->DocWrite(g); + rc = Jcp->DocWrite(g, Tdbp->GetLine()); } else if (Mode == MODE_DELETE) { rc = Jcp->DocDelete(g, false); } else if (Mode == MODE_UPDATE) { diff --git a/storage/connect/jmgoconn.cpp b/storage/connect/jmgoconn.cpp index 0af91bc78cd..a4091e88bbf 100644 --- a/storage/connect/jmgoconn.cpp +++ b/storage/connect/jmgoconn.cpp @@ -1,7 +1,7 @@ /************ JMgoConn C++ Functions Source Code File (.CPP) ***********/ -/* Name: JMgoConn.CPP Version 1.1 */ +/* Name: JMgoConn.CPP Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* */ /* This file contains the MongoDB Java connection classes functions. */ /***********************************************************************/ @@ -24,7 +24,7 @@ #define nullptr 0 -bool IsNum(PSZ s); +bool IsArray(PSZ s); bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s); /* --------------------------- Class JNCOL --------------------------- */ @@ -43,19 +43,21 @@ void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp) *p++ = 0; for (kp = Klist; kp; kp = kp->Next) - if (kp->Jncolp && !strcmp(jp, kp->Key)) + if (kp->Jncolp && ((kp->Key && !strcmp(jp, kp->Key)) + || (!kp->Key && IsArray(jp) && kp->N == atoi(jp)))) break; if (!kp) { - icp = new(g) JNCOL(IsNum(p)); + icp = new(g) JNCOL(); kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL)); kcp->Next = NULL; kcp->Jncolp = icp; kcp->Colp = NULL; + kcp->Array = IsArray(jp); - if (Array) { + if (kcp->Array) { kcp->Key = NULL; - kcp->N = atoi(p); + kcp->N = atoi(jp); } else { kcp->Key = PlugDup(g, jp); kcp->N = 0; @@ -75,12 +77,12 @@ void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp) icp->AddCol(g, colp, p); } else { kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL)); - kcp->Next = NULL; kcp->Jncolp = NULL; kcp->Colp = colp; + kcp->Array = IsArray(jp); - if (Array) { + if (kcp->Array) { kcp->Key = NULL; kcp->N = atoi(jp); } else { @@ -108,7 +110,7 @@ JMgoConn::JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper) CollName = collname; readid = fetchid = getdocid = objfldid = fcollid = acollid = mkdocid = docaddid = mkarid = araddid = insertid = updateid = - deleteid = gcollid = countid = rewindid = nullptr; + deleteid = gcollid = countid = rewindid = mkbsonid = nullptr; DiscFunc = "MongoDisconnect"; Fpc = NULL; m_Fetch = 0; @@ -235,7 +237,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, PCSZ filter, bool pipe) { const char *p; - bool b = false, id = (tdbp->GetMode() != MODE_READ), all = false; + bool id, b = false, all = false; uint len; PCOL cp; PSZ jp; @@ -246,13 +248,14 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, if (Options && !stricmp(Options, "all")) { Options = NULL; all = true; - } // endif Options + } else + id = (tdbp->GetMode() == MODE_UPDATE || tdbp->GetMode() == MODE_DELETE); - for (cp = tdbp->GetColumns(); cp; cp = cp->GetNext()) - if (!strcmp(cp->GetName(), "_id")) - id = true; - else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe)) + for (cp = tdbp->GetColumns(); cp && !all; cp = cp->GetNext()) + if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe)) all = true; + else if (!id) + id = !strcmp(cp->GetJpath(g, false), "_id"); if (pipe && Options) { if (trace(1)) @@ -535,7 +538,7 @@ PSZ JMgoConn::GetDocument(void) /***********************************************************************/ void JMgoConn::MakeColumnGroups(PGLOBAL g, PTDB tdbp) { - Fpc = new(g) JNCOL(false); + Fpc = new(g) JNCOL(); for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext()) if (!colp->IsSpecial()) @@ -553,7 +556,7 @@ bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode) return true; if (gmID(g, docaddid, "DocAdd", - "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z")) + "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;I)Z")) return true; if (gmID(g, updateid, "CollUpdate", "(Ljava/lang/Object;)J")) @@ -563,14 +566,19 @@ bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode) if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;")) return true; + if (gmID(g, mkbsonid, "MakeBson", + "(Ljava/lang/String;I)Ljava/lang/Object;")) + return true; + if (gmID(g, docaddid, "DocAdd", - "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z")) + "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;I)Z")) return true; if (gmID(g, mkarid, "MakeArray", "()Ljava/lang/Object;")) return true; - if (gmID(g, araddid, "ArrayAdd", "(Ljava/lang/Object;ILjava/lang/Object;)Z")) + if (gmID(g, araddid, "ArrayAdd", + "(Ljava/lang/Object;ILjava/lang/Object;I)Z")) return true; if (gmID(g, insertid, "CollInsert", "(Ljava/lang/Object;)Z")) @@ -638,49 +646,82 @@ jobject JMgoConn::MakeObject(PGLOBAL g, PCOL colp, bool&error ) return val; } // end of MakeObject +/***********************************************************************/ +/* Stringify. */ +/***********************************************************************/ +bool JMgoConn::Stringify(PCOL colp) +{ + bool b = false; + + if (colp) + b = (colp->Stringify() && colp->GetResultType() == TYPE_STRING); + + return b; +} // end of Stringify + /***********************************************************************/ /* MakeDoc. */ /***********************************************************************/ jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp) { - bool error = false; + int j; + bool b, error = false; jobject parent, child, val; jstring jkey; - - if (jcp->Array) + PJKC kp = jcp->Klist; + + if (kp->Array) parent = env->CallObjectMethod(job, mkarid); else parent = env->CallObjectMethod(job, mkdocid); - for (PJKC kp = jcp->Klist; kp; kp = kp->Next) + for (j = 0; kp; j = 0, kp = kp->Next) { + if (Stringify(kp->Colp)) { + switch (*kp->Colp->GetCharValue()) { + case '{': j = 1; break; + case '[': j = 2; break; + default: break; + } // endswitch + + b = (!kp->Key || !*kp->Key || *kp->Key == '*'); + } else + b = false; + if (kp->Jncolp) { if (!(child = MakeDoc(g, kp->Jncolp))) return NULL; - if (!jcp->Array) { + if (!kp->Array) { jkey = env->NewStringUTF(kp->Key); - if (env->CallBooleanMethod(job, docaddid, parent, jkey, child)) + if (env->CallBooleanMethod(job, docaddid, parent, jkey, child, j)) return NULL; env->DeleteLocalRef(jkey); } else - if (env->CallBooleanMethod(job, araddid, parent, kp->N, child)) + if (env->CallBooleanMethod(job, araddid, parent, kp->N, child, j)) return NULL; + env->DeleteLocalRef(child); } else { if (!(val = MakeObject(g, kp->Colp, error))) { if (error) return NULL; - } else if (!jcp->Array) { - jkey = env->NewStringUTF(kp->Key); + } else if (!kp->Array) { + if (!b) { + jkey = env->NewStringUTF(kp->Key); - if (env->CallBooleanMethod(job, docaddid, parent, jkey, val)) - return NULL; + if (env->CallBooleanMethod(job, docaddid, parent, jkey, val, j)) + return NULL; - env->DeleteLocalRef(jkey); - } else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val)) { + env->DeleteLocalRef(jkey); + } else { + env->DeleteLocalRef(parent); + parent = env->CallObjectMethod(job, mkbsonid, val, j); + } // endif b + + } else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val, j)) { if (Check(-1)) sprintf(g->Message, "ArrayAdd: %s", Msg); else @@ -689,19 +730,38 @@ jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp) return NULL; } // endif ArrayAdd + env->DeleteLocalRef(val); } // endif Jncolp + } // endfor kp + return parent; } // end of MakeDoc /***********************************************************************/ /* Insert a new document in the collation. */ /***********************************************************************/ -int JMgoConn::DocWrite(PGLOBAL g) +int JMgoConn::DocWrite(PGLOBAL g, PCSZ line) { - jobject doc; + int rc = RC_OK; + jobject doc = nullptr; - if (!Fpc || !(doc = MakeDoc(g, Fpc))) + if (line) { + int j; + jobject val = env->NewStringUTF(line); + + switch (*line) { + case '{': j = 1; break; + case '[': j = 2; break; + default: j = 0; break; + } // endswitch line + + doc = env->CallObjectMethod(job, mkbsonid, val, j); + env->DeleteLocalRef(val); + } else if (Fpc) + doc = MakeDoc(g, Fpc); + + if (!doc) return RC_FX; if (env->CallBooleanMethod(job, insertid, doc)) { @@ -710,10 +770,11 @@ int JMgoConn::DocWrite(PGLOBAL g) else sprintf(g->Message, "CollInsert: unknown error"); - return RC_FX; + rc = RC_FX; } // endif Insert - return RC_OK; + env->DeleteLocalRef(doc); + return rc; } // end of DocWrite /***********************************************************************/ @@ -721,7 +782,7 @@ int JMgoConn::DocWrite(PGLOBAL g) /***********************************************************************/ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp) { - int rc = RC_OK; + int j = 0, rc = RC_OK; bool error; PCOL colp; jstring jkey; @@ -734,8 +795,14 @@ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp) if (error) return RC_FX; + else if (Stringify(colp)) + switch (*colp->GetCharValue()) { + case '{': j = 1; break; + case '[': j = 2; break; + default: break; + } // endswitch - if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val)) + if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val, j)) return RC_OK; env->DeleteLocalRef(jkey); @@ -745,7 +812,7 @@ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp) upd = env->CallObjectMethod(job, mkdocid); jkey = env->NewStringUTF("$set"); - if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist)) + if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist, 0)) return RC_OK; env->DeleteLocalRef(jkey); diff --git a/storage/connect/jmgoconn.h b/storage/connect/jmgoconn.h index 8ee7985d760..9fed1907abc 100644 --- a/storage/connect/jmgoconn.h +++ b/storage/connect/jmgoconn.h @@ -25,6 +25,7 @@ typedef struct JKCOL { PCOL Colp; char *Key; int N; + bool Array; } *PJKC; /***********************************************************************/ @@ -33,18 +34,18 @@ typedef struct JKCOL { class JNCOL : public BLOCK { public: // Constructor - JNCOL(bool ar) { Klist = NULL; Array = ar; } +//JNCOL(bool ar) { Klist = NULL; Array = ar; } + JNCOL(void) { Klist = NULL; } // Methods void AddCol(PGLOBAL g, PCOL colp, PSZ jp); //Members PJKC Klist; - bool Array; }; // end of JNCOL; /***********************************************************************/ -/* JMgoConn class. */ +/* JMgoConn class. */ /***********************************************************************/ class JMgoConn : public JAVAConn { friend class TDBJMG; @@ -81,11 +82,12 @@ public: bool GetMethodId(PGLOBAL g, MODE mode); jobject MakeObject(PGLOBAL g, PCOL colp, bool& error); jobject MakeDoc(PGLOBAL g, PJNCOL jcp); - int DocWrite(PGLOBAL g); + int DocWrite(PGLOBAL g, PCSZ line); int DocUpdate(PGLOBAL g, PTDB tdbp); int DocDelete(PGLOBAL g, bool all); bool Rewind(void); PSZ GetDocument(void); + bool Stringify(PCOL colp); protected: // Members @@ -100,6 +102,7 @@ protected: jmethodID getdocid; // The GetDoc method ID jmethodID objfldid; // The ObjectField method ID jmethodID mkdocid; // The MakeDocument method ID + jmethodID mkbsonid; // The MakeBson method ID jmethodID docaddid; // The DocAdd method ID jmethodID mkarid; // The MakeArray method ID jmethodID araddid; // The ArrayAdd method ID diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index f65294429db..b1f9f10957b 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -77,6 +77,24 @@ bool IsNum(PSZ s) return true; } // end of IsNum +/***********************************************************************/ +/* IsArray: check whether this is a Mongo array path. */ +/***********************************************************************/ +bool IsArray(PSZ s) +{ + char* p = s; + + if (!p || !*p) + return false; + else for (; *p; p++) + if (*p == '.') + break; + else if (!isdigit(*p)) + return false; + + return true; +} // end of IsArray + /***********************************************************************/ /* NextChr: return the first found '[' or Sep pointer. */ /***********************************************************************/ @@ -1326,9 +1344,9 @@ bool JARRAY::Merge(PGLOBAL g, PJSON jsp) } // end of Merge /***********************************************************************/ -/* Set the nth Value of the Array Value list. */ +/* Set the nth Value of the Array Value list or add it. */ /***********************************************************************/ -bool JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n) +void JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n) { int i = 0; PJVAL jp, *jpp = &First; @@ -1339,7 +1357,6 @@ bool JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n) *jpp = jvp; jvp->Next = (jp ? jp->Next : NULL); - return false; } // end of SetValue /***********************************************************************/ @@ -1417,7 +1434,7 @@ bool JARRAY::IsNull(void) /***********************************************************************/ JVALUE::JVALUE(PJSON jsp) : JSON() { - if (jsp->GetType() == TYPE_JVAL) { + if (jsp && jsp->GetType() == TYPE_JVAL) { PJVAL jvp = (PJVAL)jsp; // Val = ((PJVAL)jsp)->GetVal(); @@ -1434,7 +1451,7 @@ JVALUE::JVALUE(PJSON jsp) : JSON() } else { Jsp = jsp; // Val = NULL; - DataType = TYPE_JSON; + DataType = Jsp ? TYPE_JSON : TYPE_NULL; Nd = 0; } // endif Type diff --git a/storage/connect/json.h b/storage/connect/json.h index 3a026f5df22..ef5f6c7b7de 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -184,7 +184,7 @@ class JARRAY : public JSON { // Specific PJVAL AddArrayValue(PGLOBAL g, PJVAL jvp = NULL, int* x = NULL); - bool SetArrayValue(PGLOBAL g, PJVAL jvp, int i); + void SetArrayValue(PGLOBAL g, PJVAL jvp, int i); void InitArray(PGLOBAL g); protected: diff --git a/storage/connect/mysql-test/connect/r/bson_mongo_c.result b/storage/connect/mysql-test/connect/r/bson_mongo_c.result index 83bf7cd1974..e2273be4bec 100644 --- a/storage/connect/mysql-test/connect/r/bson_mongo_c.result +++ b/storage/connect/mysql-test/connect/r/bson_mongo_c.result @@ -363,7 +363,7 @@ _id item prices_0 prices_1 prices_2 prices_3 prices_4 1 journal 87 45 63 12 78 2 notebook 123 456 789 NULL NULL 3 paper 5 7 3 8 NULL -4 planner 25 71 44 27 NULL +4 planner 25 71 NULL 44 27 5 postcard 5 7 3 8 NULL DROP TABLE t1; # diff --git a/storage/connect/mysql-test/connect/r/json_mongo_c.result b/storage/connect/mysql-test/connect/r/json_mongo_c.result index 482ccc85b57..6d4957167fc 100644 --- a/storage/connect/mysql-test/connect/r/json_mongo_c.result +++ b/storage/connect/mysql-test/connect/r/json_mongo_c.result @@ -363,7 +363,7 @@ _id item prices_0 prices_1 prices_2 prices_3 prices_4 1 journal 87 45 63 12 78 2 notebook 123 456 789 NULL NULL 3 paper 5 7 3 8 NULL -4 planner 25 71 44 27 NULL +4 planner 25 71 NULL 44 27 5 postcard 5 7 3 8 NULL DROP TABLE t1; # diff --git a/storage/connect/mysql-test/connect/r/mongo_c.result b/storage/connect/mysql-test/connect/r/mongo_c.result index 8b86ce32943..899a123dc5f 100644 --- a/storage/connect/mysql-test/connect/r/mongo_c.result +++ b/storage/connect/mysql-test/connect/r/mongo_c.result @@ -64,23 +64,23 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord` varchar(512) NOT NULL `FIELD_FORMAT`='address.coord', - `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(10) NOT NULL `JPATH`='address.building', + `address_coord` varchar(512) NOT NULL `JPATH`='address.coord', + `address_street` char(38) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, `cuisine` char(64) NOT NULL, - `grades_0` varchar(512) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `grades_0` varchar(512) DEFAULT NULL `JPATH`='grades.0', `name` char(98) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=C,Version=0' `DATA_CHARSET`='utf8' SELECT * FROM t1 LIMIT 5; _id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id -58ada47de5a51ddfcd5ed51c 1007 Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445 -58ada47de5a51ddfcd5ed51d 469 Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340 -58ada47de5a51ddfcd5ed51e 351 West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841 -58ada47de5a51ddfcd5ed51f 2780 Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018 -58ada47de5a51ddfcd5ed520 97-22 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed51c 1007 [-73.856076999999999089,40.848447000000000173] Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 [-73.96170399999999745,40.66294200000000103] Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 [-73.985135599999992451,40.767691900000002647] West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 [-73.982419999999990523,40.579504999999997494] Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 [-73.860115199999995639,40.731173900000001709] 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068 DROP TABLE t1; # # Dropping a column @@ -249,14 +249,14 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord_0` double(12,6) NOT NULL `FIELD_FORMAT`='address.coord.0', - `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(6) NOT NULL `JPATH`='address.building', + `address_coord_0` double(12,6) NOT NULL `JPATH`='address.coord.0', + `address_street` char(25) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, - `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', - `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', - `grades_0_score` int(11) NOT NULL `FIELD_FORMAT`='grades.0.score', + `grades_0_date` datetime NOT NULL `JPATH`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade', + `grades_0_score` int(11) NOT NULL `JPATH`='grades.0.score', `name` char(32) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0' diff --git a/storage/connect/mysql-test/connect/r/mongo_java_2.result b/storage/connect/mysql-test/connect/r/mongo_java_2.result index cccda2760d6..bcedd717cc4 100644 --- a/storage/connect/mysql-test/connect/r/mongo_java_2.result +++ b/storage/connect/mysql-test/connect/r/mongo_java_2.result @@ -64,13 +64,13 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord` char(41) NOT NULL `FIELD_FORMAT`='address.coord', - `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(10) NOT NULL `JPATH`='address.building', + `address_coord` char(41) NOT NULL `JPATH`='address.coord', + `address_street` char(38) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, `cuisine` char(64) NOT NULL, - `grades_0` char(99) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `grades_0` char(99) DEFAULT NULL `JPATH`='grades.0', `name` char(98) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8' @@ -249,14 +249,14 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0', - `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(6) NOT NULL `JPATH`='address.building', + `address_coord_0` double(18,14) NOT NULL `JPATH`='address.coord.0', + `address_street` char(25) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, - `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', - `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', - `grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score', + `grades_0_date` datetime NOT NULL `JPATH`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade', + `grades_0_score` int(2) NOT NULL `JPATH`='grades.0.score', `name` char(32) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2' diff --git a/storage/connect/mysql-test/connect/r/mongo_java_3.result b/storage/connect/mysql-test/connect/r/mongo_java_3.result index ae39148a156..3183d4984d6 100644 --- a/storage/connect/mysql-test/connect/r/mongo_java_3.result +++ b/storage/connect/mysql-test/connect/r/mongo_java_3.result @@ -64,13 +64,13 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord` char(39) NOT NULL `FIELD_FORMAT`='address.coord', - `address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(10) NOT NULL `JPATH`='address.building', + `address_coord` char(39) NOT NULL `JPATH`='address.coord', + `address_street` char(38) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, `cuisine` char(64) NOT NULL, - `grades_0` char(84) DEFAULT NULL `FIELD_FORMAT`='grades.0', + `grades_0` char(84) DEFAULT NULL `JPATH`='grades.0', `name` char(98) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8' @@ -249,14 +249,14 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `_id` char(24) NOT NULL, - `address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building', - `address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0', - `address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street', - `address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode', + `address_building` char(6) NOT NULL `JPATH`='address.building', + `address_coord_0` double(18,14) NOT NULL `JPATH`='address.coord.0', + `address_street` char(25) NOT NULL `JPATH`='address.street', + `address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode', `borough` char(13) NOT NULL, - `grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date', - `grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade', - `grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score', + `grades_0_date` datetime NOT NULL `JPATH`='grades.0.date', + `grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade', + `grades_0_score` int(2) NOT NULL `JPATH`='grades.0.score', `name` char(32) NOT NULL, `restaurant_id` char(8) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3' diff --git a/storage/connect/mysql-test/connect/std_data/Mongo2.jar b/storage/connect/mysql-test/connect/std_data/Mongo2.jar index 9be654bd4c8e2a1a3fd159c2a69acb5acc55011c..ae485805d6a9f63bce2b2c0e12a42c3817f60618 100644 GIT binary patch delta 34056 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

n4T;mFW)Z-@Mgt2S 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 delta 33514 zcmaHT2V9Nq`*>%c(^lGh5A8vV29lzoM7^a*QA(Ljounm_L^l#LGNVL~vI>==ZKi>w zLZq~){O)HQZ|D8~KmR_T^Scn8yg_|B-#KXg54?ie5FAooshbILk&sCvf|9_~%4vz9z zB^BQo8foN1mJ@MYO(7l2-)-Z#l(jEO)uu(~pi*&CTg-+}LAMQZBfk|r5ApRbEDd>4 zE?nGpx$0J_twxqZ;Yyn;>xy5z-1Yl?=Je0h%mpvTPa1pGevIaC%!~atF*^27!~3c~ zYvKeeJSUg$aXS6saM=2ig1jr1p`T8avbQ(f%!?6_-<@2Ok!|nW;-K-l{A^AAQI&UL z!5we!_}Tm%-pgu#o*#8}neR6Byr-)5a^!E_Tb%rZYtD5xEVIbE6z*hMFyH^N>OS@c zo#6Aj8|IZQe7}I?vQ2$+j;;T0LH#&Vd(vX*MB})$6Sd|+j!S6Tw41A&Pgb09jmi;S z!EUX$Fd6T;?6^dV{JdlB`TA>d+97SJ85a)=>|DRj{zhYw?!^52{ckV%@Kt0SvB+6? zA-2JAjz-b#v$H+-*JK-AHR;bkE7v-?BXmyQ>sjAgi*^Pnrk{Slob2?8td+2Xx%A80 z5TTLO-;=kK2ggQlntC!MTkYj?U6;s;6sSBBSMHphR~~{ z-JW)b4}I!xt}ZV>m-KP9daudLd7+&x?`pz~;#21MhBR%lEamH~^L?1-8R%v)I9IE9 zVU6?GLn76z5;f7M7oM4@Y1_5>&dHJRjWy=`AU{XmM)bJp*TCJ&4VQ+B6cnDN74lD> z%X*gEL1DK*$CQQO=?ty&?+c=Q{9`wkzIb!8@e^wd6svx3YToT!ezev& zsjl{hrGr-Lje@KdL3eh@K33X&W2&Gv1bXK~bwZ5*P1yE&%A>0vM9R1Se6PFTWDauZ z>h(Git(+rUlB7Nxtte1f;-!*xxJP!lyYOd;R^`1|D%*#l+ja8B5tY<6?1+^-hDW78 z7(3oj%ib{Hw2^V{SWf?a@nG$u01KUC&y0>eQ-3?Rff_;95?H!>NNcb2Bc%<}Qp({n z{ZZ=Yf8DJ@Ht0S-_54Wdd&Net(?2hMO>$g+q0qx<(rodIB<-M2CMS*=oQ%A>UT#iq z$2RFXQ@1m3&$ec(M1e)a(=rApTpjqk7M>n{GrlPQflCb~%GG~?`|A@+)oX(SKRMby zI6R(kAa&5Tx}?#u=Db6H&IzZ2y&jeFY}vocWiW={vXWGO@$pgr9c@-isc)a> zn!eWgc%a(Y&^&KLncWq)N9yxjB$Rm<{A9-Gv%A&IuiXvt zS-RKHQB`o_NBTiIzde3mqE>ny4C?WA_v+oB(zQ$`F07;QLO@XI>mX%I~)*bB$1+U;i!r^+V}2jRIgbXyK}*aw;H=B9Zz{Ypy>_-+gAY0J#ow)) z$9Ni$8Bq2?>z(m=SN1=E%^>z#Zo_aV6RCU2iO*y8H5By-$S`GZ2=j_Bsz%N2RodT#$?TICx`6<=_F z|Ap}vdTXkqe?2n)=$&|dYh&`7EnQ%`vf06I-+c5Z`LloK3AYPt48uls#E2X?0deq;;PsNr<{tbN5ZehP&VD} z^q!!<{NX$4?K|H-cBqG*I zb`4l%vfp0VdB3J{Q1hg{Zua|~vzLRzuvXGk0IQi~r-q&8gykzx; zNAAD*b>(d|^e7oX@4hNKGuuBa?xt_h%sRV&kNihg%{|_6 zdDB^E$93Z`6!^`4u&OnLHZr|CRxjk}>K)G4Vx+>iyl{Q|@J^!jp_WIzF5||n%I^gq zt@2%9FOe1@;KFxObg}&+k*eJC_ALR2&_fF#g_A_Pujkpv`o7~fxtFrp*}+Za71cI@n!?{M`aCah z2;FB~_PO_^US8wlIY-;Koo#Md&2Wzo=z5qFWg_|QXzj$3WW^-$FN>Yo1|0+oQXM$Z}FpDQV9b|6U8_}<6UEAj^#E46y)Wlsk3Ynx)WJr1`& zn|1LSyIwKR%INqy*8`>&&5HUxbsLY{QZ}C6?`*VDSRlvki0y=j;#n`c*ov(EK{6&u zDRmnU*gm@IR%p9mlSg)Fh0>o(&(E~3D@fEiCE#r*uq*~FOMa** zw(rr_Veb#SOGlRP)|2_Pwts(pM|+U=j>LKTx)+XE6gsSE^zm`<8{bfQ6>&r&dK3huKQ6%l_G~+uq=jwLD8|uZ!V=KM*PxMrp{uXI*dnoNO$hTTH_RGl!IhqPibtqqe%0#>(LAv6 zEn6TaQC_rGrQ^```NN6tM=g%9H3HYF+&S1-(QxSZuS;D|M(uA3(Aba{pX%6s@qEJR!Q-|M zE?DziHnrUwJW}Qss?f%xmxsjmONU=Ln;w-~8Rfi5v9t8$(236m*I;m16diHY#2a8$Sucmb?p9Q#S*LG6P zs~(*m_?ks}tv7exrHvoGLg{U}_4QjmYRYdIj9Te%Rp9ZVZK47vA6JR=88$z-f3rXO z_Us^c3Es!+;!T!Jhp^AZFo29tWedyUKvuXzi`1PLszrVNKN+(Y-1oZ&cmtN`i;fPn z=%=2zE5V+}=eTQi{7{-l_OYj}(J2iYN=bon2Dj6{rT826L|=2!QPHwK!uaf?=I&W{cy;W=j%KvQFId^| zPrJThP_tW|dd}&gwy$fq=bGmPFM2sXKhC0PCH+RmD#^PmOx_6|dw*cuJFod9f5sw9 z?SBHYA_C)_fK_dReA>%=r04M#9s5FNM~w&p0e$ zuC(mp5u-bv2CVcGd?o&8hJWp!bQik*bI9VGiJ8vL?MH_W`CsT)9y!&WaPTm-vhKFA z1Fu5blfsRQq5|xj*C_PczwPbW+!;D3zCg6c{m$_fK9`3st+{_v_wHt~HD5~Db9cNQ z_u13fJ$!yh2+7S=o40pjZd!Se!-o5g{DCQ{2q{IaqBXq#od~mEXvv4^)sd@KsY-)u zNfSnwZlCu!aP!*JyDyd|3*?B4M+?(lIC@F7Ns6qR^9d$K`gFQKMULsyaPT8jVIO zt$R)_%~08~e$VVuFTU+=BKLaV$Eq$`{f&e)O)Mzb(yx}#cgynr#^t){A4gYvcXxl~ zWjmBSoYlN=nO^T#r&3mi-`WR0&1y=PJBxD{xZwAvT5?v8yB{(+8FYDK zC`f6OY24#ozMCx1q*0bqPb%wNiC})86+i!T>Ie31vwwIR>l9_btL^do)Ky3GM~u#d z@|8pqA(*9}Ra%TLCcdy3Bc=Rt894(lAeNubJpWtTycAwDd@`YP0Ws-At z-ntT^az#aFyIkp?;lWcqK{Wq;F@{M4>J#9GIV3>PTwKDMG6lu?&YBpo6 zWAx4N9|g9rYq^7b{3^%H!yYT+^&jXfjqQnlV;m;xIk<%W$32j}=x0!weBYtL8^UJ= zM9PI**G*AYi>rRAKd9C6r10|gyKznL7EYRf+$!KrL0JUmQO7EgUGnNZk>=y5X^dI89-C?{B zDjdDut}fr_=qNYl?iCzgHRa(|H`e-N$jnyWy~og3-uR=TyZnnGGcS45p^Moy?JcuT zH`OfBJ*Td%q;c-qZXb$LppxoO+w$gvfwHP|Qr3%&o6>xir?S_VRIC!nI3Mldc)|79 z2X4Q0M)Bh=$ED`MLeYmst{U*xS;n~kjn(aag zMz(8*<%^dmYH2+0=SdWV>gx<;~;Mr1SC2Tk%xicz)U>usFO`yh4^I z)^UQ-FJ3O@*j)5s?k~g6)_%S6yqL`kQZkEWc^s=dVz@j6HF0 zZqxzMR+kp{($-fL8f)oW-PzUZZc%OaN`Jhp>f9p^52)OW(>Db<18VoK0-uS-fdUEn z{3+)2Q3XHmlapR5PwF3c)sA0T+H}R>#F~%UA43z@tTMj8!s+0==huCnN`xh7v?TLv zk4|~??Yw~}7FPj`(q-I1Per{K`mzFfh4XR8M5S9@8m9BZ`wk$vK@sMVsOO9E@; z*wdfXqi)l@taD9*!|Iv~E~dXs!6r> z!Df@AXS9xtW=n<%8phBH9zWX{R`1eIVM6w2V9P)Q4{7(CxL1%BNqB`-u z?f;~nc>dn@xch2~n%(VVR!_w@m-vPqKF{j4w!6Kc+Spa$jCOit<-1t_!CkVGBy#tX z;Ae-=@4veL%1SD->7+=6q2Frz2{fj7mQusXl-<{Q9yX{A#FK#pYY{d?j0W*w~7r;Ycw{h9KPIsUL|rH zCFIAN<6m0GRur>c7}>G6vo2}ZT=>1!-g)WZtKwz$nN4$VZC!LJFhbYB?9JvXMXkOg zi*wHFY`qkiRTE%KI+b#vF>mt;F~OQMyc*L!1Hq8CN6tTLyNqPpL;8F}N)L>|jUX ze3LT|-xo(B>bG~zi(K8cYiO6R(DFn2UqocJKRWbo?sPpuNe@}#oY) zljZYEr7wt^hpQU6_pDgQ{_J>#H7%YKs#Chw-#g8bZBstAX~RmvuROaK#y>o8tYDLGTgv(cJgA#fBds&QT@tewT%Mz~j+QlTXQ=7W24xfCt z_9y@EzG!)8{b7fgBTJgUoQ~(&`@vUrkIT5(OW}F#RtNZ^tuk$2OE!u|Yr7<>h;N$@ z23P3yyzr@(xqV{ZR@$k?>uWXGn}XR zUMDmohN(ZV=heS0Zdkm>cEVD!EckBeq3gCUoAZ-tak_q~J~xi13`S1G9)2Xl-YD$X zIA3zamDQCHZXPF-@#*`XldJY+<+2lwt1el5)G2sesqRIsTk3;_CXy~mx28gFvJW(j zq&`XAP}@`+5T`N~P$#JJpyzT-Ri(ur*Ury>rdB6Kq+f>A z#ReA%b(Z8tDyGaGQTE?EXCPF&Yst4YysOtncxdxa%Q~+-DL-EK;uxjwedEJ_^aZq6 zvEwZ-$;Ny4+;#0$zV~F?@cV {=;Er-3$?bU0v9?M+X zH_vT9(sV3N-S_E+*0Jb09glmP3gh%T>U*2-y&hu=ho4gVqozL+vVbFPRm)%;{0cw6x3H{-i}DRVBz9Ev>KzB50O|Dt?#Mx9%? z+Fiz3jREmzh0jJjrK2P}@+`fqE`)y8J6hr2yY@M$Q>W|bi}XhypN@Lzw0OVU`J17T z61a;cFu*oQdbV=`|5Ru6#mKEiL!|hoxgTo=ayBlwtT(+_wC(tt9_>f`x{VG7^?WM*irW?u_1cJTm6ctHisRr;5hdGN}%7y>s^P9bWiV!$njkGUwNcU3sY<2cxy# zdL}D$37W?SD|Xo~j?)n6k^6jFRCk@$o4CpSVjhMuo~CP!%6Yd5KIw5Yy=?6D(Dco( zU(3b&Z_BsLf91z6&+|GTd(zLrH^#dqW6mDS%%tu5cIElIS^}S3I{)$TSd+(s${ z`6~Jvir@8~+>sgjwp&)HN%H8+Et5s-0!qs@;CMO=9ZL#wnv7{P1X*+VF@FF z{=4qKFdbGH-|<`i1OIRO)R5hD!16z7lPMv2Zj(PdEWXwJ%oUmXVW-no6~3}IuWQ*U zQ4s})LBA_L;zydbwEyt1#ZJws{C@t)lj}nImu*FlJvVIY|JcMvZk&+}qgo6tuug6; zDXZ)4opsaioKHMUaFVzFV^_0Xe1>yRmx{rI1E(jKv^`^=8J-X*Px!M84E+-fc7Y4R zcTW5{FTAa#Do*W>%!Y<@+2ht1^Ge2{=&qYa>AE=R5sgWzptzCX!o(@J-pz`*3r~q zzTK_INEcdDw)rTWc=RjfQbLwHB~;G8d%HJ_a(GPIU+25P@t}aK)5QrwJl&C6nO#eY zCV6tkW{G@wuu(d~;)r!Y>+X8?ym5DL%KMi?8*c6vB9AS+xWf8EiOGs6ea}C_C8o(^ zp7p_h0xHF2zB|eUYTS(B{lh5zV&~TV(&xBO$+hK53M!ceo8)CCygn{i)?KUi&LY2c z>d=+Cfv%>c`2m;qES5T6uIP1fleb{4!kNRLUVQXaR`7|l{qvmPV^?%kZ~c!c1qJjS zjh5A{bRQ`m9#P}}zN0C*p~A;YMK6wISL({+U%GYGu`j^il`31JrRT}O;YtIt*{4ij z;W(QZD*7Y}V!kj1N=oO(QwX>{4lmhYv5t&`lq?u1sR%Im%A}W&<`3Yc*$Ru~vQL}x zfw-?sz7jRtQJlO)VbOaME>K~SY>A@19YLOdK@QvooS~*bmjXAsI*4h&U zhs-dH0~PRnhn(5#t7tO}QnaULcWtGYYz~=+lV_tGTv5uV(9hgDV3gq3cP4+yVE9uU zSMp%1fx!QRpHu=H*9bH@&}2dTAXA~_)oxQ_kZ{smA>5A2YPpgP**A#T2q!6&Smo9c zV&Rrl7K9Hm1%Un#bh-ISQ7S$Nh7g5Im!zDLz>O)%zmSNJ%Fe%_2o#1Pa_wb#Zjfk6 z=~Xp?x9bn+^HW#FOJ-ePg=Y>hybojk;2tlS^AlQsqKtw|18Cq&9^Csn;}MQzfx4ee zp_1;0ZFpcyDy#3}yi0c1mi&!|T8Zz|2|^~y2rx&Pk|hTkEC||XO@VaWDB&boaB7q} zt7P4)A|eY>jZhdJ4307dfnzk4H{11X74B}AGtfH*;v@#J9%It8?b^q1ILszFkT3=v zu)RYUmy)eCpkMO5YsZYIxDW3L9Z_87#}6}}&VACGK}qYMNh$e-Mrf`y5Q%>S2@Duv zRFmw85B%9rzjxw_VCJIWlBU7!EDToS@aqCGsA(Iaeu?;$7$I(VEnyM+H&Za%{|~_k zjTLSwgfnl2k#-Ww!pg$olVlPL=uX1wktUPwV4|`st8pX(k>P}o{|b0E$rMCRvq<~? zCLX~_W{Sy+_{<`O5Gwr@p(jS-1rbwBIx;0n;w2Qwzd#Iw*blhXXtg2GYGb0_Q8hNp zkQhk16zMTO44{dPK;U^oEtKZxG*b?7RVMu;VlRAUn) z+E?L7YQ>nqE`WoOdrqXAGkk%Ow_>j{sq)eO`pg}_*#(@xS z13M~8DUQ^;lZb4?dIQq9l0+e#|_DyJpP1c6nui+{sIZXb;4>vae%~+xLzdfH^PBf`9R<-MBpvy65-XqK%l^6F_3Q^ zq+miNeOaGLrTTTJMb2cKntD{(%_^g4OoDw!>S%4v2grTwbBFWbX9kC+EFlU8X(#Vx)awOiW@bbr*p_p~M$+e8(FzfGpI&14))FvQUb`Srb9sFcw0{kThi$p&_KKB$VOc znP9UNEYWcVN)s*|>&s9C1H4m%{~1-KJi;_ZU|A*Md~knrXz0jhElMBJEzxX~lz~Ze z(13FOUk8Fv8Q8o1=Ta_meDQ%ShiI8m0*Pm|KOxu5Des72VO4j{iozs3f^{Y5MbPjr z8;T2|21W#dM~P=x6tVz5GZ8@t%1y#!Xt({al%h|>3|sMil4FS?i(Du}gmi4S^mL;T zS%IzR!5j~YG_ZB2)Zyj}c~I;LIaq>2v=nk+6=g4{XwW&~q5?|=@%E#L;f#@O{uCmO zu(cl|7(_AUScIkse5ND8@Mac44;A6Zg&;pRQ*PtVz_Rk1672YIworx%O6af}0*%h? zJ}NAs3)MS`Sq`a-rd%Ry!)7-Wjhu<4FbMae`vG)}4DxXoC6I6py4*v8_fQTIM3~Pv zr%`4hIw=%o0tl-}4hc`AloHP{kKpPfjUtS!+(#+E(;rJA2xEb1RTe*DaD;*oser1Q ztHu%nOfNX2s^(IxaW>cph!8`L=233pFvRUNsIhU#hXQ!R0Mjg5|Ro&$RcOP1orVaIvsQl}hY}vmJgBVN%zm#t}nc7bJi+TGUVi z_*V?FdJZ**0CHSF15$dh_vq^WuUJG!pXyDN9= zcc2op3E()7h6p%PR};dqu7etmq&rbta1jXfPSXEq%vwP;pV24ve5sZl}1!E)*KC^seCwh z1meXBcIYG$Z_JWFGUBKfM4g~BAB6G3n{d=C_|6$KH|H?ar!kXSjVB*EiDIDWFK~PF z@*tI$s6bR)>0xRMCuPuVUw)h_h42BYGERdS9;fo-_9M2Zsh|JNbS2<=jrtUmfNiRr zZ&3M>CD*C`glDkn6a|8TxiB@q7g4PV3^s2-Oc!2I2u!n8L_Wi>D#-Q6R52pzSnxV) zsk4E#8C-S!c|v`F+oUiKS9lQ7Pw0-d2lyshp2czK;Y`xm+*`2D10A}>w=aE0x6f{ zBN14XfKUs5l?Q{CFf+V(X>V}*vAX$Y$r1&=R;*bUcJk9W3lQ`m03t+?i()h}Vh0D; zPWK7FVKd$-1=<(l87t2s6&e+}rbOfHolvzA2!!`Qux%mc!8r@ytZ`3+mP!Dzkq{^d z4lIB*9W{sMLDWE#K5Y>}gw;sH0=Q1MGN#oNGbXl_D>_D_Bl?y!i5ZFk3>a!f|hz;V;rX|iCRCbvAIVgvg zFar<#7DFbIM`@h1JXrMz)b0bJ?O%hz;9}SqtMX{`h;D)xPXSF7(LYPeB*?KA(^)`6 zh~&jQz*|fc1OxWa*yci-)C@Nu5Oe3>B0+jeXbD8rf=g+^1SOgj$WR&W1|itD5;nzC zRWu2(*#Rcr=mXjTVo=&c+8FV5PZezh{|aD_!RQr1<5IZadG>^sN?A$7FXz= z0(_^_X^3k#jY_Q1G5?`J5U~s%nPh&UIT31MlMx5QK zXrQRB*uW|S`c-00gtlW8C=N1Q;R@xh6`ix~KqH7i%sYZ|(K5OgR(r^nWptH)BLw1C zL9t)mU?PoIPH!8XK2FJTt>#?x;QCcv`>*riaQNdo;7(Ymn71p`_q({%_N;Ebt+ z9Nb5bBYH7Zi#Vx8Y!A^jh(!9AU&awSgQ$jo`IViZGYQK%lq}?PKHZRDs!%|8#9Jjc zYeOAa$f4`>tAy3>=P;CjO#z(>%2q>%Z@WS7BXR?8l`rXH;9v#477rmTbWXQ`8DIz| ztLehXoyT;3g4?bJx*-CAoTGcV9mRYhhWxIjcX1qqwQ1PRf_>Az9E{^PdL+2bVVS{Ab>BO-M($PsLwp;*ixnxT} z&=qH>3tZR0@c#3WE=0&cqXH5tpkb$a>6|W#S)1a=5(k|FFx_^4p^FeaFw7T-K_Et! zFae%>RT6kq8{q2CqJs*5IMeeF(*+3(Jm?~v<1#{jMvR2)w27~9-+QEa(i*Iu?yP;>%<(iT1#W zHVu3YfQ!z25k?U%8(U*znY&Yrae~Msv^I*=8A9OnddSvQfuTp_IbIP2hJ}=>Fxm(c zpg;}ejygk`XfW{k3NZ*Sm6bq$AZ*Z&4H(2r0DvhtZNwm^55P%o8X`THLA;Ye;K=7h zs$eY|(^J}tu>==_H9`~yDr^~i|LKzW0RlDxVh<5)(6uvGz1R>Cw-GK&G8Qs8{Rt+A z4hob+Iu;4EyQ!N1{~QD%U}V=Ft})N zk6?rm?cM)7LkfYIgTz{ROA5n@*qOku%D`$fZ1CTYFcidbMNvsOr@fnDzp=T>SVHt0 zR0eXcjFCuW#hs^+QaT(Sx~;v>s3m}qrxa*^&R`-gj~M1e#bP`$U|}_bj#DB?9fLUY z1DJDAJP?jxQ4xU##tota&o_rMA;uW@10wp05k*LPp8&<{yke+=%q_4%w7g~f#>FAc zT?{WGl;5*)A_-u<6}|un?_qEj)0JhAb5kEz{eo6D4O(2;;_i%w{6@ppTvrmJ7^hj^G^tKw4Quc?r{t zn2^}cOf6guNF)V5MY5!jPG@Es;Y|!UHwpqzxHIMOF$j!{BEcD&??GsVh4_~*lNTsP z!wlKz&-5ZNkX``WBL-_LbHJI;dC-njYv2cc2mS>FEf~+s?A_-Aq-iN z#VjP;38@AMf_F!moEKv7t2I~?59_-um$`(n4DvPwgS+54m)%LGEaiWedHP`1Nu~~v zXTwa)&u0>EVuAG&sJuTL?zSJCWiBQv67o_2G6|5E!F48a5{ZUO3b83>5_b&{&6~_? zL};+;fhZd2Dr2(1{R9>RFw2=&>}++$i01F?cFtz;$>`3AL#BD?@= z_XJ@Y+8}^pH)MZ05$+8RH!#Bp44M;&d^0nL;D_=DkUtG9*~1ddwtp)M#$GV5<8k_{ zCGzAYlXI9q@rL0-*w56(xp($6rO8#w*%d01Yh0a3WL_TpUpV>i+MmkB;kgbEPe6E> z{{L?TKi7y+9T4%ENxYpo0KbtHb+cvk^nt%Kiwf>fGntC0$hYtAY&{DHet;i!E(SR! z*;%HVK=%t1e+3BUe}POgOd(VWy-6d5jXz{~K+cTJ!;=X0)#n=TWR6m1Z?F&s$H$ob z7`3?7=Ac#z56^uT505Gr^*c*Qt%zQ`5m7+(+Jp3Fw?n>BbRHfRE=n3$`;}>gv1@I3 zu<|g8hi4vS$xURmFk5$#8VHqO;eyXtY`s1UQX#beQc5fag#%1UAUi-jx3K?D=oL(>l@V2Yf8|3H8O7ZbTWlw1bApoE8R zIVpV36x8zrEM4xR3CKrDO)!hJHziBzL5rFpC3k>t7Gz()paTp>I9mOH_ngQUm$I|2 zssW>6rYJT(x3cyN6^_^VpYb_YAf*o0d2p}f!>dr_p+X2%1s{!AxR&3ecgpocgM^?# zid+Vsk17{s>0Pk)Cy_huHxmOZAir&pA2-#*N+?+Z zy(=Yy@jEW5vLzU5-T|wPJ08!gFiP1GrXsGn%?Q-|@DmK0?#PnFp_wSusSbr^`#$9d z4Szk=iDJU)!LJb}afQNQ6hgWh!Lm`N8YX>x#;N=qsAmGq2stim9A1K~Q6{myuRzCX zwV{yN=+!Ht)CA$BDzeVoY|@k%dglsv<+xXIx+pY=0i6UZd&Zw@JJ>SDG{x1vjE=qC ziH=2YNrB!mCb0mVMlt^H35+NfI!xJ4!Q5??unYJ>g}GB{TlZf+nd3xCwB6MHAprFt zK|Q#s(|Z0=cSCAipI_rpYJcxv%)AK>#(4r_Cj0+l_CXA$PdZiLss@yx`9Bg&zH+Fu zT?ZIC=u9-5=ih(Kt8eUB+b!rAA!v-=3T>tiW;M4CyV6`QjFVR|lVz}w?QaBL| zivKsCD!{B?OeJvO7vX+^heaC8p;EN{d?FLa!8>e(R-aL@ zoiGlDH`wsfJ*-g38iZOTL4&!q=@3Cl4KY^>ElxgN45?;AD(+S!58&^|h~C;c1tn;R z;Sz+VnW9Q)m_n8wdxuW4Z(snpi#bM;1lG!sW&?QZO&o02exafWHw*8NCB1kBNNjlh!E*yUYqP9v-;xnejKENzlSu zaeUy}9}eqwl+k)a45^8w7$)F|AxoO#HXj2^z?*W)ICLL`US2>zAFyywrhET+R02f} z!4LNYR=5;clUS1I#W_0o0*@WBG>d(*@@ppaNh3^3r5P&n@LYC8>Gd%x%frRX&O_{X z_~DLE+H#yLyk{o>8m5Ts>ifxaaR=mj0&-R3;u`M^x=1WzjB8+!&~p(O6H`d3$wg)F zhEl;h7-SZaH=*zw=^8L3v(x~*l{X`ke~Z7oRtGuMz&6c2W_v<{aH zZ}kboSKXYH(xXCF$AkXjup58G^{;&>?&Ss?H?R@rBdRf$NW4kA%0EN@Y=OR#L7OBwUSv&lQ(-C#wV3-IvB zaB=lW16?#0u~p`$!*SmZfL(N$JMapj9G>%QQSga_C|DbZTtOj6&VyMDNZ3UurtcfH z!dC|&_Zs-&&K&Ool++NjaL3&cqfjFr9#-amo1Nta5-1*l7Q*X>c-mqE)I#0grNN-@ zgh5y3QhxXiHb5TKGgx@*>KWS?>jDiu3IDw$Zrb|x945;MV>o3RP@4j?H3!DhjEmvs zZh|4aoG1et_&AO}!GwMhdC^WlYpHOs;-RQUBsJEZ_KUINtiI*aK7M9 z_<%uz_6VfK{dpDTaqA}r*V6s(L^bC5;PC;dZ!^@Fo7Ks2f)zT0Vz&L`%F9>6$HOxL z_kGaGGyW2%2-?%rutc=sf*BjI_4F+FLD;!&N&I($KEfh{EMBq(nB?X7fu9fR`9_3{ z+6pfn!kd!7hmR$WF=E(6S-Hayb-^XI#SFPTJgH(c2UPR1h!+=~C^tKqe~~g^kV#Cn zVNx%y)k0$zhW&RPKMVNrvkbAcHt$WjcnB7X6Lb#ux=Gss6!Ei&byF8Vl*4c&gWb!a z!jewpSzr^qV}zR@N?%$DO&^)Z!^6E*PF{u$keN|$F#?d$f%Rli8AKKb@aiTVbZ%qu zGto)sRh7OE@E2r>Q>p?n0+ksp^0o*q7rLYzez?o;SP;+`Ms!Tx^ zv17Xmp%k}`WUxG#ECZH7d6@0vg}JX(VSa6b+0M<=G#CgAad^%bf|YtE6yyuB#K2}D zqD+<ovMw_Cgn-drW1n44R#Uldhh{!q@9& zAsY3)(13T)09`Ipr(~QoZ!cK{zze2Kupj0W#(&?U%Zb6zWg1XR?%5+F?e8E-a8H<% z?sG(-nlAfsoL>f60>fdv+K1HL?cwGv7dE8<>1Aigb`yoNbuQvKt4lLwhpwXx@WQaA&HwKlVR{v%pAFuKvWT7Qca%+X zH4cUsU5TW!nhn8;PjGPPY!>k%@&pS0Qip?|&1Pv}x=ZgpZM+KVZVt&z|WaX*Q^T9A#VX@8llL0rySj2&GCmc&z{~8_}yn%0` z&{a29qW!9?$$y}DG7OvYjG?e-JILTiCs_pxF-Ci}GF8|GVv3^d6&yFH^)h zd$wodXk~pS;PBF|6p)9;cuicxEy%BjU~cD z8;wTW{EQ%wCCL(_NXro%;dNZ1WRFY1L0$6y!Wlp#l%xA+45@-4XX96O(Y-t7xo07Ei=+d1sTa0HX^v&zAO$&0AMnbs@B@Z> zR#8O#5c_wn7Ap&R)LT=4?IMaefR}}Zz&%-x z5%nl?@j?u#4us`6a78%?pR&i`VgOzqri0+!M5oD0c*px2R?8JQ6RUGcf8zj>2J9oQSZ6sd841imDJEn2N#muw@OdSS$*+O2^=G;Fc<<1w2LJB8M@!IC|BZ zIKPrsgN95W0~u=2cJ!k4jP3mv6c=*>#Sv$@6%ayMe~JS9PZKGLOBGOulIHvY%iS^# zTmfPloE60a4LEpp1t`>jTS<61n{S3MvQXTchbWE+TNi{-RO%=|;VJYcy7|KO*Vcsa z&y5&d61}BOT%V4IaB@g9_@>EH0(UeCyIzZq`5M6rA65PDif3&LN@{^K)zN~32RcxQ zBG{u<-M%F^k)g6_At<1{to|XZ*P;p`>#$h63ZSJ=Q~t38<*z z3>qGuAQhBK7QNt&zf0+iRJK_N8BV|t_r6^c{Lo=pWBmS{qx?XpiEjAe-s+TT0#{v@ z4Mw%tTyY=}QlOQ_t(&7ZDAHxk#l8Mn7e<4oLj@#Vstz{2U<((|eaJyWSfBQA8sXMi z9<0&hltUK0Ku*px0)={akec&(xWC10u{aI)vL76bGsD&32K!|Ub5A~6qztNCDXL-56r zQ#`*>c>Wp;t^nr2Lw%h8aw7;QZ=-_gZB*TVPbCHKJzo79rokc@9PSxfGYUL1Vj1J3 zf1#t@qoF5b;AnL9frT|=P;3RdTxo!9R)s5>!eT+CG2B5V#8CzQeUEqF@rTnsc%JD1 zMR89Jo$)9=v5Na{4C7F80Qj4*ltEJ_m4UrY#3ZVhI64f%B;tkhCU-qt%|z)faeYsj zKn`PvP>2#}H(`lj0bxnJ1th3$JPe8sm%9B&sKDkpRUMd`avZx~7zVeUF+-N4 zaF0_|;Ch-m2ee5Mg}V7PFZB%M*#tj|T)gcH!R~qRo;SQGF9clYasuT)7piD<4aeDB zr%L|2tJIu5k*)><(g#1>)As%Ae|a&%x4FdD;E=XnA$r{44SmXea=p0tFFgae%p;D7 zt_Vq77Jxnof{lt>*G2bGdOgh5n*|H5e1qQF2wlxhb?OmHB?jOXeF5SBo|6EQ88qx| z4KCQgj5z%2tgcva4hAk6rpi1n|GaqemsAKGHe;#aA-sdK>3sSZCkV76ILRz%4si?G z!7g(cUMF)7cr6Mx??%D%FcW^gx4(QBp4T|TR|VWh6Tf;;Dk%W3`qMGTV~ys_ifil8 zAijhjWiBO2K;D8l@8GFgV>SgX`2amQmy2ll2MD)dEy8lGweEvzIHXX4>2AtJtFmq9N%LW_^SfUR4unC z?*}knenEO}T0ItcXUUmr6s@3(mcq9lme6zXmj}e*Vmu1YfV&aM4wPGQ9NGlIl;^TE z&?HBb!uEogtgY0cnEO!HYM33|tHB(3U^Jgt-tM8lesddA*+D8rE)V1@0``2)Dxi2i z6n#M%)X!%b;E^XSfRJPVSJ#!m<(PHx7H@BlA}t9eevLu4G+9O^OOZ5DsYqp_ zL`2H+StiDEETh4E#w;VeB7c%a+fUZ?cs!%n-i+z4v+Qxi#PW`@MdgbMCq4 zo_p@O=bn4d%adC7Ro$>%k6nv;!40=Z7Ek6B>CLE|SpkE{5I3kE@#G0q5CoOUKKJ%p zRMJ=5XkM@`e7Z4+19j}DHvaMA(Mv3lPk_{N+Sj!gRrNzOg>nZgdReKuzYUinPR3w$ zEJ2=A)~4z6<<`1T+H zMoolB)T~&YxJg0sBM{jDH%Y(Yp*5s7gz^b1I_adksXuHEJ+Olek07?ZB6dv>jZj)) zL+hKV^vf5NdiI0bpCR~@&A4H_phwk(8}(eE(m!gPa{f0Q`x6lh$SNsJ74#^`Xv7nr z+?1MEEZfhn|2jbB^3>kS74)BBZE(`5o4V!t!ImCFba`s;<_S_%Z-{#YPH(xTVHvw< zxeQZ~S!XO3^eF5QtUWHr932S>#)DjTpd*(G(t!a=OMdV#_~>TgczP3{G&g@jT>}(H zq5y5n*ol8y6nrRJl%a*Xc{1>OD+Jj4U6s+t;V%pmI3tTcR|;H)h8x(_Vz7$awo2d* z0w>s&y$g0D)(CLpKn?622=J@50&Kg^U|a91HPztIX%7^*848ql-|g!}v(Ew*^+je0 z(^w&82v7^w7H zgG;@k2duDp;*FsjAs;RWb)VVaQ^_F3ja!VL%Ylq#u$KAQOXcO#j>Rzxd zVe228VKGVQ)lCxjT>Wcql;owy* zFlZla5J(K@K0fZX4Xk(>5uuF8o?fAThg-w#u@4Xbh^B9_)I4+z&CEXSP^YQt_Ns?L zkgq$d$l@+mO{h<(7C;4u0=d{v-?E^$l}l}ZW^OBYeTlyI!9eBBV|2edtrU6^sx*ya zSzf(hh~sph(L=5H!^-5;l!Vl{n9h?@`5R09%a*wNq)5F#Wy$wq&!VJsmdKkiZIT0$OR7H&&0sBu67vQC% ztxQ}CytBBQxt?R7^{&u_k0eszI6;4ZgrXK7G#UvuQ85hMoE1%}+{ZF-b}VI#RMe+f z8vwD~8EZv-6RbQ5wNs7xV+YlI7;->7M|P)>QQCyPKML@xi5%|1im61Hq?ZYyjqc-0 zXGbZnJeHbs#Q*p#sOt(=lkCifF(P|H-4z~8MyiWG=jOwc2eIfJV5RaMo#$LKg@Jy4 zm}c!8!!Ww8c?{f)P?Tk&t6`eR_Ze>f5`ja3mK*Ov3^OOMxRmX^TT3?6EV~{#%r_%zG*&AuXXf@$9;aS#X6R5ga*Bx2u zW-1!3-9DC$Mt9w|F-QwCjnN)>bjIH-=Is>Vm@%p|uR4F=!f9BU6C#ARQqN&Uf)piT zA}Q#8ZYX^YlH2&oYbvdns>W!WxK9N7nOZ_QW3eOUv!c+NsflRc{oDgKlUO41p>R2l zn2i3_5i2`-8KoUasu{1c!!l0-^r9CSv*56wq>oXr;MDU#Ziv7)KbM3EC!C)m;cTEk>Gz!-Q{x$i`rYU31NzAFbTTi?eXqd5tO zB8OQWT#U5R&FDd2#AzZH$H9fKX~*GR$QC^bjX6&Qe7gsSJ5#Zz5%yDqOk&8V-W-V{ zTKou|X!H|E3_Ai|tgM^gPWb4N%#jjF37essU$WQN_h;pv{A2%B!j{ zpoU(!3S+s!W(P>)LE2SfT@lDgMP^=)aMl0A?Aai}&~Av)s%{)Od=f_FJ6I3|4>7i^ zO?UkAbr+=r7_l!5ME6MxrhiXT9J<$ynP5t~&)Hz3S!!BByZ+t7XPh8yYTXrsMP-7M(NMe)bGLD*pQBnKU~G&f00 zbni%lvKJ-Lu_Q%QV|cCo(0L#Dv*=&GaM+nhrYV}^?lT3e;@e3^`g*dlweG^zeih`pPr)8KkfI(Tqe>1DyUTHf z*zzf@&pxtCRZnSetScI@f}b7O+vNO}|3NBBMO26qQ*kBD)p#f3sLc(~$00bERsP9g zMz7x1+)TwpA3r8Ipx#tHk@cGj@XM1m;081#Q*{Sk`)_+a$NcmKb2(JMc#aNyfTQjH zsY)B6+nbDy=S2qgqQRGpP57fpF5eHkXS}}2+yoY^d_>!NMbIw-FHX9l@qKS|nCojO zNIvr4DPyGSTL$wqbmo7DLGaKrP0JvUXW--a1h^ngJ1+dhz|$Tvup?F0P@AR!99qS| zt!N+~)rf(NW8j_!%ABSqRrV=eFGs=*E@Lssi?zEo6;IRj_=vT;)|?tnSK9Zj>x2+O z>pq(tthp27Zsu=JZ8UW{c>Ur)%cg5l{C+?zpE_GpWov79dNW;f{&wl0{Hrbbq^l0- z)PvN>4p>k3p>S7SpJrx1ds1q;#%~MSS^9OryJjzIM=DL%(ua>3e2Wi~FQC6ifv(w5czi0X-B4)72ST2H!3dkU1mBCsTt&Gsu|;%F0wa za1WBzJFTq=y4nt1$^Pf*IA}Twnz@0rjj)TyXl)r3&EW_{XKL2fdnUM+PM|R}l@2`U zoZg_lZvpwwR2X$zpD{b@#5Fp(-|Dn7jTYo*@|8He6kup_(Y{WGlTr%Y>SekA*U zMV82L>OQfvD0`OX=L%+_tNdBCG8=2LrY37mqa_2`dzdR&TXNXGDoc?1WofZ-bQU-~ zoh!f&IrweoU0IqUN*K={gyDv-5IFZaTGBIQ4!{70XpBL2l7Eh#ofz5M&tH!5-z8pdN8yGrBQRbowr2T{gUueaA{2tDfqnPA;Uu}}x%tx1}j|<$``D!Aw$@d|FBQZ5&u?w&u zulAF2ijk_-Hz!!*mS-5mMWejI9n`jfU^RLA9$D1b=&dm63`kH+qB|FWtIHB@1wCuryB_^Ts^% z<9JJe&*iCWCv8u1VKZ17d%q%&dF^dMidt~H+6%6u@8%q70owcccG7omW_DN5wW4ouDia^ zOV+jDNUiUzYLMDLc4V^Y3XK@De?#g?-K*IVf=^VYOocJBcVRysJ#Kjb|QhWH!BQZD|{z0SdR%#0Bkxjx{=i*um-+$PT!UZ7@x=OX|P;YVqmIO!Lx3()=fLm{*NSH*%K0&Gsp*Xqqpu*QoGuw&`5e zq6JEOEh@`X(vu8sG~4X6Tze*Ady%noo}SHDC9&oeu0_l8BbAIknZ2{%p|Sgfd`gtzo_&fhHq>~me&Jv3 zA$Hn$pL^XGZ3pn}&8N@0<;gaDV-I%7nL1iZRcIYu74&?0tyhbF~v8bX7r&+N%uir=-yJB_kJjDs-pysuvAj z&K&jaw-P&FU3sCyKtC$dHB+NVHu1>w4U4^&+?P)+GRi64v-{gXbZ0ra-_FjV5F1+j zQ8@Lh@m&q=?@jhm3?IoKy1elb-=61&RWD3cO3G08c2>=MyyaKgQg{F0J*B2!yjrZ8 zao5`=^gr_dP<$OY)Esoi_+_)Nd_@0y3mMNu%XYITr1z6Lsja3GbA7g{oe*)`pf>nz zeNM?`(JF&!Ud2_1ctpEIzGUpDTgo}GOpWg87IT#ENkSe z%u6`?X2SYMqkMCLQ$AOL*2m8iar)$V`L)I}O1h?RZ^vYY`q}+h_eopznAF6Uk+Vzp z{L^&F=TX)}bFIL!^-6Vlau(zBm_D|FC#r&VxSe;#JvsYjweE}V1Nyrc?rl#k8h03M z8Q87Cyb{!qeXynH;$`z#tF@l0TmwFxOErjd^Oui_Ui1#Mw;p{a>)>xzake(PEo${t zt==)h)#;#s2U*Vbk_wtx#*NJa>V*!a4Ch&dSE**R7}Avf8L(=aId+m=BlpW_w zP8t_S`k(vawZA&YEbUi;@vVz5gRdqzcI71*CR&!QzOLf!`c&S_)+F8}SL{OVh-j8; zI={ckMN1Kx>Q8<~5usHDQPsaYYv;I0?w|G;5uXu#dds<4?qlpu+H`or5=phfDY+!g zLCw%eBkOXky2Fy@MI2xQ5$W*QeU_-HUFa2b{NG{&85P z%`8H;U+FGi!LNkJ24s?mqvuNZ&c6v#+l|=1*ugmp{D``$cBSX8CN%1mo=N0!B5hq5BZ%g99J{;E8~BT_D7{`q;$ z7caCmCEXDrVR6hO$$h04oy~R#E;W;U++_SLTJ}J=ulQ3k&%JuX1XU%oKG!CTW!cLY zmbd5#MDV%lrtY*dH5dTlR$pyH3c4ipmz$@rC-a?^nrnGftWj^CtSI*47?1ASP#6B8 zmp22hC%D`TI?7L79Pjm`wNCcjLmK^@z!v^NWpd(Hxq{%WYncWUB}U@;PHM)ki&VG! zjtkGZ_WGXK&DP$zOT584Cw=+MhAmh7R`~=d9$FBiDS6HE=CyvYn~%GbOZr9cDV@*X z?Ad;^>(#vtH#>UE?l(7c*E+iRoE-!YdXFkkl1Q)zR3#fzCL`36_KeG8m(>E zH9rKmQ%ARkR!5|m9O7PF|7h>YdYa)oQvBoW1s7K=^%C$25*B{P{5&tw@Acrt_u~~m zsso#YO6!kJ3P1I{xtdr#sxVk#HmAmY=Ux|)>qaw&Zz^6t-qHJeN;1zCOEo_nL3pOW zpZaX)wKJ>2k_)%gKB)Zo(_BC}*vH;w>}z0X<^DpglN)S#c79ZH;+sz#Y9X|S|+R(cto{_YU%bepY$5cV=_qz_T_i( z>M=g)OqMKmS#Roa_Ev*b>hfb3=xaR3ET+XtH;s7==r+;m3_`J4q&`#mRTeq%(Ot8& zsq(?p{@6z{QD<*O+*g*oxN~D{+7x}=0U4{kSCdzbMSM}~j4WuZ|FpW*Vz6Iso}eh% z;Q4zaGe18S>15|cI))kEAGZwV+4T0iuzj9f1SK! zvq@8$(dfdQu`>=Uu|V&qvSu5Yj`NnBT9-EEa$F*6WN2`dG|zxPf7GY4{wb5mWtQVP zEtR^G8UAFdx_+jcx!xoGOYpjY1m~?$Jh$e*6fm9EVXADXkdB{wKgd!xM(T}vmy5Np zLaPsndHRy6x23q^ms8q)t?#eDlr^sM@j7zslFB8)i}iaQ^37b=oJsQ@mnI)E@?bU> z%HQC#&`f;W|JGp5$%4bTygxg+1TcF_sOtrr^tbIzeQc$e{V|p-b0bOW;*w+klx{j> z^(uUQW*X*ZC;Wbs=Sga!%MI(b_F5MfEbp*#w&JRcoG9NoSitR`Q!vwr@v2~zLisX064@YV?uiEa)yKD7UGi&~H+1|GLLKb(dwlTLP z20R=Rco3Z>zFfv)Te6LX9M`C}wPyjLEe7sI7Fu@u zJuZwRJUDy5WXD;zgoN}R%io{QezCYM!?R=Mr-S@4FOIZM@@J&Z$sCbg^z7szFx_+| z*DAmJV!>25V0^7^~_V>FHH6Qv7mYW947B($HhF>ueykiw^zS2^sKUl9DojsNFX zVLs-|*V`J0JYRm8NHQ$ktvtx|BpUD5?HsbM^IV`~Z96q2+m=5S-jVXtt$1PU7n;@8 z39^@7Y^qyzhk~l3a?9AZw~l=4g6P#Vi$x#54oQrm@hfceUFe?Db*Zmqg}ZLshSr&Y zO=90R1aLn$q19IWbS|~s(EH<@UPVFsrGVBA;mnScjKF{cscvA!#*`^dA-C^-KZ1sQ zU&v(fB*@EOeQ{LgS5k)Nj>?OlgSgJC*c^Xnqw#&679rOxZGigKHLm>gyX9T-?nmop z0-ark4-D-YUf95VV724%*ryj`=ApK`J)Hj$qHTOx@R`rIQ+0`n{VOXS%0|ULi8-B_ z!H*W|WHWQQ_X&o^1?qbMx`vh~6SN(Jy(E0l2Q@YN{4}r{)+F+CCOEuKgE_vVFds6t= z$y|lprmGr5xlxu66$;d!rujzpCygnjE5{PYcFvEj8_P@CbY@LT!=_ZMipM%=v5f7EAf`O}@&`@AoA4Xi&_sC}%k^u>0?D@BzbJDqwr zm%gLAUl;B_q-1!|sKd+M>0W91nJFHreV1-zb`0@J4f1Vrytk5hCgt4YpTdh>+!8&) zn$J3>KQ;awTk_IRKUKy?{_-5(T@7O=ySH4gZnN+(UMiL#ozwjwwsPM?mGm;H z*rmD4oPCxUt}!{LgfVuB8E|FT`;OQ>+w{yXntLaXm%-Tm|HxE_l z+Y*O(e5#A?zIC>K-W>2ySl-<4bd<*ZrNKL&$#ByHVw6>~?QT?OR^*2vjx#=dpbDE`@uUDu}&{ok`>FCZeP1@)bCch+nQ?HJ`m(WlBfr^vU ztDbC5$t&$uiL`yVJGrqRaHu zs_oz}o^&kw$vBhrQfSrVxF>1T=67$jEPKvl9IySh>kIdgkD6baNT*qopL^`WGF{K} z#7EgHonzNPpk<{9k^98MUNMHCsIGb+&Sgm5kPoW0C$t82GkEb5L zSnsCyO>4{LTQNdpT zUW@h0UR$6LK&vU*aGuaLqd(Jn=Stl4206VaWrM*NKfbMO+vzOVAsDGo>NcJ?!~Cdd zJN?={)XtSCa9G|(@8LrgzsRebqOUwu*D`*je)yaM6H7@Yt!!=_og%KkzcA12_^CC& z)y77PyG?Ixy*8L^oRYcm*%gZ$^WKdb2LD=8l9*Ih=QQNZd;Cn!PlIdE5?htOhP<#Z zEvm6QV&m$x;dG1Bpd^L-k)a^=$ho|m;-Yn;Z)1JY%fis~H1UqONS~Bz$7$Mc4HdqM zM@4}>Wy5orAJ@rmn&M3wZaz98%b2mX-1o*Q`mpQ`f6>-Gd+h~QuD!VTXv2whOJe(% zRC-kp5$sat+l?-MM`Fl@jjDLa%n(9nxI^XUyk%aRS!ettX@Pp~X_`-DMMLnXZYTGP z^qocHI{L5MKc-$Kl{hFk34iB1WvraA3_F{>GSuqZ($HvTiRTiRJ%@K688fUoeyQeo zWySGu4Ks)4fvQ$VvgBZPd`3$7<|ECT-GTFuq~3R-=ch(dMbv&T?b|t2Z+f!qeDB3~ zum5SHXuC=m6m#W837d-@GG1zxcj4$NtV8NWhwn`-+s@;QEmU0H<)`!lyp&Q7cQhEk z-6L}~wc+|3o5nUKw+y%1SJ53e1e4EPvtLR$r+nk0T9N#a>VQGIrctOuq;>(_=TJ^t zU2;{!?(U7LnqINdqgM*bn-4`C)uayD+gLbCUrONS(L11C&`diWGI6NP`KI7M&D`4Q z*GgKw)9bwErg@&!rCYC%ek!(g>c$8bzV6<0yEzdBYxSJfq_;9p*T1~Rc=_=9g&Wx0 z#Ks3a%dXyy-`jra=@NV818yM_*)I3E)UJ449~#}Vq;_O6u;~#nHp`WbEw0slaEGz! z%BWPf%S*0wrD5GAwaa1`4X=8#!z#ylQ;k!=>EiPJHR}(zaoNlpKHwbKvu9d;u~B2X zP|u=O;MsSp6?WfFlZ;ZC!#ARzP(PdwG+XWH>v+N`&Hn?}<11c~i?{lmiMv`YVD4Kx zuBoPGROs!xk?+&=HPT#C`v#M!7PM3{;8Uo*?2FLfZNN_BW<(X7W#- zq(-=DdVRIdxp!J{b)U#ulE}8$yiGkf&VNv>7BQPgzPUVBxn8vprmcJY!Fyfthf6n4oc}QXBll*!!-GNagL`_R!z1QQ zuf~+Z!M@m6g>T*zT)V!d?@)F6gSE>OSGUglVpVZ-%knY)iW58ofnO|NugnWrk^RjJ zR3-TpG_1VB?``;XRP(EfLpJ}Yr*G2tg5i+`t0JY76mJEn$r=jE9)GgPL{Pub@cjJj zuOi2dL-=ggZICl@`bwCg`)EGiCNSDKDM4YHwzLjSE#;pil^+(nb@!Gb#qE;Cl-f*G z^9g(LTMuq+EKIyyX0`2;^hUxI-;43Qw8;44&F5_lZ%l=MDO?~hBVI)Jjcoq0#cJoL zRhIUfoMX3z>&L8`lF3~Yx-dnu)i2}PsNuf6HCu`PTjg}i{O^Wc6H(z_I&tU09n#F! zuGBe9lQ{Y4?k0sA zQLmak2XdD5t+GGcM|o-e%>FEC+w|O??}c{6t7oj4pUj^4t?rkq5mh&8)Y+#vxH{J2 z2v^{@#WOVhpe>7zs@+$XxT?wwZw{zGV7x?#7m_)7)=<>Pz&%}wVu);7$vRg^||y%Sj+L`-Dbo~`9kV+L+JTPqUr_~pCRAXqJ! zr>3`OSpeV3$HH~{Yfc@^ztB={{MKxjvLn&e>4e=f$D=Ex60{Cyj}uJDW>Nb4ws?n7 zE%~C~*$`Y^>s~242IlTG$P7-(XXrf~P0mwlIhAb5|BLa%;j?GFn43+XUFi7hh`v?3 zU6O2%Ru$VRe|$2=G;~Ti$G1H;Gb$&yWuP>%ctZYjjH;Yb)egDsu3N;GBx^eF*wuO@ zAz3#2>GQrNeW&uD@Fblp^bSzf*wI(t)G4l$AlxT%!)wo)#$DGB$L&Oh3(xzXUv7R||T^&ZL(1+VbmvyU~`X0F>x3`~lew9SjU zwWVy5x1fL6TzB26qzTcY54riFw>Gc-aZI#-xFsj>^tW*>BY5B0ImI*3_rbBau_bZJ zARxsdOJZ`<1a*cX{%zjxcxH&zgm6$~@RShu;?ad2+Z&Tw1PiYhUAyM7{7lU2$_}m< z4%<$4PwrA{)qknKs6+oH^VImZaQ-Sy56oF*8@VNFaB%SMphbn{5f{y8KC4SdRxIy| zIp(*=dgUweGl#njB=>rs9?r=)r1|?o)X2N{m!r5c9=J73@&!0VnBCG}*?vfUhF`UN zDBIcJJ8h~eh`z{D#MdNYrrtauh9|ei|A2I0gWIczSwj7XmUL0Q9}BoLD?4Qq66GGO z>%Dx<#b?l+z+`F~m^SoXB)e8VirW<)(k9%qKEl6JT!H6C9sc|O)gP2A@jL{xevas`hz@*5b+?vH80K+@nud)U{?DUoPitd!=;4 z(#sp2Of{nN>wdebJ{Y)CnoiDVcB>30mZqoL@av3zFAO++UZH1YkO245Q;*C;>kRus zdmktz*SqaM8E|Tb(mqX348oR9>dw8#yf8YoL+#xy3*s#^+N9j#m(1rYr??7oncE~R zyZ27XRfVs+xLUAWt~)kgPU)NI(vJ-kzhcGfHJ3zdV)aH(EG=KPS>v|Iz?2}fE$r&z zj|R4xQEQDXck}O+&NWrJ>iEw-h3PGi9*5m1a$G&p!$f{nj{7gm7`paz%jY^82m3q~`0~FrnG;_^FLW8+p!C{A9(Y*P7*N;)SYKMVBqlq;Fhk#am># zmzh3V@lzr{oZ!hfuto}m`%j+QE)7Uhz=tt#&?hM!(<=#oQ)N_MlA*GrO3CG%UYJ)M zZS~Zr>LHSqXUN#boi!)Di-Ul!@t4>4HDmI&P-||CF09Nh)c(BVl)A<=<%hZ5l<_>O z+AAS9@x6twmYF=|q94xJduq^~ZdRA)L1s?vv0UG4oHx0lckq6N4VTF|9g*+VlD#XW zOpC91ing6}i!SO2P@n&O>96tD7kvh5%i9Wy#oF3WtadX>DeTBmyH8u*wWsaG51|zo zL--54ZN{U8$M1QsIjpou-r;#)%`)o!{ViW>l7tS5uOsZs&1&Z55aEk4^Hvq?Sol%BB4Jf`5?7nv>NdBkotYc3yp2`smn$D_ohF$6I+T6XV#evn zN-QtB)Im2nuVz4aVvtaz_aS@p;H8km-O4el&w9$AnCmLfZ`*ab+jQ!_LZp4cw^xyx zK&VqAQv4#nP*Y6v_jmr7j0LtZfeKW_5;nCSXC`yk6vw%r%IRyqs*!VHZ~5Xi##>+OB_w9fx69<|ym_$evPj0+!)gOQB2DGC#9}Ft&er^o zH{b8=>OcRhLC)scc>Hx(=Mlw~j#oU4_xY4LL>meD8O)d6{9vh{WygnMA+KeU7Bv*^ z!&WQajdd$MvF@(X3~zewv(YS1WkXu9aQ!cl)X(E)H0FAns$D0!LAIKe=pBRC9;Mk` z@ms=t4`bpfRbASO7we8K(^9(iP<%Jv_WiQ$r911^=g}8wF*ehZfY{xr$rZvj>c+Lj z#U3U%CACtd+dmFllnnkfR1Xj7;~w9~T_0-uF0t!(`IpaMzh6Hj^=|l!8}Igj)D{!5 zLURLY(!^;~=4Qu}2djqdXC{{GyrB4}SDY4q(Hv0He5N8yMWJ)ky*ugY*Tep4GI9y2 z_*(d~wYqd`f1}S{qpxb(-AB0EsF;^>(KVF}|LE5Cyo+3ZMtnnAUG9e0cy*1>SiWs- z8tbcT>be`!E*Blp6sbf!yUQ_gz3^GCPOImqHB6`C#2W{gtAFN%je-o9_;@o&ES<`r>~`k!QS1QcOLi4`*?rr ziHjZq`=VWynt62gt?9216|52)bdr=P$+<|bPIEKStlQfYaKYl9;Q`wss)d)hz4X^HdYq0h;4<*Y^(0#kWC&MdfO znd7ytF?-rVEVkR({Xl-l73RaQr_aer6(#)2i!$qOW$3Ic-)D5PJuo4vp}8vgVXoDh z7-fbvc6Gz*>#tsH-|6u?JF2lef63X-{5&OH@p9LbBP+$uKa{-Nl_R$=JVj>V*rI|T z34@{%7n~BSM)%&Ww2rR(y1(!G6$35uil7hTsY|Z7Cq9gGj9tBLuGE?4cX>>q_)9@H zDid>Gn3|0HU(+v!s_LVIYhe4=cP{`pWL z#(c2RWZ-4a8rRGxgl#pQvU zwVn+qsHa=`?uy=!5|u7-TO+UhMT(=V{i{8V51B5n3+?o*e^ER;5A)XiBiFs8=eyO(?D)co-uM$Z*vw=~X=h?Ovz$MC5i*-dEDQ4F>; zjdzOr?sM{hQrbh=hwC@1M3_lX6(SnXJqS5uF}&hCt(ST3j{5O{^GZiw3{Z9@?kI`5 zwcv{3qM77t+6^W2zL9tP2<9hjOxnuIhi}hw-&aw2&2sh5!p@|D52yAx5w}|YRIuvd zeG{HrDlBnSvi5YFKi`3oRWIIeX)SGkNz>7ebn4oHDXO>`A2bZz-?tz;LgMM~{i4S9 zOJXnV%DAsRs#3{}&h_6FDDHRaLz9xdUWC77=6ki+T;{y_U54Q430Yg-FO?b(WofbO^0wCFe!n=;K+%ZV}=ql*XLx>9zSG z{n)|K@s6t1>8z-27jAYO=Tc9KR|u^BP1iQP8W?+iTIgoE3jtI8aZh2&pR#W6IN1Kd z>*U^_bBS;CBfh^Jk`}zh)Fp1nIH4$i=T*#+u9V`Kp zox3ZlxO-8r&*5!N@~mv2wCo3oHM&%=40b$2L+<2oOJloNFv!>w9R{^*z1;`Iu0)6p@Reg27jo%1g+*pG+8p|DNC z1T1SMWQ9E-kr6+@sb?3g-QUDkwW zcQxx6l(O4zSIV##jK9kzTPF4U8j8Q?JY09!04s2?As#L&c9Xyb*ff@Fum*hw9h@g} zdH>}vHc^+Ci-DG63C<>-pmFtDu&0+CVH4#*_HM4DWHu45D2M6o<*H*pvZ4a>T+fgN z2K%_I5jR%AvxvM{<9db!Xy4EE6Cr~~*$4&vJis-^-dq?R%8K4yut~sG$@tcCWaI^Rn0Z^*QQ{xqhLjMxVqUAK=FMLV^-{94$ruVK&_4| z3`q?=Aq$%7xelUdR^S6TC<#rnD4|JXi{Enb0_o>mDaf{Xn6QW#BvL?6GglyI*TL!d za7?a)iwt7hxm?g3+_pF)h}d$}K*I$=K_}O~zeWN$@+TU^%09rPhwBc?My$X93kSIh zk%+i$zJ1}kfac={oZQS10gp$xP9P?@w+>AFF~;*`UTHA%jjQi39D~n-K=c=vIh}2F zJkU(HF!-_EOBw62Rx;I?AR1>iHsr>s2$GawTW*|qT#|bU8p%=yG)i-qv6&|B>5#_oF?n*_J!m2>4Nfdo;O1;b zR*eCl6uEz)Eyvo2fS}HO8%fK`kJvABh791+;(m{axMSPaati?AReyw^CC07cUVw}a zHIM`CYq`Jt6*pL|B{we^HsDr6gIF@)L<|xsz+@wL0YdO-U=3#>PYd_Ce_! z_b5c|1lU0g7kh*PtlEMojWt>D5CLsJw+iC+hlnk~oHEv-fBx`&9S(P=H44Uq9d!VF(XZF9~oeW-Z=neO#zr4UUb!Q*9 zJ~Akt5AZpV$PX+&a%ZZt7h^e%y_oJUhB#0a=K08p4OST7dTC4W>_<+3K9#|`-MIJibz%hl#0V$~emR}k`BBz|< zIUhdLfp;2@1s{7RhZ_-myv*|vt;_24!AJp*Ali*E^~z#vTwq@n=fa=??P4B*zmd2b zkmunt9#yu4AghAs+24@}IT5hi6+Bdsaf9a{Dtlqp#su>BdGwH4cw`1Y;7LcR1dncr z3j@<8o};Layou}n5TY&c0Jg9vJP*7(i8J<3$xxtMg(aSS{=Hn)SL=sRQ;(5=} z_BNk1P#xv@2R$!30liQ(!Q;ZoMJ_NG!Dk6f!<{i79Gv7?hDQF@5@sXGrUYKB(48Su z`J0Dx9&n6?)qypw!jxdlF&ArdLz*~fAP}6<_G0z&V5>M`gdG`)@3u$-duf6yS_D_b z)e|aGB}d>KN$}{=&?C@6up(g$IULsxC!SkCC=g`Z84o@d5qo@_Km$x|LOWvohX=OZ z8E&G4RfJ<~2>{%|AxL8Qa}ju8NLY?0;ckKKgn@<;;TL;hR)+zMObGkX9F`p5*;WDr z$%P*r;WHWVnG?nkBbL@!w>6Y&p%nqe1YY8CnwmF*3JzEitPu;AtNau^ng+?@nTgy2QFdlx~BZ5UjA_(%itHiU8{Rr_v&Ivd9MnEJq- zuV+tKj##kzNG#cb@RdCV9+WiMzwmsnmqego8-3xKgnJJmk{zNfZ(=ww?8hKtg}$)P zJ#{7k6u|azg!vc;5dgRM5yCl!W~HBhP2|S}0$}7uxDiy?hW>gdVm6T;VWUIm@jFL*4{SB#3+{JQZ;ed8{!S`Z4ARv?6;V?gZdhs%U~3_VgHRS6@UDDv`l0Okh92f&qlj zvRCC;Mhc6IB|K&?03CA|$%MDXa7r(F#_Jm{lxZr*d|GLQg@1``mPR0AGsj`VbT|$Z zCYDBsLzAJdGMIT9v^|6cfn6p+2bJc3ArheR65;UQ3vyTrB*r9?KwvK6-T#O3g6KlR zQZ@qMUVY708^A1Z4CO#bRRDTb1R-P*{Q1aDf+BM0tQ;dJV8j}qfPGNgZNlLHC;(wP z7`sp4^g(b91q>2}LES@wI`WQMFrPFg-$Ee&=l@5s(#<4AU|dhQiU#66Fl!)?Z6E|7 zBJ{ruCisp(0=J%UvJD0+1)GTJg~1LWDwH7!rk@dv&>UD;{)Rt>!tNxpi6D(&u6Mk% zup|a2Qo!JIf+&JnVqxiFaL(Emf(bIwyLn_qP~1k)My|q>Ae5DYm9#-eZ#@ZpEc1ro zhj`!t!hs3kb|+yGG9K(s6fww%h)KO8yu|}1Sr2ZnKZ99xVX)#oAsMCO=N|~1bKNXk z!3b#NHJ=Hb!!>^B%u*oorwnmYDXwN5g(!*DM!=+DGDOfoGT`Q8A)s`GP>cF{7~?Vk z6012zguMd>If?=%m3SKw;Q?3%IMRuW(2XNZdNQD7E|Jrq-p-}VVDMQEn>hv3ceFI| zD~c)BNDQ(U!JaA->EN~k@fG5U&tV||A||Mv$IrSfeXtFSh^R_(2J&H#qG1kAUqs|b zRRh**oH>rn2R~O5<&od;<_70uw1$Z4Ay=Ugt{FdObB003V%HKWAbrgr#q~;Hyy8<> zFo5uBBq_&ke5{G$z(J3=5w$9}KSQtHRwR;fmf)>1@hzHz7dci?V||;6=pZp0zVsA^-0j z>{dKO2>2Z)%KrZopZF8`kZkW1{5`50V4B{0uhqV=0CZz+T^F(PQ2O)20y^V{vbY0@&7cXvGsRiSIZO%gP)q7(h6ebK}d3ZG4X4S=dvB z_7X{m8y@u>ZZvSWpZFOec%s3PH)r7;%lIeapVJVlEI>pUocv4-{M*-%D1x2KfOk9V zzYskT!U_!l5l&9WQ$DV=X(r6}%rT+?hX?Bzjz{P41d-D;;f@~3gl%=u4`LJ=Icrvk zP_V7%AiVh(u>ck3*{y-YSI)uSb0dLt9R=%uV2Se(HlvbykO}|I9JmOOYS2W^&ZlEI z-|q7aQQ#p)qN0g-#=|vZ!QhG{iF5M6jfn>cTc9i$22wJld;jl5jD7(gwKe9ER1rKI ztT^9jC6d|Sv5gZ2)JUB38eZKvVvxaQO_Jc>nI9K}xrsytL+eOnHlx`0c94dKRHo(r#_BD_dM7Q7M>3?&elj0dKZPwiaC%E#r$%L)QiOYqcoT~P2#*$4DTa(j_FoY?1h!MS6$qG%IiQ6(}$N zB~sS^$oo2nRQf+WZsd^!5D^cxCq*y`5DH10TZ35>L4*RfUL^&i0Gln-ECh?W3eUab z`YyXJ~y3Z_{Ok7CiIBrk;EPQbY>{!W_ypW)^eaF4nDCap&ZZg19b3?jl{oSVD` zA@QTI+hHjM{-Kc9Bg5bUg>!#RCtDyQZbzKQ@k(fVPa*OFjxe7|O8~zF*$_DiX(b3w z$&jtk7#K?H*(Q7U5*E#FC9*6w4Pf>-sz~05tif)4HONYUs7yYFn6U%|SsLVe#0am` zaJm$>K zoZG!wZo_vNB3SKhm;|&u$oKxsSI&dXhe_Rm9g~?SnTGrdnX6$q5_5+k4=N6mwg0;o z2H8r2g?{Aq$Sm-_Yzdn=OdHDJ=}|K0^(hQ^Wh^Tadhh35h6Hviko<`~5DJa}+k0?J zeGDQSu$KYwkaiKR2!Cz@(kIEg5Og$>oQQr3p8gXDo73Q^)3M}CWFCzK@?3V|1`y&j zws;X6xk09}#DU)nWRgA68B$#q-p&3&FwIAB&pPLm=OQ5-wy`CZVrwlxTY4=qz`3V{gcOGmj2^1Q5UP|UhodrJ9v6f87s5i(D z*t22SD`O+|3>BbQMHWW89%duadj3yf#LA*3z_pt35O^FHja`xjV$g}I8q!u9w%=` zW`xa)GSHhLd!wLWJ!9}$6pV6FYX67$g+LkoAEGRUGW9>iT{Ozf{}3^L$~HC;@9m&| zbgYYuB7zk*!fs@_5M?ehJFL{W7$TTJ6RZr0!jxU8TZGvNN8mlue9CW*Pj9g8EQCQK zAJ)y94^s}$Z! z=%rBT*llYH3Dawa%s+3UShCj!aNp9=PiXdeNFv;hjxS+Q=4_^HLWbb57s9-3AiJ6t z2rt=65k$hw!h)?Z3d1cZy?^Tmg^7Xv$YQu_Zp2S716FXm?# zXUPWI?I@fV=6DeQSsdH`0={kzbD+FrTL+da++?_DH0(- z*-5Y+RBpy%4x^iV}fr16NSNZf8SpzI_EnTl|W_3w%#gjw1nZMz^vlWE=+S zag+`;@m~l(*qHeLBVAqFT);=@xOsbot%3V&Q}L`2;xgZgoJI)r|<*gN0bxn zl7VkPXi$Fa*&Eoai#?;D*L$o_5tXsUoiI-@n82vpp2j`#Cm@@(nApg+dfn5(Lg*jSS+#MU6Aj{2xTb>4g4&^ z8jjt1%b;Vs4nxTgjZs3-L_Cq<6Co@NR{fx?ojvlw?ns$e2$SiCJE&%cQjJ8#3rV*b zuP_$a4Rhrq9^T&^ZYy{ffgilQJ;>B}?i}IerNC=KUS7=n9Sqy~LcC2#Harkz<8;0EnF6^nDy6h7VsV!@C+G?B0Q?711Q0()7V7)Cb=Pn#Zyef8kJ}-Px z!s4E9&$|z8Nsb8_nA!)(ZHF7L5lZf`jgbMjkMX*r8)!T!!Dm@;Ad1(CJsrTafEw~D zjzfRbG0kjV8dfhZ$p`e(c*9XR;0u|Tz;Fou1e4Zc2}ugp$W7%15*K&}kfEVHQ~{hl z!*)M_V$UGm@QrY0fWeRH4Zv3QPzf)(h5|5j-=UKe40mPVev>yCeV7FM06rugr}|T| z;?M9%ZPLigIj6BgAB?o{4k3HPJul5J?*KZ*4;3D~2(BE0<^Sd=?=!R>+a&5#IyOwC z!n?7bymfzTi+4nV!*IXbe?ck(sPg!%w#pa>76TL#RT0g`6BLfret{A1%17m#A#gK5 zM4V+iexM~v?Lyq}9SjkEU?M@ynmtO&V7Jw&!azozI*E1-o~43SsT2$nshCL@3?;{T z)N*!uz?*Gca(u{{5tvb&6sepyfVdqYM@3LLpIX3n4yS*h0XRjDZN@(|4ALY)k2>`n zdu#p&s9Q>Xhcwvw0q$AO%92>d7-Int(55a&elc1}ea&V8l-E&zAiu&_kkE(|jOBo7 zK&?e-1K%gJoGwkkWSnL~<+RkStdjB-W}Y)!sP5>STi7TovqWWpH3z7uFT!R!UKWB| z3cU58qAv;oY<~=q7_353=})yrj}Y06t@{ouSV)aI!CHNK) ztb$)UbzP&1ppkgPANLDp{Y4ejg^0*5B&_2D3&8@W;C)p-p#C`+!rlcyMq-lx5eAsI zP;Vk0FhM9|@L3F-CQ6ckn&9R#XDZ2=reF<2)v`x*u>c= zgn&G@_dON81;>qL-bWS1jNKbKWfg8c zHJTvylMCk77u>W^#0(E!K^{pWR>KX`>Mm}{xuB3l+ljIOJDnhyALt9v-m(ul80X|e z#o%lqV5deyr$Zb8f|@i;{0Q;4+VI)89DEKUZohC@q zLE>r}=Ux)eQxM??w(DpKDAA4@(ak=(-FG!*%Gmh1i-rC~8-7*dmaXcK?$ z4!E8WP<5ewLXwIfqUj>5<6k7CIL+e9r7A&7wcN`6#mRYDCFZ9WX zFHHnhS3D?h`_jaLVFc|yJG^m)mqpQ(k-wY@l)O8fJ;ir!@4U8NgOr1}OtAp#gTc&{B{J ztZ)OeuW0BkVPz++oxPv%aBCEXyX~fsqzI7ir_oW0#x3Rx+9Es={P1TB-||G^s0Zy1C0epV*C>HYBqr1 z9^jb!&5yA29Sq3`|CS!JCptuDS&s#-C6Vt94oQ@&n&B- zF7%&Ih5*bcJJ1|F@J8;^#lV&VIvokSxQ@OOq+Fwa_-nUdBl55`R9&a%p_%xg^VM|D z6&(Kj-34qUbNaeVPe`etaEGQ#vF&gN1P!!?m9VfnSr2G7(9ZLuy z5Zz4wiVo%MGbAKp=JVnHyVp-&__r-t!&wMF7OV(sr`~7!6Ly&6ms_*wpdt*Ve+KCV z{}DhDGaICnG5h&2{Om{IWHg)gHiBhXta!ep3JCp5k4Hjs!N5gj|biPk)J#fh&2R;xc zz;^{j0siSIBy#>&4u+dF2o~qNgt7wu0V6)ioWZvY83e!6E0N|C#=fXRBi@|L*UBEw zS^_|zlg%AK+2$kp@efKN#D|TjLD!8e;A>-BZpli%`Iz29Nm)Qs=HqNzd|B3L@KKfT zCz1uX7)}&W=i~j`w2(*vdW-nBBLQJU2`f7!Voln7yqMWCJ`#AkgwKNGP?nYdzyQL# zIGVAXf^<ce9BAO33-}gryJ$7ovc5x_m2;T)5M4b}R&g2n7_c<$Hl(+!udfP@%`i z`OiX_h>#pO%hv{c!~d0oz1YuNA}ruaD-;ccL;^{|FLxy;8h(> zJ4XDvCxiqN5+nq7h~Sz8cL+{#D^MJY77IldmqID-aBwNbDFi4K3Iy+0TuO2I-?ek^ z34fmEDVce9c6N4lc6QI6v$Rurd%+1)4y5Y_O4aFsPo^6DNTJROrGM2(ol2d05;PuDoof>nYeQWz(>O@!l6ExAiS`@+65{HD-d^ZFF)e z$L3n<@N;|U{E49?s=nGzCl9Y-O!DDCGD^Cll`0){r$ntxqFU}`Ntazo?W~(B{2hIn zZ)XqP1L-}q2Pl}_Dh0(N`{I@iWhQ8%u3HQ8GC?<>(?^D>1py zR6_ysv)F6GL1GRfPs+K1$WoxIM-Vq3jDHNXBP|F!-sT5 zc`I2B#=|;!8Xm7x<|g<%h%7y-6U!zxQ%IV>l6_P+Ntm7m9>$q*QYV(3i26bTXa*#e zx^lwW?0_RfpYzp+lKSU#B6nfutSLhobxtRrX0kUD7_r?&ok;8OQ6wCAWFml!Qnp^# z^%6}|;RGBT$*Sz~BV8(EdKmCP7b_fs?V!oh41>k|L)}DSU2Mgg6*JHoTbv5@S~01?vk4UqUwSseX$Tcy(8k{wViidhlOW zUdb@)cZpWJJ8hI*A42NcmPD4?6poNKO$ToKpuukDJ*U< zV}OxY)X7E;LubY4gL6!<%BVd0wj8M7@%u4hA=NV!l#yqA!7r-Jj@66lkg%63iWbp_ zb9e#JC$kW^*%yB znsO+cD&hrhKJf4sdolJe77doA>n$X;w%$lSTr~tMdn@bXg)NxZscfZCie9|^k)vF% z+E`f@tge@Dth7%x#*(a|`XB{jONcz5&ch0X$y}KE1pba7)9S$4=QPm|6;@y~Hsd_0 zgCJAspaJKrTI%D!Vz>Io7^IwUtCt@%Pzx#v9rZ~9&c+6$?1n+FwQy3Y4xKz{@i7XrGYbKj{b@$gD3sD6_k;uah61y zVoBnUdb<*}M1M=PW%(WhBicx2IwEoPpY(Ht5twC|nm5y37Lt35p1-Zbl0!;YlDF!` zmK%MSfSDv1FTulXPujusGq>sQi&_xgV(|{WUc6C3=-(9SP%L}(asem1oXN10%sSAg z{sFyDj*ew)D|t%Uvwqdf(=)Oo8QV-ETY^31n0}fF!p{_QEIHQ*sX?QQdU@WTCEMu8 zU=q_95v$-O{dnPy%tuEyc10?0uIt4%rUI?S9+Q%OSO1>34ZDH*2SP<^aS~-Pn8>*% zu42l($1oWiNeUh_iFfQ3d>uia6u?57C4HkrqPfI0nwoR?~Oh~tag}@!Lg93 z&9Si2M;Y|W{18J|VPxtF3fP^5HZ04--wu-20(%)}ErtluIyYw<<&+LL%ob&sJ0vxO zBfXC_{2&F>x3wS$PwS%%=Vh1DOpy`^h&oa@1!3rDoMB_mGMt^z3L>`^HvIShvnzZw z2P=pr37nu+w~$y*XST*J$ju|>03~;A!y++G(cN+6P#ago&c=p&B2i$|2&<)S zdxJ%ZYiZacx{cXX<&b4<(cr>u48ES7LD>olo)BeN4e9M%5lZh)2A$_@C+(zPWngf;jV-1gZE7%AIFoNjA zjDgC@NrsW4ZdN3{lfj=%nTJkY)*g|2>I{Q?xSNChg|TND&T$2#SR4VIXV~cx*QuL? zC_R@MeiWLru}X;qM3YkCXG5H@2%EhaeCjU-xvGAVg0b7XlgmK%rRxKgwrdUY35A>U zIRPzMx4~fL4mNi+90)~h%ID37`X0^hd)$y)nYhzn=c*`ZQgaXW8N2jBLt;+arXz;s zTr^v`0@qo%GSlH!XG9j`X~Sy>XZSLxFa=-Qc%kYR7XO5Zq&Y&le zf5V}QW*d$QQ^+DNvTP}0S>@Y??ZSL4nsS?T3Zx9@wc0<=?KQdGoTIOJ< zeFJv)XNHDCWO0+R5H09Xyk8mm2$3}2D6}3~FCx>NL&iMH^-l(|t<3`ejzh+50bxCh zBDs~navAGzuVQ||nmD5;7LDyfjb}MpL9J_eYqc1X)D!AOSdBY{Cd|e#pC5q;i((Bk z7UHs5KPUBq*l(kZVZw53J;=g3I2PqhKBGKH!RDPq-$G7CZ_H_InkpHK*Ry%%!^SWx zC^1%I?2VnHww>TzlM5M3%VyH~OJc$l|Dr}Y)43-x$u=v6OB&yc?2L^d#xbTC4N8Z~ z#?fxCqB%t{6RUt*LevF6NF*VZ4MEDZ>c%{rC^IaMCVi_Lt;&3=$`*&0!0$t>jiebPH_JSzt7!!<3M3jQ>b?qm!7s zT9h^`C3_i<@oLd)rIg}BjVncvVBHI==oQ^qV?8dMd4!apCz}VjLX<@lj9H=rwFuD- zM1Hv82cwz$3X}b2hEc3u*`FbEjQX7Alm_#RlT{}wrI?o*<(o@VwnO={+$fH(>|AYp z$K8u7zs|UlOJslQHW@dF3UIoXxrUznxzlJ<0=60F2@XyyxNV|Wz?O$7-3|*Q=!jtm z#(TmZW9cyNma0!F)BZ3v7Pfb1Tp(JN$g9S9;r{Nd=J)Sh24&neV;R|Bbk1fr1;)#uDau)0sOC}9Ngl_iP_&=c_bGqk2rf6l1uSxEE(>YfGaf_&u&B6FPKlzwp!bfj( zCb_bZ#bcEGW>ZBmr%|FZ+G(0Aic3(m(jvDhMd*p#_*?N$N3<#r&$@AH0qT$&k)~kM zdK7|u*Eo|{Ir1zvIk(BF%qna;EFS)`F#)0o!{n;hXx-&~Al$(Iv&&3l=;(;m)EVP^wHrXU!Fl7rjChX}1q+_+GnB-}B zw%C&#J1Le8qcodgx*(dSDQG84m%`%T%~D;&%}$sEx!Z_omrxQ5Lf)h$3ry|!c9w$J zAs@fu!3Yiq&M*a%Ta)qZ8ACNt3E6CNh=BrR9i{JflU()EzX@CL{=3U`Na)5u-uq2U z#osglDQJpK?4I!q`Qai*0MUCQDIrsKjKd<*NEDIa-0)8(hEeQc7e zZ7qjPpAHNE_S{rfNYk>Fl>bbD|37EOJClr^Im#6LY&!h^mnr6Jo+vmh7QiN4L6TrF z8x>uk`5GS#3XUZ$=f+deKEkJa1-)qEbDT73K4nyX^Y>z;^1U-EGieqAVT%OwG9d$o zixGxpGdL>F%h$Bs%9_XX1&V@ss;tS8G`Gz`)GP5#%m;H21C;#D z&9ej%ri&$`=eY_KT`Th|p3LNGZ5A)gDxKSy<-;6AX^vEmWSCcp;%q(5rm3tnGd8R` zne9|ifO4p#S#G^Eo2wWF81a}*Dc{9>ncJMrO%P#FYIQfS5T`iV!*y1$=0fC~`NotF0>6<0+bnmP`P#SDeRHGWfCCB5IVvk%0PG3%g<#3s927pH^=S`xLG2xV@FWs*?R zo%Nml8T;@Z%$77^PWS#7IA)T#3V!gf)nXFD*^Wv=nB^ayQsOa7ZnCtXC5R-2TcoSd zoSo8?{^6EMq8!`0XT<2d7LQkJMd^pX;6dJxaTf6cE%guuXz{iZ-xg%m^e$%cC)-vd z%EcD3h;yX;dwone*z&_e>`5XcZY^%f7V&L%NlRg-IkVj6l9pWL;~LERKBX*k1O&+q z9#Dd#>?>{gRX7KGXf*m8wDaIv7-T~QOEtk^!u?6B?KS^hhqqvP!+Jw_GalI|_RhC2FLF1*HTux{^D;v{{P z#b0SP)*|CP>(yIREcjB%c*{v4omy6zHyPJPd04vcHf+^zoQ&e8sg@9-9rCX`0>m1( zd7I0hL~X}vG;O9Om*B8`ky=`rJj-%dltdl!bSwT@g4Evu-~D@@YHun|8NJXVr$e`y zoIBB7w-&2bmEC0{qj$pI{g$Z)JO7iVlNi|i&;#}BmTN3oyjje7nMbFswQTl|&H3hm zAKpUf)4yv`dRK@0qt_(=dP_7H(7vkOMK)Zrgp$$QEqFGt-jYW&dFDAwenuoe?80Pr zaig>tDSFoGSw_FbQkz?SZg;^@AgqGui7}lVZnVGhK(QPXo7J*zi*oa{MeGVIsP?ST zK-ObXW?Zm%yQ@&3?<0Yc(#^{8E0zu7N#4y4XjGeUYY^$P7dr;4Us^88O}9SQFw!>M z8c6onLHgq-eCD zSTAcZ=PXROeiT)-@5AAt%Be=y!Qw0#ZLrd|i**SvzO%d4;vqZdWTJJDC_a9&HII;hBVkIrpR7-~JO%Yf3spePLlTc7?OgPWHBwZ4 zaE(;?iT4db6H9xw~ir9BpyR1vFUHCO$dVX@-mz~;~2cp`+-#+ zc%$_wsOJ|km%uY3l;i(dF9wVrS_ zS`=c67P8p3@xPVZR+~Kj#8{0SHu>E?{2ivOa@yon!rY+HX@t`nVYVRAP*$jK9-BO7 zBi-GP95{^)=KgtY-+6SM5*TZfU)E$LGvjP>$Atb(HlBgHgA3cvi*8_E);YoUS=a#T zMv$c6aawhH37fwNrwp{Eob7>VBOAMCf5#r;u?n`<^4SFKp{iAElRP{{`KOv~A}{pI zfEu#vX}igzv&aUP)w1Oi#ZfVm-Za}^BK)v%dbyQNUIoA$Z(4>;oLi)qkcuM^7f4#2ha<)fu*qFM zH)l2FWDd58Cl>@m&!waev#sZcN6D5usIA-uS8k=`Oq+Z?A@6xarzsb3u<_iFwtB)e zbo^7IflM<81}W)tY&XRw0^HiA)LUhfYeo7u`Lf!!l6y286^GW?rU^j}*4q*|hq{Hb zXuYk2?^mzX8OixqHcO6^5G3z5TddM_vrTLnDERxSkcx&xk@U?re5m#kI;qx9+g{H; zjoNK9NvqSqmb%X-pRz!Uyky#CjJUc7ZSs6E#KkCEkJ?rUA&~}qj56Yc?F|2$&4f2z z*+R(VKT&YpY1>Kxgi1K(d`Twx3 z6fqYu(M4D_U}JavrcG@7DbVjvA(!c&eH9bTw)?h?Ifxcz{y(;#a%w>8J+%cZy&l=* z$1^uPMdvczz*#R0#cUAu(k8#hLjNX}uVDxD-7DL4ArldkwbzeiUW45ays`brIkag? zulLeo3jF%2C_@G9NVMRNa;yz@Z=d{4ZPU8VwPEM-`gy-D^pqIUF2lrkyBeu@9BpkHr_l}*0^uo_r8veRWZD5D$M zGez`f@eM;OfTZ1nTU2jum*a)$S){dHPX?~C8cB33`xCdGWXU~O0C|27v7}CGyLcgi z^^If%l6v=%zg25v*Lm1pEf=7C-_G8g+fhN#l`reM^~vsRU&AY8^E`%ofU>TO>SDCD zWa$4;#oTY~@}p49l^HR!hy4Z*@d_F*TT44gLI3U-D!FTm`UkBy4zp)|#py#imqw@_ z$?8b^-X5rAj_W=@yE92}N#Clw95CPk)?ES&MLyU=m zGwsVo&%h{AO8L2Vx!0`fs@Ue+eT4_QiIo=FJ;Nnoefsnfw&r7&+T}4?)jgT0w-5S>}3ZL`~QhWo5{$fv-NUk760 zaKk}+7}@j$fzq_wzEia1`U{Al9Od&qyG(^JjU|vp2kc@OarQy`R-r+U+Z-OFO#Ic} zLYR!fhx}>}C3%k9uQBIQJ{`BO5N@{ev|T>TV0uu6N#7TU+WVg)OKg44E>2S_5F~n5 zK`(ydbt;E1+dGJfJMMPVX+rBKcKK;EmI%Fjs+t9zN$dxkN}4~*~wOMdXod!k-SDo=@aCTZz9udh-~TxPT$uEK#M{g zO+=5=G78GLM1NpZxCj+YkpW6$i$lB?OrTsoO7vHD*d25Dsb-qb=TrJtbI2qSW0Vy) zDa~s+k62L%ILA{u(_IBCd8lRhg_W=}hF@rzM?XKBXgP z&CKH@1>QPCqv-vvo|mbGd3@!<%WFhol3L0sg2T{K&M;?kDKD>%eR^U4$=fH`%VP&> zJ-C%R2yU-Fy}S15)PbR_URJNbz(966+h5=R&_U<#-%c@@#rG_@4*DebJtTa!{6 zTE40_t7KGJ4bjHG%ZS zmrhuDSL&KQ<$b)o#$p?-sHXgbR9b$PG1W*;^mK|HgXLu)V^jlhqR5RhPBW7+WbN6R zgS@@G6v&Cz$f(*4IIn!hW(jOd3u?Rwe0ydpJ)OJ`7MIEg4HH2O8^#Fk>Yyu1=Za$4ozZWLOI z3H&C$!I4qW+vS@RHMlnyh@0iae%m!%KIc=X@2vDbE@CV%%@Ku5wblIi80<#;1c(XxI+X7!uppqI`$m`agLx7y86ycHCW(UfgI zoFQ=yT{th_y#mVb8^frJD>$93eBVzgUoueM2kxXTf9D5^ob_e0fuuEXiS7)k2pO|8 z!Euq~iq1St#_E-KE!|+2I_S>48XbDf1~Qry?Je8Cg_h4Zmq|{VLvwM#nOg~rjQJ#Y zC1(jH)Kq$Cg-Yo8#Q|Pk4vo<33rX)v&io9O=a)my7cgB{ptN1wW*OO5$ytP<+J$Vc z(if;c7;JGGSqoRrTE3zn*;GS#w>9?I-{EM+5TLc@$XHE&sf>6tpt4i!uuZ89m49DL z$;G&ZuTjeSOC)cS(@H`Tonqq1n+Wpt%arUSO%i4KUXreF z)tI7NR*#JE@=C7nh2Y}(v+@?%l;q6EPz#&anK1>yCO^C*+!N%L>oa+gXc~n!SdFY67l>Mg((cR#gm@~J!vsfVQ{Uc`|{7%xUIqg3G%_r%g zG6NJo?6o8fnsntB^A zp-?AjRzt+aZqWn1`yg)U%H<3US<5)|=~CPVNC!Ue?1ME>RRP-yVo z;;wg~Zx!5>s@1vqK8hEUP>-6BF!NVRv6IC$r28ftQYF)I>0zy&@@J4oVw>2 z)#cV;tHshsJ$k~Ceng@CngUPS0_d5IBh;Xu7c%Y7b+55s2E6Yq)IdYRU6juxhDBK=GVLj3e^E?LN;S< zs)O&|T}qXqayVt>z9m`0bNz)o8)=yU4-;$CcSwm zrQdnxO&&b;Ec3D9@TY<#ZvBiKsNi&o3wr99Zg!-lahOa?(^skd0G!M zf#D5?<(Kb;lXSHtUo95u<>eQbb4)z{K=IuD*Ec^Bu?l7kh26E|zi%K(tS|G#?)6bm z+aNNbzB8UVLWf(K{?zjqpewZVT%ys3R5$oUks0%aCaaq*`okaCYH%Dab{AgoNtJC( zPemOeHqtZIDYllEP|6=pvM1FkmfBB1@$D4mLwdMS0}Vmk!WGhh+#5lfrimFg(R;|O zgJ_e(H>aack0LA5-4ZsbK1e3I%xBRK@U z8-twGgOhP-C7+8cg$~NS82vsP4R>iYJl%^!2LsBTW(Jk8sShXPGD|UvuTk>m0i2AR zEDN)^6Y#8W=K?U}nI1Xg7uYUzIn3V>qX?;z$Ir=C9{7z-#q?C%6t%rOjL{3m zi1k2wdF|M&;%zMOur~Jb-L-24aCh*l#Shr3;@Jh7B7^VQ47zsTrsc6aGwB9+^+FF+o}RpIF8fd40=)NTQXKb45?sZ}bI)yIEhmL=-ljsFM=$CmuUkr2*0%z$ViA=mZgg%($qOrSGVbXV-L`>}dn9o(F6k`H6$@z% za$pK4oZOC*4^*LKyj|K_q7PE?-fEQWB)FE-?DnIXwF-Vng_X*pL$twiPz{PN z&jt5x0|^neczw9DQ)Ib^DEVkzPJY%#Dy?q|^1gHk}HA3~;MN9Lh9QtotX>(&cNa)g)latyxqnJZgEfTx-D%x|9vW zX;Y9_LpfeI)HjH1?jVQmp$@3K$Y?UNBf{(R4$e4k)$ooW?;bdXoqX@1v^(XB*%S!ry>612>6zhU* zA>3>lKsKnn{or{gk)mCkxd|>fH40l%`l^b7 z#bNEsm`Ajuqu~OI3M1>gh$-a2zYp>qgz2mSIpgrTUr2TrnW-7OLfh->NPJg0E?ZGb z=w?cB(Q8s2yv^%C_HD4;myFr%8&2+al>zJnrLW#8=%4|^H+Vzl`FncWH>gK81~wk62A_H-S$Ct zltzc&uKSYH*We%&%ev!imktgG94`_&=hI*(-y(gxi%i}74r!DHY5yRsX|w3(_sF5{ zGK+rE9d_3}r4%d4+e0Q%m3x3}dr4aKa7J^Zjt0ed{(rt?*(={952HS&^r-iY9z(Bq z6?;kTdxE~{6Q|1yUJJ6u#*X!hHlqPk(ST%41M+&~Qq5PsF~CQ#IvBoL*_S1%n!LPL zB0OkgE8e}J_-InMryNy_dZFG54nLA&_j3{FDPdsW!XwTPDdbrnXDMcuLH_&oR`^U) zG)aqETAfLZBAxomz3^duQBy!|Mvo-;gtpk*`<>ED)%7D4>%io#a3>{`{i@wt=VR2| z0D(a}nq@T3O#(uDGNE2f0 z?+lBlj}bf{5UiE2%Y0x{bF)jHYW795HTaYaftqq-~1=S)k|X@E07 zcY$dG&?4_vWX%9)X--Lt1Ljs+@_B%m=k^!5J}?}@?|fB(u^mYq=q$qwKk>&$5qqIV zF`(i-T7`5W!;egA=U0TRuOOGPPcNd5x$Q~HP^bMXJKhZ$x4t)QI1!FiLL=z}FG26x zEyUU$U*_lAive8>Pb#W`&h5m66M4sOKHj+V-=evhU9~&|!Tq}hN%A1s&FO=HYS=@I zV%P8r=UYbsd;53*a0#!SNnm$Z z`5cd{iOuB72-&9TYcS9%E+ECnI4xfdv_;$J|1b!(&&KG{CWGC13H2&tk<<(wiH4M1 z!lbc#jLGhiviq|rZ|O>v$CnH*fBE0s zg9!R)QQOeaKe%$Zr&)+OOvTK;%*nW5*+y<6yJ6a7k01N74YZ+CiME4ZTvze9{$#v( za8b#4Bqjju8-%f_9b3z?ReUajTb=b-D9Hh~e>@cUaN7fbo19%FdyWL;o&bRVT`j;& z%H8qPk%SOAA&#M_tN&wHn3=@SDdm350q|AQ8q3n9%?h~apLnlIv z{i({+k-n1<=x|pwf55b~T;kgW*vJ}OEoVo6{~~80=OppCKVxmRpm3u~cb#*FFPby9pRjmAQvRy+|5sfOeIl;nk zice-;9y{A|;2MTUJeCe+JZKPpb-=M7( zH5O@~#0AQdxKn3^D71g{$CmL};@tUaT^X0677_{7=xNYmOC6OQN^lLf#rV|`8z#YO+%&+w4jQwt)?%AkYyOB|~n@34p z&TVoR3MstvO9M>W6Y#txsGU-<-^Pe84eH8tKJ;ZX?JdWX3SIb$z=I)wrIC#G1fn)Szc6vB<) zye2<3gNDz7Dx=1$03!*+W;Qd{n&b}K)1k#*Fqn3!)9pu&Uo%UrL>C7YKQI!|AEB^z z#?sH>&@Z#Zwx-WNQ%n0}B0LO#(n22+4waXPM=&jV>RqKqL3Bxo)~<9?7jryr6}PZ0 ze%_+&*=SMRGS0*0;#TtMp=gmg`1$lr7@wnHChY=d;0lh%#p8TiKFz%H-Ab7LHh#6! z;^?0_6xWf9?tD52H4b0J$+&mi;W5?Jn+slkWLLDS>7C>Rcar;)(0XDIb;Gtt_jf>@ z>H%I}c%0?&^J<4jA>3JRAg6-m1m;a3HE@pyAce>s?F`C`I^e;>4dz1A!;JT<2M^bm zW2rSydTr!96z+VC1DehgtCPZWR*h%^FQ|{*J#9F4oZ?X2U@n5mbt)n2tV(7Vn~Ulz z%m=S;7U$8+%gKoOGG|*#c?&Li@NluY&Hd=6>ugu4aMdns@43lHAgMdIL5$*Z%E6+}HVVZs=V`5OI8@%%Je(5kYvi@+O) zVz6mZXaA!peDCNL0{WW8VnA*9>C)o9kXj4cYePi+cO0K#@DCtw7t0CRuml=fK6>zQ zKf8D^(2MfCbCE3@FjV+m=u4ahSP;nAWLk9+n%6*1pbdz@As%?#*3R+05>K?A4V}&a zuMIMZMh`r$Z#R%OOQdO+FNFfd>>dEz;?AGjjNUPN(SK;@4H!l{vwt7vfycG(VWiD6 zDX`Zv2)rHP30NkF;_sCAFrNnxSG&iu);d=kO4HP;n^6ad1x? zf_K+b@pzZ6u74;S#$17OE1e^TNKRo^CUt z{w$1>Y8u;=7{u|o!akJX#`{Pz1OH-$N({1v)`l@_z;(5QYsYtLA#r$T>1x#7b)-rT zA;;#4)zp))ng4!^x{D(L()vr)@f@G9MvlI;H4tN*%*hkhI14gGZmm3+>lAv{46oA$ z<6S>+=)*PA2!^$gkUfo)zf8roR zBL3wwZw)6OT8cy%{Q1yT%Lm`3qKaKebKTf+w@^z%A&rb=UokUoZIR`q%r#+^x=-uNH8* zPQ5-=1YyAfyC-XgWU-sXd#f{*H7NhMWBE$0lraPqiMw;4(${e@U`LpJp8LU z9>qej*wn6Ew(4lH3fx3VJ5gsjGo|38D?8;NUP#IJ9h_`*1lZjRv&e{X$#lYcig>AY zzP5QdesTn^^iEUcm}#fLJ06fM#aZ|(_b~Mu-z**-Nzk||n#L84A?FomI_vI6lNt_d zh^}@ZSxC{KPREgyUCuOyDr&3ra1a!0uFq+xsRdt)RiOs5Zja1VZtjNt-c{s0V^V;XRIV5h zNb>BJMrp7IfLlo_AdH;bEqRA2??qLWmy3k%m9ZmXFL>Y9)bfJKyelpq8lE*vz2JbR z6#{aaYIt3bLihGMqk`zjKiK$F@=|i>Bn}k&q+w^m6ZKxK`8oy! zkTVBlXI!Tu2fBITwgshX@Jb2F! zI>i~?s6*i0>%neLumWKL*j({smYVl={cio z=oqaEK7F{TXNPg#uUPMZNcPZ$^;5Gq3(Dk1Z`Ov7)YRzRWuQl)X@}*(f&+)4+nd2E zPdra%Pnf?OO3t6ac7Od}rN!F(3iL)s4kKs33yAP|?skas#*Lsw!iez%o`}5vRqpTS zJp$hLksiEOM`V~CMtNn&s=Pep+!2uwTjq^@Tn?>ygVrQ!T61H(2fpHO0>AiqF2C34 zwIrBqfCfKivIqX)q=3q#&oR-}UOT?uunvXBAx^c{6mm|}7K$R>j>;%7@+h>fpXmXZ zG6T0TP^o@w+WkxcrDu5n2K)$nxdEe&0nliH2jJo{d4By1<#k!&!8>UZQ6Tun+CSby z-7^SnRW<77S*zmnlX4c9c*yZ0 z>It!%P;+V1o?8LEhu+Ypz`ty!lEvd)-AUB7Wh?PM?TjEbPKqsp^aa(9|BO2B;#XVv z=57xCvKwQ4NVx7d+A;SB470O{|JudPNn|mn<@=z?ry*hEJucz9)50uU|H*ZQ zpjDgktKGw1@RUNs$et&dm*|@?T#*k{%n#2vuhD?_vYfzJZFW}U3E4Uy$0y8ub__tIdr6iu3P-mUK(2$eg%yU z<HPb@Sz{a7H;QC5frEq}`$)%R%|&Fk_6Su7fzrd=Z|Jd_lDH*}79Vw*!(3 zaP2y+b{!7wQ#;T|x?{JP#gJ9^t~-wa-wb$d3~51%UBt3(RGmNvdmD~vQl|M|zAk7% zSL9l68dZ;q=MVpCnHpx&7*3NyZEF2CmCU>-S`|92;@(rJ_5iG?Mb&ReQSoF{gTMgN ztDVR>X03ia@nB#~2A?DqM2Qvo8L4h$)Q!9E|Qx5$LP(K#rU;Kd)8QX%B z%U_b@^h+SuX~oI&RPrWDUe$(^->78$Wss|8aB|bj;>pL9T@yw;gFBVYn==>h+Mdk3 z?5xae`t#y#``@4o)}vk80JIH{kZAAf|CFo#!hfP3-#(n&^-p<}brdDX4&daBk%56^ z;(N)vMtOzttcgluyvQqZHC`G2@~JRN<>^V9RaiTC;i9e`VZuQ$q1L}A{J`<+C*x}Q z8&_mxdqQO;P2;|QXk{Rt*j~l@sn}KVxH^CA@Ivv6%ft_6X)Hgym4M+<~6K`M3Yab?dgF({{qAt847|T|N#?zw0!UXLrPada(K4Z**7(1?0pp&9CD5 zhYD_${&vkXOqYRpORlO$^yvaB)I^L0f^Z2kUZCfudw3UW7B0a7?TQB#ch5#^7TwC; zhN(IN(zG7FyFA77*{E8^-R&v9US8u-wRW(bNhdGv$*q>6_fb#R#*`9AGX8ez$f)~b zB#nRF0H4vs^OjIN&C)17teF;XB(9m#nY z%kvL-SLdp{C>D?^?kuS9i5}dHEgbEH8L)t~e}L*w+FkqwyX#5c=&z!~d%;1p$0RN+ zr_cm?*ExR}5`B48WxB?>ZO++0x}PbO_mAP}q9W^H-TN51+K^m+Jvsb9u1h{WfZ~<5 z&~lOZ>K9x&`JwRHn(u;EbY$S4?a}M!5k0m2Sys>Sd!EXue(fo$eQxFCL`N{bq4rF4>btei z{uqrW@BgY(@$Mt57I-tOmfLW~Gst=!MR|EiL{zZRBZxevynN9rFPPNHmQ7E84qg^(89XT85Jsy>u4m zCOA*Y={UAV^^5#h&L{Q$1-WRlN)9A_l7b7e`JR`%MgfJZX#q$GUWo~D%j@KqGoc!N z9bFp$YuBZPnsPCxU(xDQDW$l_w4U%E$hmrQa-|-@2J*vy(rODRZ((oFqkY1RUt@Wj zjLWF+9Ney&Cg9HhmP4}!2HQxTPh#?~*zaz8qc2uGNR6s!@VAGkcpb@lE!q=Z{!*7D72{YGo{N{DR4l?7tY{F8M^qIRs+#rYo%mLIwgTV`O@tKH;SN@jk>G#MPGMc(8{;lGJ$(1ki5&0)7%Z6jtw2BQ65y?O1a`CSu%xR5Nw$mS} zEGKh(=4FR|eLlg8YC6FB`8CySea7%}p1QQhhJi2LWfs1`l(gAf=AwtF%%6RUDG1kD7=2y2$a`;*7VVhos+x%K5O2-7 z&)qq|1Haz~nzZn7@xwd?R?YtYD4uhishM-C#9g)SN>E5N>Kgv#6JJ>6iL-OXeL?<^ zz{z0=Atti#fN1A$xidB_fuGjI*w?O$>XhR6eZDU7dPX)ClT?9|+m;W(7POxbb8F!J zY}KNtU|ns>z2xc-R7pPf0)n~<#H@gW{RISjmWq3(CJIWIF8 ztQ1u{L`Ul8lD2O}0c+~10Dh8h-0|*XE~9zdvB=d9k!NWX8b%ChArbiU|G2z!bB3T;?@*HtZKWFdnIoEr#vdHPdU zF;XwkB~HeS1lhYCF$TGclT(2%p5j=yZSi@BAy6_V=Yyu@gQ$QeT*dCNqK{z`r4)5n zL{3w(bqZ-8>Ix^Ne+a=r60F&n)e6R69&EuV^}#5O){N4wnG_$%);(PM&|ru;J(H84 zXX0Z#!`{j+|BLc!%;vlvvqD@RXJ->bz&o&5<%N)^i$eTK?xu2nSwI0TuwJ0`joci9 zFEFX^csv2myFAGVb;XgQp~BRSH&l&21Z~Gdb8X@rvy)2Ud$D7^H#nwXUaXJtqz$rF z6_Qs6fqi#|@NEHRi)yR#6dDW%Jq5fr&J^88@#VQ0+UlU~m&4?|&J{zJ=vK>(M zUVqn%nDj22&(0&1SC*qg^*|3j%F*@oE=wRqJ2n?sM~r%x-6#1tXRVN|>aUItgc!on)8(d-^^&pkdx#Um_@pAD$8p%U99JKOU|vWFQ~HP%^oiXvB`)A@9e)P&KjY z)CPg9NNq_y$+C;cv1#_00e_(>UvG(QE~qUOK&}@EHIj4TqPqCTuY1!2F5|vhTR)Ef ze@bFfjEBk9rS`FlOLsd_JOQgq?NU3rlt=Nq4wsAd;an%WaB~Hfr6)JahXyircptZ- zfE$%n0N)+b*aK z+({dOJy$MgzpiYj;`1`mbMCdcuojL}51E|yk=U00Dij^rFVyUQd!!558R!KQjfK}C zqxASWFpL(e!0mf89F2F5q?9;PeMD%Sd(!;(r^QE0qeZ(-IgNaJEXOa(Ek<;+*OxQ= z5Ktn}8QN~|Ihowf?GjJ&BO*}Qi6ykKi`-fkYI3L8WEkZgUe0-&BV7EHu!q_?KEp6= zHHSWra`}ICOziQj=GER{IRA&nYm@&I?qVUNLmn6Rr+rKIY`-6X7kJ_I+O=i$I<=Y* zQhzO?U%6UhOs6%ky6zYz(#v0EdY!kah0LT-q@0jaBGJUjyFGZ5B3!!H!D|BwgZ=|KSMM@c}NC;+Y<@c^uhk~Qz8ymH4>9*@JhrgrGP7#6a@ zx9WOY+H2kk6>26Kd0h$24|{*}e(F@<{Sc0-YVaG+c;IiI4hyS3b(qb0!-vSKEcYg=+&wEmk`Vz=dll_9Su|e=Yda; z!Oa}*11s^-5cvL)7NEyRPsB+7xnjq*nP^)Iq*l|k&G{r}p~sNr$CBmX7)T9!p#^Z4 znz-r9o55(e1MRM^5m@H6ipOJx7*{FQtZGe%uQ&$`Y}$=OP+oVHITxwvQWiXwC18W*%Iq2 zKt{!ixx{g&Ymx0x>?uM)5lurAk6hEqHy`ohTS9u#!(FNYU6+w_0S;4%3ye`*8K zq6iQC{@kLKTwhX*LvMEugBWW$=;&2@W%*1yGDd2vBOY9#Sih``*1A~-& zt*XvJGK$JE)R*!u*W|plMdgS)P03B`P;x#pvbJa;SEEod@b2PZ4CRH?(>T#|%A3@H z^ERhz)PG2MiH%fVASqT{_CWpO;GJ&5c~go@HP%z|rsk9!PhNq{qTG$)WB1V)2p^+Q zv`2osx1!KmT+b0DP&j{EO36cNx6$Eq6A8j`HeN3nOFyJr77_|-M%3yIl7f$95JO3+ zL$Q(&ldB^qcPZ)O@6A*>wrFR6`06Um+u9urXBQ4VS<;n{EAos=_#0pQp@RK;=)%~b z;=Hs{;QfaW{ZQTy{dB=(Mk!hIX3Fc{U*$!(J%3=Ku!2{i_(=Fqtfm1Y266o2Z-w!h z$r@E2F@Gx5oq>>`ofy{Qi$17(ZW+vUD@#k2PnE`2!hDik#uW|@&meoY_+=zDT16O5 z>#u)|q%uT)#=bF9Vhrh57NK@y8R=*TP>D}RL4H<7>_o-9`Yos`_7EOo{~rH&{Dj~! zKw0d;B$X9Yi1PdFBP&t$2h45SE!~ClD6~2^=$^8uXXRo_$xGg#FemHEfgHb*%dEcw zcJ4b(4x6^%dDkK5%ei97(sE*n-+g*YiDSMP_^3|1sa|Ufm-3{X+=q%R58;EcK~EJ1 zIf%3?FDqWZ3cQnt$;|R1(&g#*zEWwlqbmeQdo&p5W*Evr9zh)IHBWB1=O12Uk5PdR zvh=7fu#omEVO!s1wyY1u=O7`|=1P0rg|M_ds>|!~!K{51pl1J5T?OOP*dxJcB92rI} zbNcFWK?q*$&r1`>T;79M(r!moBbZp9a5SRwQZ(w!u!c2*J+H$C2kluR8lCd*l( zLNb`8@OWOsw2*1Zu6(S%R;N2Z2}Dvg1R+lwcK2gzP*ciGa;3;F3QvLDB4&YL#%hrw z_vVLDW;u%|GsCPmkP|6VXO@J`+Fl{tk z4y$C3pOqd34A}P2Tj$o2wPsg=#AD&2)`)O@0C83opX0xH(w_Q1#6kMrm^PMr<#rc{ zBEzQ305hd3q}7RJ%zWfjRiWCvGXGY52tjQjsE&tXc*4rDQDkEtePOnZ!@V=T8U#Ja z#{@+YV?KQz59VIV+?HQ3|BAuw@9G9nyK{vrED~O+eV3?L97(S3s>|immn(b+7Q}&u z1ikaC1u^M9V6g#_YbFA=w&80ElIPW3RoVE?>vQ7G|IiwG_EzgA;RzH~oQ$jC65sn; zS_AcUFUsmG%O1P2KC66hK>wd0;w63yXbjV~JlBm(ujvXQ?`yh(N$+4+AS+e0b@$Ko zbFD+r+uF3ZX$5zw7=|rY$@K^Qg5x}xUz<5DtR%3HYRZjJV=avK8i{0iZP(XEIpkez z8~xT~Z}^vX=niEiijzGZ#PZNk%UOah59v!F+QS$BrcmLjx9u$7Hi4#|cLU|8lmP{zp5B*dMlf8C_cq%rWYGYnp)>R)w66y%4{T~m} zX8=DM{i@AbTQ&8-Ppu<1FFWWDCgcHrGXkqtet0Vn{9`G9akD(W^dtP8zrqvjQmOjX zsVnrk8$NF=m4D(Z{HKl{_#z$kfn;-CIb;vjg~h(>rUE=KH_BZPyg7q8uV{U&nEKQc z^L%vH(al-tlor7`H>kE^i;F4;yn{R+ipq?&MgF*R<8W4JFbZks*r%h^LSlK@x<2YI zFpiVczSrXbB`#fJL&d**K`Z^9*$Q}}*6>HBljW(d2=b}E$Qp+FC(Kv?*Z}{WJA?T% zDKvrfP8BV>^xQaoAE5L-RqZBX)GP{3VRi2=_}F{^D0(7Ni>f@A3oMo<1b%EXq@V#Y zDh~eCNHZK;&*#w0d3ujMzfD6T4Ro#A8`f!{!9T{f9o02zi9Wx3kMNI9jvB)tyC=rF zc6T~-1;rO3ndu@4Z20S_g4ZB&F07`VUH{%fp}3De-4)3i*sJE{y*B_|0H`(`L||u) zLX)@ZtsXaEwQGQmYPOwrl#?t|^cJ$Am)!f>PkCc^sXW{f(oi~HWJB<>_o_Sx>E2M5 z8$)@PgDTHXGV92R@iyhP!d{!G&q|)Eyrf3pH94;GaJ@%MS#BZa#r(l}=Nie?!gEUg z?-D1+G?tlsoyH*VxxvXJ8@t3O>Nikw?OU9j)C?Xz@+Ky^FO6lZ3{3!Ne$NANvkBIF zo9<#9s3(;C=6R3kj*+?-z1Kw3(@p=;mgM_Ww>x`!hc7wH^R23U!)DBD))D*?8 zpJ5&OZ#hHzHxPas9a&vd$^4hvLILDqQ)!NnX3*dFl?tfj$2QwWQF0w@o~f0M`VTph z`zo1d6tL~B3b2z;3#8@KnuFIUlr(6G#oA_zA%IM6F6-Msd3XpSd3bW$T<$&STY#5o zRe5>bSM@AOPtP|L7O9KatKF@76RzSz$hH>3tAG5p^4``MTiY;)XvfN>C>4(b9FYd@ z+RTEtzr8eg1qzulAhokyW(+MPw()16Sw7PWP)Z!>(OvE;KceJO@tmB{N(6-heLj?! ziumD;_@R}#y%=fVO3GZ?3WXPxq=jS2x-McEFZpIp?%q)7C0e1KG%r@BP!~DW20L1x zT4TSDMrz)7t?3DxRViA4Ek|gcP_5Z``c1GpXscHArs~>~{J6lJ_!|el2lkJsoJmb~ zZ7m*O-0CJhVM-gQ@>^pSAY%O!N`BswlhfN_RF!WlCe6Q6j?{Soy=I^;ZAU+8zFK^R4j%Zv?G1tC_u+EXhPQ(PB|57Bq1OmXp4fwvVOkrh-9R?w z2IUPMrt)%;tWgF$>R&F+UMT~B^`o@_e4Q7QA@7&P6wvm2Ex)?OH>>-w1QcVOfMU^${435{mwEc8Vdx-|di z!;=HBI&Hn+iI-sgLp1w*ImG%m}CsITdEP&BiVgXFlsE8yn_TEJS z6$`NhONP>k9UEA&Ac74=h3~g_@4fFXytAL%>w4R}?+4fyp(kGV+{A}~(8M!FAGfd1+ZPIR2yaRE13Veva zRFk>m!K?hfBF*c*m4%{FJfMIY4;29Gp`zSZv(8WN3g2+Ft{QrMeJbO12LC(W=*g;P z5Uvnv;X}2Z_y}l%7|@-n5z(<7yz~t;!lS%OD9V!rP89p@TI;&J`xOGzfB<~cx$urc zTaW`2#isc>epC}09&4-l{@ijVYsExyJ$qKroy;9@)q~*7N3#hP0(5pd%xw@*VEi1v)kcVvjgbvKm z!*!knQ+U@?0HP-2oX7CGXcx568VixZCW>lrTNPC>Nt%+CQ@~SoRe;ZAu|jr5tL9ik zxW2Yk-7#O!XJP^BE4LAEJ|d>kLA}kmxTdEI!}|n7%(A|c&(#Tr0GnLpG{%O+H9A!U z7A;_Reu?XSV+zHw-A>k~f(`^QL&@L%-S~&v+U)o_v%91!myR>||3!J)}Rpn$J zZ-9H?$fB{(JNeE8CzC`&l6;!+S@MFpD`DN)XqvoC5B4+oert8LwY*XBuh-8+E=!Cl zew+%^4jBr$`HwY1#aWUuM$Uo|dyjJI*rAa>YRsbPUr$KsxTqjpY@MUq9`&b7Iwfe$ z{MZnBox**E)?nW~Fr_Y(LZ7|nhlE#oWP7-d-2(q<>F6Id;58kMwmBzy|GSizJ-PfF z4oM}Cl62SUH;9#1Ag3t?q3hPa4W=J2<*G2TM8+$Juu94+@-s_IEVoufh|}hM ztbG~kXlYf|{*5Xbe(4-(C3D{#u<41XXXatCv1o@Rsm)xF?^-bOu(_hMUpT$)@@-Vu z8?BgMIp1f=pyvT)b-hP9ys~BFmGdRWe)B+{tYhTJd1CF$a&~6Y?GYN!@Pkjo1{BI} zQBM!6HMtzlkc<}c6Q`ry&cr1`*8!jX>lz7u)8N&~$-jZ&uTW_p4(ilMgu2>jNdaPD z0q@g!#1k6Sj6}_Pa(In9#SdVWnim1-hc>4oc`N$8d`ceCnYb*#$#H`c{pN!_s0$-U z`PrBm!WR3WFRg=6-UYZ0KYIFhXZT{MOc1SX+xr>w0d0n=@X)%wD71@!T5R3y&`4;n zKlV)d=2RR&QJ#Xh0@TdMf9XrKr+$b^cdS>t*5W5z<`>9q)eW|I|w zVUqx$Qw0XtO94rtG63PCycAsL52TF_lhdpX>IgpR()Kz`9)`e+4->9O5I>yaB;HXr z=H$!oqQ9`hGAYA)cwR;Z)Ltwt{4`yRv{o3`a ze<(7gF4l<$WQr-np%@KihDgJa!9T^1P&RyhY<~pe_lMT`$mlKJmXR~*m)WqJ%~=%= z{t2!ocw0sUI4Txa>Muc>4Tesd7Pv&$N)Y_l_QNmHRbC%y_%b|?@R`^F#rhFmd2uL2Qw<+?T!HuA zYg1oQzXi)tztg9x0t}%*2?Zpc;Q@L@w=#4E01t90z+18MoJz@SZc=hf5-Dw|1Wxb{ zISwJ8qt)?l{N)aXvW=i)=QSb!pz4P(Qt~K!jE1zFfPAh|yWlHE9wljS!t9Q6irH z5Xg}r3x45q&MI-H;IZKO<7Ns* zIO$Dr22R8`VKN7;1)CP_DA`M~2a!R^pYW9J8iZRpeQawJ=PuadmxbKyR(7A>z3zsJ z@o{x)oI?{cSy$b2Sg;OUk9AW3p5n?JCdgfy*0l#qvtBQ5i*<7QCS?Z7@vT-)4Bow! z%bBxYbS!J1E-|I(JHy}_yjSi^UiyD^k%bPtCc+* zhuq|{SN&{jRxSMQ*XXa_fB&c4WjF*U=Pitp&9A!8OC#Q8GVx86?J*e*OksGsTzdSp>Z54VBYcli@?)sKK+P^9ueO00_p(IWaT4FSl2PY6gAr zf_^W-M_IG+28mow%Z<`G*gp7Itr=rj8l1$Md>&(~RS0sL0xpl`0d9gIf`(7LyyHK> zh@CC(%hk*euMEqY2pwnZshEYF_zPTdzla2|5_WI|hJ}F<`-XxceUQwRV_3G3;k$1V z59xlGaCuQvc*$M#o&2!<_n!<}5NYeIm}O*dLb2bikked*A&7ZV$IVDP8^zM5Y!(Mt zyB@PPZ90OLpLEv!O#DXROUQ0`qC+eZ z_i$|&ca47DVzK)YO#XYdmD*4F3cS}2ag zIb4tzxa%v1FMe;U7G^m@1M1%G-NQU+tSts+evvumjf~eAf-iTUg9q{;f8%QM=X{Xy z^$jzn$thc!<-?4rr~@yL`BxdQ7UC`!s=%hrmOp$B`~+B#$9JotB4>7>-!p_@3wGhO zQKXST$91-~RHll}f%`P^3vMw)ruxLuT!okJVrz`jFIaN|7#}pFrX1E9Z&vS?j@Ali zNgFzlmT_o7`MaeU{;YJ(^D{jFuhj>G^hvIbX+;F!Rbv<99 zQah^k5kIw*@pwxB!ZC$<#e>&+9Mz}Q92Ku~XJp~2$<3`vX#(QXQ}Gh|GDT;I6>;G@pL?9%C4LdzWPuo`$X@g z`#^0x^l=cT<$FAno{Zsvz1X@QwpThrJ8v%vGwCg-*|XYYQgZJhWaR(wwQ!w8aV&p( zeQWDt=!veo@Y?P*ltI&nsjSK1L!!)aJ-S(Lg)~2)jdkE;-a1^y>q$YPRP~ZX6#Mrm zmgcoj@|7X`Kt3^+kvHuV!`#chDUKb$oqqhl_rF==8MJJiN-Zc>=p9n)?cNj&yt?Fx-Un%)T2qSmguXASF8nGYbIa3*V+kSD~$EoWa?>#7w zz9hsSH5@pDK}`?n#CxN?4uHdia7GR}AYN4wX!AJk2sr!<4*WFX!fXb;c|a$=r&38d zJf6qMfe|V*()FOUuoiR>X-($KX-aRqOVgS!lG9Ad;Dt)9Eqec8?H1Tuj~2$SxJ>zz zX6hmg6{ah^%03dCLl`PTms7GE`D>ZThUuv8A(WH3lBP8x{)Z&drc$zd6f6F~A)Of5 z-=Sp7H8RKHL% zeP%2g*hl;|;ToD>0&UtVGALfG46{b>qbRY>UY6D;L1j_>*z)Yw_Imp|`&2bTr;Ycj z_MqXUR`&V^EyUDOVWA-cMEM>#sYDq@efOzI=>b&((*Bq!#wlflEKN+M;xm_F`*Bh(JW+SyTIoVVEFwA3AgKahlpf|fzeFxs(fqZ{b*IaO$CwJ1u_Co-0 zLysFvIhDsZB~d5E5pwiNyCLQ9{AZ{3#DEY(^D~q_af*R%N%R(8=LcIuvnmK}@*D(? zh$Fe@5GQTkqc%6(MRBO>&psLOBzg{!k8aa(*+0dvJSRpGeR7(f^&5R`ft8S=xb}pF$&fuaKS~4=5k@x4tiM-XU z#D+h@IQ21_@x4mhYz5x`UvbLyp<;uIo`ipo^)<9@#qVk^!k6NlJJTtMf6lvw zYhd_V_W0sffkwc4pXC0l^A=FKbGn}X44rp^MO``6ABDsvO$;taX54<44p}{6b3VAt zc}`J|BsxuMa{JOy<>DerZa|)uG_d2Z1Zn6j0dQ$G@N6zhj4c&c2U&J?j*ZRaMLuxPn8K~)CCo&;JG<3L!Qxkej z@i=teh|^FvoZHUOeIuCFHGJ)A`ZiWN{&*KFYfNfpN-H)UGr@h1I~kBEa<^+y8h#X- zD@O@@o%%H=+ki3_mgFxXpHW{g4H@jIX+SQ07InX|eez~*EKz&jFG*lZa9lVF_?m$jo7UTOjf7}VA zx9a($LGe<1eosuYB&of#Aob0z8gl;!O+&>6*AbxCn$w+Z$`WTBVLAQs%u(vMm?QH1 zB6^T~nV&^A@?`~*#@SK;+J{p99YQ8$OYz1QN|`&79M9HyG2InWO2{a(JqO`r{T%Tl zP*>f~cITlGIstd&RJUs^gPt0rsVDT>f?{sHj1Bt^_^(hmKesc4QimSCZxle*p z^jMhToyMv_ z@37NhEV=V-x6@n(eV;4c$7FK_g_*7)Ev|^Gq%}hvZRkrIv@Cv!CuS{~e?`2&?1Acm z-38R;Zj-87!kwW&=}G%+sXkU$QACG5q}f%Sdo${_<01za{e}wc!yn&87RPIZ=v;`u z$*}&?rtdb&Vt)cjzA7277!;#{`!r-kq6XiDhS^&f3k|~i8t5w+9X_0>v2IZ{)K{pE zp2$@EEDmaj%>j+dlK;e)q*A8skm!8~h4nk2u_XaF#1X!IuBzo`=<6En;;!I@=6+bn z;2}J*#iW~j9gON96&b}|mliEfgI>$(1i5ovs-NWzP&%C=O>gMDS>9ok;*?69@8Wx^ z=o`|<4hJYXCXJCF-Vndp|G}w8=U7NZPfj)Fq#AjVLFZi%Yaw`7-P4DsEeC!$@Gz<3 z_iHA@FS{vSVwQLlCAQ9HZ1~>J_zJ^2=c4-EG_z;xb)Fy?4dkgXp`RW-k1}niM0&HRV(+z;BwXXUft>bqr^Y8j9hRZ8xb4sOI=bDO^epcY3y86+g4Ym(?;VC?)-?}9S;@W#V9et zRjVSgX!^`g2IYfI`z9=H8U7=v?44`lqx6%QeboX3RZ~*)0oXM602|qEsxMu~?L_4p zVJPOu1}{&FR}+r{@$`@JjlzT&NH_)(@`FHqF9w~4d(fD0Q3VjLq9r4rE)ciBM>foR zW`lz0%@VxE&wNXvtzBq0>X6W>fOZEC)yiqyR!ds6(K-trE?|f5IrVrBu=LI~-l4v> zhxR+d4eZ-%*+YXuhOUVn%?_i!fe?cqo-%O54>H&j%ZEB!!Ld4qo}apdq&|jYUFt-9 zAByq~yq0Y>1KC}mW6_-?;O^O{rU7P#BrAB>6&p~ z?%$W;KXj8G({XtWt2qp$WHo6sKx;)tJeJ&T3Qc=An5=v(h2O~ndMKsnNXcWVldyUM zp!G1BY%XX+aLz^ZUIes5?b6JuYGddK8E;1HQlzGm3|>ZsqqU@Xl-5OXTEU2uwz$^) z9d+4`KNqe}Y2&oy@>p#{5@Ie6k(WEnSrQ2k`3WAmR8 zqnZV#24V3sOzTLr$RGWTgcNK%pHL@7m3ukT?}T7pkx%Vn~~E2?#o z-0hXLWf4NjcaAf3!Yj#Ymniw_DMtQu63vKCvz@30Zf{F%lMaC+pesJw#$)Ei_=YpQ zSR7TB1ob>mZ(+I$(fQ4x&8duY_*vNX>OS%1i#aW_UbTlhvQbTb>-gt$G9IrVyq2mu z=ryD)N|)2{iblHDj0}4v&M8w{b?e~|bEaTe!^A@IGr7nzHM^j6tTx}dPt^cl4+iG< z))F%rKCnbwvdYhLT}>PPQ`C=N-D;dep&lfqMBK4^nmntcFJP6Z8m};qD-_D^SN?FZ z%^bQ@MIRdH+th_?6y;9BOC`UGEJeL9-ee-ZzM*xfzH=aK1bf{lwr_N6W#|^Ugw9fwzlll2%hs0!i?{_2V<7hfmrJ+KdSmn#tk`wpQE!KW3Stk*j z7ahkv)EcHo6GN-*P}IJ*^xJu;ayo48%5jW-NJ8I=t6omtLkGsA%nb-(wH#{LbCUX2 zoOd|9md{ok_m>9p4mPJ~=L#urDT1#FRYq1{sPLg*H=(VPn67o*h%2?=+ zvnaCPXDu08u5}_7?Hw zva3ttzZ384DV(WmNBe{$@Iiicqtr~yP{+*9g4~rQDS{+Met2I(;O6i_iX?qMfIhvh zNS}iLu^L5E`d1qR-HbTe*eP~cbUi-}v_bK|pb5Bgnr@|5=F*kvw1QtHjF}oa1C1+a zY}HDxw=-lgRqO*rlu@mA6%zI2pEBv&kt|AY(?g{9|IyA?xDs6`rDSTBV*)foFT&wJ z2>9YJW*GKSGVqFzU}O;}(4EO`Z*ff5yomflzu-(q)%YMTc%*<;5%W(vJE6RVSK3UY zcYB!v>%ysF*;o<#%O_oZXX+*s#+9awfoybF(wW0_ zJC~E3a%q}YN;BsyC-pu{BeLITP-d?TvPN#ob#j zUx2)}g>?ENahpmhX|ZJ07hMY`ZVIKW-brrDlsaF*ZP!0`WbY9>2atXmB zV*M4d^W0-(%2!F8Efn7WgdG`n+|H47%n&W=9{0#66`Jo2uW(aT7u`{|9l4wftZRkj zUL7jHBkhVn$D_OzQe$2TdaVw(NnC|g8g1US^6!$;3TZgBsRX6Yz4Zt6O-SELX%lr4 zrCQw=s7aOLj*9hrT|@4`N{t1!U|47~CGu`wBLzJ*8FdY*e8=`aphb|5c#? z*B9DZkxdIl_;))~m(bnpLx{ZivE6hG1?sJGf!fSSUz=E#!_|l4 ztv!MN`oD{{Ex>V+lv!0}e65t=;Ax8FO zdo6v_R-U6Lj|>Z=t7gjG?`P4QHwHja0cc75rrSajdty^l??#f0@g!J|sa_1gD=AlZ z8zgG%)x_IaFLs*&_?M9dW_h4Hk-?Rc@BBsSrHpP*thIQj{jT&Jm_zELfY#7!T}+|) z&U_u-7&p<2-*R*|fd*}z$RHEFCu=P$DdmA%jH%v@aOapyY}(tv9aK>S)(MKgijbW_Q2(WWRQ&J$F}s!Aw8l2Q9sINJCPUc%O!>8(wh JwWbT`{|BuKzmEU_ delta 82796 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 diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index 8477d22d364..aae9a11b28c 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -1171,7 +1171,7 @@ bool BSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Collname = GetStringCatInfo(g, "Name", (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); Collname = GetStringCatInfo(g, "Tabname", Collname); - Options = GetStringCatInfo(g, "Colist", NULL); + Options = GetStringCatInfo(g, "Colist", Xcol ? "all" : NULL); Filter = GetStringCatInfo(g, "Filter", NULL); Pipe = GetBoolCatInfo("Pipeline", false); Driver = GetStringCatInfo(g, "Driver", NULL); @@ -1215,7 +1215,7 @@ PTDB BSONDEF::GetTable(PGLOBAL g, MODE m) if (Lrecl) { // Allocate the parse work memory - G = PlugInit(NULL, (size_t)Lrecl * (Pretty < 0 ? 2 : 4)); + G = PlugInit(NULL, (size_t)Lrecl * (Pretty < 0 ? 3 : 5)); } else { strcpy(g->Message, "LRECL is not defined"); return NULL; @@ -1249,6 +1249,7 @@ PTDB BSONDEF::GetTable(PGLOBAL g, MODE m) #endif // !MONGO_SUPPORT } // endif Driver + Pretty = 4; // Not a file } else if (Zipped) { #if defined(ZIP_SUPPORT) if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { @@ -1676,6 +1677,7 @@ BSONCOL::BSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) Xpd = false; Parsed = false; Warned = false; + Sgfy = false; } // end of BSONCOL constructor /***********************************************************************/ @@ -1695,6 +1697,7 @@ BSONCOL::BSONCOL(BSONCOL* col1, PTDB tdbp) : DOSCOL(col1, tdbp) Xpd = col1->Xpd; Parsed = col1->Parsed; Warned = col1->Warned; + Sgfy = col1->Sgfy; } // end of BSONCOL copy constructor /***********************************************************************/ @@ -1966,8 +1969,10 @@ PSZ BSONCOL::GetJpath(PGLOBAL g, bool proj) if (*p1 == '$') p1++; if (*p1 == '.') p1++; mgopath = PlugDup(g, p1); - } else + } else { + Sgfy = true; return NULL; + } // endif for (p1 = p2 = mgopath; *p1; p1++) if (i) { // Inside [] @@ -2005,6 +2010,7 @@ PSZ BSONCOL::GetJpath(PGLOBAL g, bool proj) case '*': if (*(p2 - 1) == '.' && !*(p1 + 1)) { p2--; // Suppress last :* + Sgfy = true; break; } // endif p2 @@ -2013,6 +2019,9 @@ PSZ BSONCOL::GetJpath(PGLOBAL g, bool proj) break; } // endswitch p1; + if (*(p2 - 1) == '.') + p2--; + *p2 = 0; return mgopath; } else diff --git a/storage/connect/tabbson.h b/storage/connect/tabbson.h index e9c5cc6477f..7f41bba6bd9 100644 --- a/storage/connect/tabbson.h +++ b/storage/connect/tabbson.h @@ -1,7 +1,7 @@ /*************** tabbson H Declares Source Code File (.H) **************/ -/* Name: tabbson.h Version 1.0 */ +/* Name: tabbson.h Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2020 */ +/* (C) Copyright to the author Olivier BERTRAND 2020 - 2021 */ /* */ /* This file contains the BSON classes declares. */ /***********************************************************************/ @@ -242,7 +242,8 @@ public: BSONCOL(BSONCOL* colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) { return Tbp->GetAmType(); } + virtual int GetAmType(void) { return Tbp->GetAmType(); } + virtual bool Stringify(void) { return Sgfy; } // Methods virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); @@ -270,6 +271,7 @@ protected: bool Xpd; // True for expandable column bool Parsed; // True when parsed bool Warned; // True when warning issued + bool Sgfy; // True if stringified }; // end of class BSONCOL /* -------------------------- TDBBSON class -------------------------- */ diff --git a/storage/connect/tabcmg.cpp b/storage/connect/tabcmg.cpp index f2ff721627c..1552bdde58a 100644 --- a/storage/connect/tabcmg.cpp +++ b/storage/connect/tabcmg.cpp @@ -1,6 +1,6 @@ /************** tabcmg C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabcmg Version 1.1 */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* PROGRAM NAME: tabcmg Version 1.2 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* This program are the C MongoDB class DB execution routines. */ /***********************************************************************/ @@ -84,69 +84,80 @@ bool CMGDISC::FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc, bcol.Cbn = false; - if (BSON_ITER_HOLDS_UTF8(iter)) { - bcol.Type = TYPE_STRING; - bcol.Len = strlen(bson_iter_utf8(iter, NULL)); - } else if (BSON_ITER_HOLDS_INT32(iter)) { - bcol.Type = TYPE_INT; - bcol.Len = 11; // bson_iter_int32(iter) - } else if (BSON_ITER_HOLDS_INT64(iter)) { - bcol.Type = TYPE_BIGINT; - bcol.Len = 22; // bson_iter_int64(iter) - } else if (BSON_ITER_HOLDS_DOUBLE(iter)) { - bcol.Type = TYPE_DOUBLE; - bcol.Len = 12; - bcol.Scale = 6; // bson_iter_double(iter) - } else if (BSON_ITER_HOLDS_DATE_TIME(iter)) { - bcol.Type = TYPE_DATE; - bcol.Len = 19; // bson_iter_date_time(iter) - } else if (BSON_ITER_HOLDS_BOOL(iter)) { - bcol.Type = TYPE_TINY; - bcol.Len = 1; - } else if (BSON_ITER_HOLDS_OID(iter)) { - bcol.Type = TYPE_STRING; - bcol.Len = 24; // bson_iter_oid(iter) - } else if (BSON_ITER_HOLDS_DECIMAL128(iter)) { - bcol.Type = TYPE_DECIM; - bcol.Len = 32; // bson_iter_decimal128(iter, &dec) - } else if (BSON_ITER_HOLDS_DOCUMENT(iter)) { - if (lvl < 0) - continue; - else if (lvl <= k) { + switch (bson_iter_type(iter)) { + case BSON_TYPE_UTF8: bcol.Type = TYPE_STRING; - bcol.Len = 512; - } else { - bson_iter_t child; + bcol.Len = strlen(bson_iter_utf8(iter, NULL)); + break; + case BSON_TYPE_INT32: + bcol.Type = TYPE_INT; + bcol.Len = 11; // bson_iter_int32(iter) + break; + case BSON_TYPE_INT64: + bcol.Type = TYPE_BIGINT; + bcol.Len = 22; // bson_iter_int64(iter) + break; + case BSON_TYPE_DOUBLE: + bcol.Type = TYPE_DOUBLE; + bcol.Len = 12; + bcol.Scale = 6; // bson_iter_double(iter) + break; + case BSON_TYPE_DATE_TIME: + bcol.Type = TYPE_DATE; + bcol.Len = 19; // bson_iter_date_time(iter) + break; + case BSON_TYPE_BOOL: + bcol.Type = TYPE_TINY; + bcol.Len = 1; + break; + case BSON_TYPE_OID: + bcol.Type = TYPE_STRING; + bcol.Len = 24; // bson_iter_oid(iter) + break; + case BSON_TYPE_DECIMAL128: + bcol.Type = TYPE_DECIM; + bcol.Len = 32; // bson_iter_decimal128(iter, &dec) + break; + case BSON_TYPE_DOCUMENT: + if (lvl < 0) + continue; + else if (lvl <= k) { + bcol.Type = TYPE_STRING; + bcol.Len = 512; + } else { + bson_iter_t child; - if (bson_iter_recurse(iter, &child)) - if (FindInDoc(g, &child, NULL, colname, fmt, k + 1, false)) + if (bson_iter_recurse(iter, &child)) + if (FindInDoc(g, &child, NULL, colname, fmt, k + 1, false)) + return true; + + newcol = false; + } // endif lvl + + break; + case BSON_TYPE_ARRAY: + if (lvl < 0) + continue; + else if (lvl <= k) { + bcol.Type = TYPE_STRING; + bcol.Len = 512; + } else { + bson_t* arr; + bson_iter_t itar; + const uint8_t* data = NULL; + uint32_t len = 0; + + bson_iter_array(iter, &len, &data); + arr = bson_new_from_data(data, len); + + if (FindInDoc(g, &itar, arr, colname, fmt, k + 1, !all)) return true; - newcol = false; - } // endif lvl + newcol = false; + } // endif lvl - } else if (BSON_ITER_HOLDS_ARRAY(iter)) { - if (lvl < 0) - continue; - else if (lvl <= k) { - bcol.Type = TYPE_STRING; - bcol.Len = 512; - } else { - bson_t *arr; - bson_iter_t itar; - const uint8_t *data = NULL; - uint32_t len = 0; - - bson_iter_array(iter, &len, &data); - arr = bson_new_from_data(data, len); - - if (FindInDoc(g, &itar, arr, colname, fmt, k + 1, !all)) - return true; - - newcol = false; - } // endif lvl - - } // endif's + break; + } // endswitch iter if (newcol) AddColumn(g, colname, fmt, k); @@ -178,6 +189,7 @@ TDBCMG::TDBCMG(MGODEF *tdp) : TDBEXT(tdp) Pcg.Coll_name = tdp->Tabname; Pcg.Options = tdp->Colist; Pcg.Filter = tdp->Filter; + Pcg.Line = NULL; Pcg.Pipe = tdp->Pipe && tdp->Colist != NULL; B = tdp->Base ? 1 : 0; } else { @@ -186,6 +198,7 @@ TDBCMG::TDBCMG(MGODEF *tdp) : TDBEXT(tdp) Pcg.Coll_name = NULL; Pcg.Options = NULL; Pcg.Filter = NULL; + Pcg.Line = NULL; Pcg.Pipe = false; B = 0; } // endif tdp @@ -381,7 +394,21 @@ MGOCOL::MGOCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBCMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Jpath = cdp->GetFmt() ? cdp->GetFmt() : cdp->GetName(); + Sgfy = false; + + if ((Jpath = cdp->GetFmt())) { + int n = strlen(Jpath) - 1; + + if (Jpath[n] == '*') { + Jpath = PlugDup(g, cdp->GetFmt()); + if (Jpath[n - 1] == '.') n--; + Jpath[n] = 0; + Sgfy = true; + } // endif Jpath + + } else + Jpath = cdp->GetName(); + } // end of MGOCOL constructor /***********************************************************************/ @@ -392,6 +419,7 @@ MGOCOL::MGOCOL(MGOCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { Tmgp = col1->Tmgp; Jpath = col1->Jpath; + Sgfy = col1->Sgfy; } // end of MGOCOL copy constructor /***********************************************************************/ @@ -419,6 +447,9 @@ PSZ MGOCOL::GetJpath(PGLOBAL g, bool proj) } else *p2++ = *p1; + if (*(p2 - 1) == '.') + p2--; + *p2 = 0; return projpath; } else diff --git a/storage/connect/tabcmg.h b/storage/connect/tabcmg.h index 260f2def8a2..44448590da1 100644 --- a/storage/connect/tabcmg.h +++ b/storage/connect/tabcmg.h @@ -1,7 +1,7 @@ /**************** tabcmg H Declares Source Code File (.H) **************/ -/* Name: tabcmg.h Version 1.2 */ +/* Name: tabcmg.h Version 1.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* */ /* This file contains the MongoDB classes declares. */ /***********************************************************************/ @@ -96,6 +96,7 @@ public: // Implementation virtual int GetAmType(void) { return Tmgp->GetAmType(); } + virtual bool Stringify(void) { return Sgfy; } // Methods virtual PSZ GetJpath(PGLOBAL g, bool proj); @@ -109,6 +110,7 @@ protected: // Members TDBCMG *Tmgp; // To the MGO table block char *Jpath; // The json path + bool Sgfy; // True if stringified }; // end of class MGOCOL /***********************************************************************/ diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index 850d9e5fa9b..300091f78ad 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -384,7 +384,7 @@ int TDBJMG::WriteDB(PGLOBAL g) int rc = RC_OK; if (Mode == MODE_INSERT) { - rc = Jcp->DocWrite(g); + rc = Jcp->DocWrite(g, NULL); } else if (Mode == MODE_DELETE) { rc = Jcp->DocDelete(g, false); } else if (Mode == MODE_UPDATE) { @@ -420,8 +420,21 @@ JMGCOL::JMGCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBJMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Jpath = cdp->GetFmt() ? cdp->GetFmt() : cdp->GetName(); -//Mbuf = NULL; + Sgfy = false; + + if ((Jpath = cdp->GetFmt())) { + int n = strlen(Jpath) - 1; + + if (Jpath[n] == '*') { + Jpath = PlugDup(g, cdp->GetFmt()); + if (Jpath[n - 1] == '.') n--; + Jpath[n] = 0; + Sgfy = true; + } // endif Jpath + + } else + Jpath = cdp->GetName(); + } // end of JMGCOL constructor /***********************************************************************/ @@ -432,7 +445,7 @@ JMGCOL::JMGCOL(JMGCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { Tmgp = col1->Tmgp; Jpath = col1->Jpath; -//Mbuf = col1->Mbuf; + Sgfy = col1->Sgfy; } // end of JMGCOL copy constructor /***********************************************************************/ @@ -442,7 +455,7 @@ PSZ JMGCOL::GetJpath(PGLOBAL g, bool proj) { if (Jpath) { if (proj) { - char *p1, *p2, *projpath = PlugDup(g, Jpath); + char* p1, * p2, * projpath = PlugDup(g, Jpath); int i = 0; for (p1 = p2 = projpath; *p1; p1++) @@ -460,6 +473,9 @@ PSZ JMGCOL::GetJpath(PGLOBAL g, bool proj) } else *p2++ = *p1; + if (*(p2 - 1) == '.') + p2--; + *p2 = 0; return projpath; } else diff --git a/storage/connect/tabjmg.h b/storage/connect/tabjmg.h index 5a637145cff..e8f08730b89 100644 --- a/storage/connect/tabjmg.h +++ b/storage/connect/tabjmg.h @@ -1,7 +1,7 @@ /**************** tabjmg H Declares Source Code File (.H) **************/ -/* Name: tabjmg.h Version 1.1 */ +/* Name: tabjmg.h Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* */ /* This file contains the MongoDB classes using the Java Driver. */ /***********************************************************************/ @@ -106,6 +106,7 @@ public: // Implementation virtual int GetAmType(void) {return Tmgp->GetAmType();} + virtual bool Stringify(void) { return Sgfy; } // Methods //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); @@ -123,7 +124,7 @@ protected: // Members TDBJMG *Tmgp; // To the MGO table block char *Jpath; // The json path -//char *Mbuf; // The Mini buffer + bool Sgfy; // True if stringified }; // end of class JMGCOL /***********************************************************************/ diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index dee4b737a89..dfcf3ee2d4f 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -178,7 +178,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) lvl = GetIntegerTableOption(g, topt, "Depth", lvl); sep = GetStringTableOption(g, topt, "Separator", "."); strfy = GetStringTableOption(g, topt, "Stringify", NULL); - sz = GetIntegerTableOption(g, topt, "Jsize", 250); + sz = GetIntegerTableOption(g, topt, "Jsize", 1024); limit = GetIntegerTableOption(g, topt, "Limit", 10); /*********************************************************************/ @@ -647,7 +647,7 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Collname = GetStringCatInfo(g, "Name", (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); Collname = GetStringCatInfo(g, "Tabname", Collname); - Options = GetStringCatInfo(g, "Colist", NULL); + Options = GetStringCatInfo(g, "Colist", Xcol ? "all" : NULL); Filter = GetStringCatInfo(g, "Filter", NULL); Pipe = GetBoolCatInfo("Pipeline", false); Driver = GetStringCatInfo(g, "Driver", NULL); @@ -716,6 +716,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) #endif // !MONGO_SUPPORT } // endif Driver + Pretty = 4; // Not a file } else if (Zipped) { #if defined(ZIP_SUPPORT) if (m == MODE_READ || m == MODE_ANY || m == MODE_ALTER) { @@ -761,7 +762,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) G->jump_level = 0; ((TDBJSN*)tdbp)->G = G; #endif // 0 - ((TDBJSN*)tdbp)->G = PlugInit(NULL, (size_t)Lrecl * (Pretty >= 0 ? 10 : 2)); + ((TDBJSN*)tdbp)->G = PlugInit(NULL, (size_t)Lrecl * (Pretty >= 0 ? 12 : 4)); } else { strcpy(g->Message, "LRECL is not defined"); return NULL; @@ -1277,6 +1278,7 @@ JSONCOL::JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) Xpd = false; Parsed = false; Warned = false; + Sgfy = false; } // end of JSONCOL constructor /***********************************************************************/ @@ -1296,6 +1298,7 @@ JSONCOL::JSONCOL(JSONCOL *col1, PTDB tdbp) : DOSCOL(col1, tdbp) Xpd = col1->Xpd; Parsed = col1->Parsed; Warned = col1->Warned; + Sgfy = col1->Sgfy; } // end of JSONCOL copy constructor /***********************************************************************/ @@ -1568,8 +1571,10 @@ PSZ JSONCOL::GetJpath(PGLOBAL g, bool proj) if (*p1 == '$') p1++; if (*p1 == '.') p1++; mgopath = PlugDup(g, p1); - } else + } else { + Sgfy = true; return NULL; + } // endif for (p1 = p2 = mgopath; *p1; p1++) if (i) { // Inside [] @@ -1607,6 +1612,7 @@ PSZ JSONCOL::GetJpath(PGLOBAL g, bool proj) case '*': if (*(p2 - 1) == '.' && !*(p1 + 1)) { p2--; // Suppress last :* + Sgfy = true; break; } // endif p2 @@ -1615,6 +1621,9 @@ PSZ JSONCOL::GetJpath(PGLOBAL g, bool proj) break; } // endswitch p1; + if (*(p2 - 1) == '.') + p2--; + *p2 = 0; return mgopath; } else @@ -2127,10 +2136,14 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (Nodes[Nod-1].Op == OP_XX) { s = Value->GetCharValue(); - if (!(jsp = ParseJson(G, s, strlen(s)))) { - strcpy(g->Message, s); - throw 666; - } // endif jsp + if (s && *s) { + if (!(jsp = ParseJson(G, s, strlen(s)))) { + strcpy(g->Message, s); + throw 666; + } // endif jsp + + } else + jsp = NULL; if (arp) { if (Nod > 1 && Nodes[Nod-2].Op == OP_EQ) @@ -2560,8 +2573,8 @@ int TDBJSON::WriteDB(PGLOBAL g) if (Mode == MODE_INSERT) { Doc->AddArrayValue(g, vp); Row = new(g) JOBJECT; - } else if (Doc->SetArrayValue(g, vp, Fpos)) - return RC_FX; + } else + Doc->SetArrayValue(g, vp, Fpos); } else if (Jmode == MODE_ARRAY) { PJVAL vp = new(g) JVALUE(Row); @@ -2569,15 +2582,15 @@ int TDBJSON::WriteDB(PGLOBAL g) if (Mode == MODE_INSERT) { Doc->AddArrayValue(g, vp); Row = new(g) JARRAY; - } else if (Doc->SetArrayValue(g, vp, Fpos)) - return RC_FX; + } else + Doc->SetArrayValue(g, vp, Fpos); } else { // if (Jmode == MODE_VALUE) if (Mode == MODE_INSERT) { Doc->AddArrayValue(g, (PJVAL)Row); Row = new(g) JVALUE; - } else if (Doc->SetArrayValue(g, (PJVAL)Row, Fpos)) - return RC_FX; + } else + Doc->SetArrayValue(g, (PJVAL)Row, Fpos); } // endif Jmode diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 1062928d410..523015c66b2 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -216,7 +216,8 @@ public: JSONCOL(JSONCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return Tjp->GetAmType();} + virtual int GetAmType(void) {return Tjp->GetAmType();} + virtual bool Stringify(void) { return Sgfy; } // Methods virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); @@ -251,6 +252,7 @@ public: bool Xpd; // True for expandable column bool Parsed; // True when parsed bool Warned; // True when warning issued + bool Sgfy; // True if stringified }; // end of class JSONCOL /* -------------------------- TDBJSON class -------------------------- */ From 2294f9de8d939688b2ca34858ce72eecb19fb472 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 2 May 2021 11:03:21 +0200 Subject: [PATCH 02/98] Fix compile warning as error --- storage/connect/cmgoconn.cpp | 10 +++++----- storage/connect/ha_connect.cc | 6 +++--- storage/connect/json.h | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 7aa35253514..cd2a8b63cdb 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -250,16 +250,16 @@ int CMgoConn::CollSize(PGLOBAL g) } else query = bson_new(); -#if defined(NDEBUG) - cnt = (int)mongoc_collection_count(Collection, - MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error); -#else +#if defined(DEVELOPMENT) if (jf) cnt = (int)mongoc_collection_count_documents(Collection, query, NULL, NULL, NULL, &Error); else cnt = (int)mongoc_collection_estimated_document_count( - Collection, NULL, NULL, NULL, &Error); + Collection, NULL, NULL, NULL, &Error); +#else + cnt = (int)mongoc_collection_count(Collection, + MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error); #endif if (cnt < 0) { diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index f85035d6e06..041c29dc111 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -170,9 +170,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.07.0002 March 22, 2021"; + char version[]= "Version 1.07.0003 March 22, 2021"; #if defined(__WIN__) - char compver[]= "Version 1.07.0002 " __DATE__ " " __TIME__; + char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; @@ -7511,7 +7511,7 @@ maria_declare_plugin(connect) 0x0107, /* version number (1.07) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.07.0002", /* string version */ + "1.07.0003", /* string version */ MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/json.h b/storage/connect/json.h index ef5f6c7b7de..26b73faef12 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -66,6 +66,7 @@ const char* GetFmt(int type, bool un); PJSON ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL); PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); DllExport bool IsNum(PSZ s); +bool IsArray(PSZ s); /***********************************************************************/ /* Class JDOC. The class for parsing and serializing json documents. */ From 3b5dabeb96167c35df66475c5cb9be083065e941 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 2 May 2021 11:59:54 +0200 Subject: [PATCH 03/98] Typo --- storage/connect/ha_connect.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 041c29dc111..583e4f94e91 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -170,7 +170,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.07.0003 March 22, 2021"; + char version[]= "Version 1.07.0003 April 02, 2021"; #if defined(__WIN__) char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__; char slash= '\\'; From 5ae67c6d6387fa6e5c207fd9aea6741fb78073a5 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 5 May 2021 00:31:21 +0200 Subject: [PATCH 04/98] - All this concern Json or Mongo tables based on MongoDB collections. - Limit decimals of doubles printed from MongoDB Done in function Mini for Mongo C Driver and Java Driver Done in function SerializeValue for Java tables using the J Driver modified: storage/connect/cmgoconn.cpp modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/tabjmg.cpp - Fix crash when using BSON_TYPE_DECIMAL128 modified: storage/connect/cmgoconn.cpp - Collection name default to table name Fix it when creating tables via discovery modified: storage/connect/ha_connect.cc modified: storage/connect/tabbson.cpp modified: storage/connect/tabjson.cpp --- storage/connect/cmgoconn.cpp | 58 +++++++++++++++++++++++++---------- storage/connect/ha_connect.cc | 7 +++-- storage/connect/json.cpp | 5 +-- storage/connect/json.h | 4 +-- storage/connect/tabbson.cpp | 3 +- storage/connect/tabjmg.cpp | 1 + storage/connect/tabjson.cpp | 3 +- 7 files changed, 53 insertions(+), 28 deletions(-) diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index cd2a8b63cdb..91952ab0706 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -26,6 +26,7 @@ bool CMgoConn::IsInit = false; bool IsArray(PSZ s); bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s); +int GetDefaultPrec(void); /* --------------------------- Class INCOL --------------------------- */ @@ -563,7 +564,7 @@ void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k) htrc("%s.%s=%s\n", k, key, str); } break; case BSON_TYPE_DECIMAL128: { - char* str = NULL; + char str[BSON_DECIMAL128_STRING]; bson_decimal128_t dec; bson_iter_decimal128(iter, &dec); @@ -805,23 +806,51 @@ void CMgoConn::Close(void) /***********************************************************************/ char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b) { - char *s, *str = NULL; - char *Mbuf = (char*)PlugSubAlloc(g, NULL, (size_t)colp->GetLength() + 1); - int i, k = 0; - bool ok = true; + char *s, *str = NULL; + char *Mbuf = (char*)PlugSubAlloc(g, NULL, (size_t)colp->GetLength() + 1); + int i, j = 0, k = 0, n = 0, m = GetDefaultPrec(); + bool ok = true, dbl = false; + double d; + size_t len; if (b) - s = str = bson_array_as_json(bson, NULL); + s = str = bson_array_as_json(bson, &len); else - s = str = bson_as_json(bson, NULL); + s = str = bson_as_json(bson, &len); + + if (len > (size_t)colp->GetLength()) { + sprintf(g->Message, "Value too long for column %s", colp->GetName()); + bson_free(str); + throw (int)TYPE_AM_MGO; + } // endif len for (i = 0; i < colp->GetLength() && s[i]; i++) { switch (s[i]) { case ' ': if (ok) continue; + break; case '"': ok = !ok; + break; + case '.': + if (j) dbl = true; + break; default: + if (ok) { + if (isdigit(s[i])) { + if (!j) j = k; + if (dbl) n++; + } else if (dbl && n > m) { + Mbuf[k] = 0; + d = atof(Mbuf + j); + n = sprintf(Mbuf + j, "%.*f", m, d); + k = j + n; + j = n = 0; + } else if (j) + j = n = 0; + + } // endif ok + break; } // endswitch s[i] @@ -830,11 +859,6 @@ char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b) bson_free(str); - if (i >= colp->GetLength()) { - sprintf(g->Message, "Value too long for column %s", colp->GetName()); - throw (int)TYPE_AM_MGO; - } // endif i - Mbuf[k] = 0; return Mbuf; } // end of Mini @@ -926,13 +950,13 @@ void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp) value->SetNull(true); break; case BSON_TYPE_DECIMAL128: { - char* str = NULL; + char str[BSON_DECIMAL128_STRING]; bson_decimal128_t dec; bson_iter_decimal128(&Desc, &dec); bson_decimal128_to_string(&dec, str); value->SetValue_psz(str); - bson_free(str); +// bson_free(str); } break; default: value->Reset(); @@ -956,10 +980,10 @@ bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd) PVAL value = colp->GetValue(); if (value->IsNull()) { - if (upd) +// if (upd) rc = BSON_APPEND_NULL(doc, key); - else - return false; +// else +// return false; } else switch (colp->GetResultType()) { case TYPE_STRING: diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 583e4f94e91..5f210f649f5 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -170,7 +170,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.07.0003 April 02, 2021"; + char version[]= "Version 1.07.0003 May 02, 2021"; #if defined(__WIN__) char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__; char slash= '\\'; @@ -5940,9 +5940,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (!fn && !zfn && !mul && !dsn) sprintf(g->Message, "Missing %s file name", topt->type); - else - ok= true; + else if (dsn && !topt->tabname) + topt->tabname= tab; + ok= true; break; #if defined(JAVA_SUPPORT) case TAB_MONGO: diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index b1f9f10957b..b376a8c5c27 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -245,6 +245,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { try { jdp = new(g) JDOC; // MUST BE ALLOCATED BEFORE jp !!!!! + jdp->dfp = GetDefaultPrec(); if (!jsp) { strcpy(g->Message, "Null json tree"); @@ -1005,8 +1006,8 @@ bool JDOC::SerializeValue(PJVAL jvp) case TYPE_BINT: sprintf(buf, "%lld", jvp->LLn); return js->WriteStr(buf); - case TYPE_DBL: - sprintf(buf, "%.*lf", jvp->Nd, jvp->F); + case TYPE_DBL: // dfp to limit to the default number of decimals + sprintf(buf, "%.*f", MY_MIN(jvp->Nd, dfp), jvp->F); return js->WriteStr(buf); case TYPE_NULL: return js->WriteStr("null"); diff --git a/storage/connect/json.h b/storage/connect/json.h index 26b73faef12..566cb64cc23 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -75,7 +75,7 @@ class JDOC: public BLOCK { friend PJSON ParseJson(PGLOBAL, char*, size_t, int*, bool*); friend PSZ Serialize(PGLOBAL, PJSON, char*, int); public: - JDOC(void) : js(NULL), s(NULL), len(0), pty(NULL) {} + JDOC(void) : js(NULL), s(NULL), len(0), dfp(0), pty(NULL) {} void SetJp(JOUT* jp) { js = jp; } @@ -94,7 +94,7 @@ public: private: JOUT* js; char *s; - int len; + int len, dfp; bool *pty; }; // end of class JDOC diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index aae9a11b28c..d36b9718cd6 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -218,8 +218,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) if (tdp->Uri) { #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) - tdp->Collname = GetStringTableOption(g, topt, "Name", NULL); - tdp->Collname = GetStringTableOption(g, topt, "Tabname", tdp->Collname); + tdp->Collname = GetStringTableOption(g, topt, "Tabname", NULL); tdp->Schema = GetStringTableOption(g, topt, "Dbname", "test"); tdp->Options = (PSZ)GetStringTableOption(g, topt, "Colist", "all"); tdp->Pipe = GetBooleanTableOption(g, topt, "Pipeline", false); diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index 300091f78ad..b02bf6a7f36 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -505,6 +505,7 @@ char *JMGCOL::Mini(PGLOBAL g, const bson_t *bson, bool b) switch (s[i]) { case ' ': if (ok) continue; + break; case '"': ok = !ok; default: diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index dfcf3ee2d4f..4a8031113d2 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -222,8 +222,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) if (tdp->Uri) { #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) - tdp->Collname = GetStringTableOption(g, topt, "Name", NULL); - tdp->Collname = GetStringTableOption(g, topt, "Tabname", tdp->Collname); + tdp->Collname = GetStringTableOption(g, topt, "Tabname", NULL); tdp->Schema = GetStringTableOption(g, topt, "Dbname", "test"); tdp->Options = (PSZ)GetStringTableOption(g, topt, "Colist", "all"); tdp->Pipe = GetBooleanTableOption(g, topt, "Pipeline", false); From 17533c1ffc018b410d5fe01a54c225d4fc7f75cd Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 17 May 2021 19:17:31 +0200 Subject: [PATCH 05/98] - Put all jar files in the SHARE directory (was PLUGIN) modified: sql/mysqld.h modified: storage/connect/CMakeLists.txt modified: storage/connect/javaconn.cpp modified: storage/connect/mycat.cc modified: storage/connect/mycat.h - Get a handled on a not pooled client This to avoid a .50 delay when closing modified: storage/connect/cmgoconn.cpp modified: storage/connect/cmgoconn.h - Allow FIELD_FORMAT options for DECIMAL type modified: storage/connect/tabdos.cpp - Update tests and result to reflect last changes Also because Oracle password has changed modified: storage/connect/mysql-test/connect/r/jdbc_oracle.result modified: storage/connect/mysql-test/connect/r/json_java_2.result modified: storage/connect/mysql-test/connect/r/json_java_3.result modified: storage/connect/mysql-test/connect/r/json_mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_c.result modified: storage/connect/mysql-test/connect/r/odbc_oracle.result modified: storage/connect/mysql-test/connect/t/jdbc_oracle.test modified: storage/connect/mysql-test/connect/t/odbc_oracle.test - Typo modified: storage/connect/reldef.cpp --- sql/mysqld.h | 2 +- storage/connect/CMakeLists.txt | 4 +- storage/connect/cmgoconn.cpp | 22 ++++++-- storage/connect/cmgoconn.h | 2 +- storage/connect/javaconn.cpp | 16 ++---- storage/connect/mycat.cc | 9 ++++ storage/connect/mycat.h | 3 +- .../mysql-test/connect/r/jdbc_oracle.result | 8 +-- .../mysql-test/connect/r/json_java_2.result | 2 +- .../mysql-test/connect/r/json_java_3.result | 2 +- .../mysql-test/connect/r/json_mongo_c.result | 6 +-- .../mysql-test/connect/r/mongo_c.result | 36 ++++++------- .../mysql-test/connect/r/odbc_oracle.result | 38 +++++++------- .../mysql-test/connect/t/jdbc_oracle.test | 8 +-- .../mysql-test/connect/t/odbc_oracle.test | 30 +++++------ storage/connect/reldef.cpp | 3 +- storage/connect/tabdos.cpp | 51 ++++++++++++------- 17 files changed, 136 insertions(+), 106 deletions(-) diff --git a/sql/mysqld.h b/sql/mysqld.h index 64e5aef5946..44b0491f138 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -536,7 +536,7 @@ extern ulonglong my_pcre_frame_size; */ extern my_bool opt_large_pages; extern uint opt_large_page_size; -extern char lc_messages_dir[FN_REFLEN]; +extern MYSQL_PLUGIN_IMPORT char lc_messages_dir[FN_REFLEN]; extern char *lc_messages_dir_ptr, *log_error_file_ptr; extern MYSQL_PLUGIN_IMPORT char reg_ext[FN_EXTLEN]; extern MYSQL_PLUGIN_IMPORT uint reg_ext_length; diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 96b8d877ee0..d75c57a9b1b 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -410,12 +410,12 @@ IF(CONNECT_WITH_JDBC AND JAVA_FOUND AND JNI_FOUND) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar ${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar - DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) + DESTINATION ${INSTALL_MYSQLSHAREDIR} COMPONENT connect-engine) IF(CONNECT_WITH_MONGO) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Mongo2.jar ${CMAKE_CURRENT_SOURCE_DIR}/Mongo3.jar - DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) + DESTINATION ${INSTALL_MYSQLSHAREDIR} COMPONENT connect-engine) ENDIF() ENDIF() diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 91952ab0706..5a81799c4a2 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -123,11 +123,12 @@ CMgoConn::CMgoConn(PGLOBAL g, PCPARM pcg) { Pcg = pcg; Uri = NULL; - Pool = NULL; +//Pool = NULL; Client = NULL; Database = NULL; Collection = NULL; Cursor = NULL; + Document = NULL; Query = NULL; Opts = NULL; Fpc = NULL; @@ -179,6 +180,7 @@ bool CMgoConn::Connect(PGLOBAL g) return true; } // endif Uri +#if 0 // Create a new client pool instance Pool = mongoc_client_pool_new(Uri); mongoc_client_pool_set_error_api(Pool, 2); @@ -189,13 +191,24 @@ bool CMgoConn::Connect(PGLOBAL g) // Create a new client instance Client = mongoc_client_pool_pop(Pool); +#else + // Create a new client instance + Client = mongoc_client_new_from_uri (Uri); if (!Client) { sprintf(g->Message, "Failed to get Client"); return true; } // endif Client - // Get a handle on the collection Coll_name + // Register the application name so we can track it in the profile logs + // on the server. This can also be done from the URI (see other examples). + mongoc_client_set_appname (Client, "Connect"); + + // Get a handle on the database + // Database = mongoc_client_get_database (Client, Pcg->Db_name); +#endif // 0 + + // Get a handle on the collection Collection = mongoc_client_get_collection(Client, Pcg->Db_name, Pcg->Coll_name); if (!Collection) { @@ -794,8 +807,9 @@ void CMgoConn::Close(void) if (Opts) bson_destroy(Opts); if (Cursor) mongoc_cursor_destroy(Cursor); if (Collection) mongoc_collection_destroy(Collection); - if (Client) mongoc_client_pool_push(Pool, Client); - if (Pool) mongoc_client_pool_destroy(Pool); +//if (Client) mongoc_client_pool_push(Pool, Client); +//if (Pool) mongoc_client_pool_destroy(Pool); + if (Client) mongoc_client_destroy(Client); if (Uri) mongoc_uri_destroy(Uri); if (Fpc) Fpc->Destroy(); if (fp) fp->Count = 0; diff --git a/storage/connect/cmgoconn.h b/storage/connect/cmgoconn.h index 5c9fb4f763d..c69f53b366f 100644 --- a/storage/connect/cmgoconn.h +++ b/storage/connect/cmgoconn.h @@ -104,7 +104,7 @@ protected: // Members PCPARM Pcg; mongoc_uri_t *Uri; - mongoc_client_pool_t *Pool; // Thread safe client pool +//mongoc_client_pool_t *Pool; // Thread safe client pool mongoc_client_t *Client; // The MongoDB client mongoc_database_t *Database; // The MongoDB database mongoc_collection_t *Collection; // The MongoDB collection diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index 3737c82a02e..34b844f59b0 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -58,6 +58,7 @@ extern char *JvmPath; // The connect_jvm_path global variable value extern char *ClassPath; // The connect_class_path global variable value char *GetPluginDir(void); +char *GetMessageDir(void); char *GetJavaWrapper(void); // The connect_java_wrapper variable value /***********************************************************************/ @@ -400,24 +401,17 @@ bool JAVAConn::Open(PGLOBAL g) jpop->Append(ClassPath); } // endif ClassPath -#if 0 - // Java source will be compiled as a jar file installed in the plugin dir + // All wrappers are pre-compiled in JavaWrappers.jar in the share dir jpop->Append(sep); - jpop->Append(GetPluginDir()); - jpop->Append("JdbcInterface.jar"); -#endif // 0 - - // All wrappers are pre-compiled in JavaWrappers.jar in the plugin dir - jpop->Append(sep); - jpop->Append(GetPluginDir()); + jpop->Append(GetMessageDir()); jpop->Append("JavaWrappers.jar"); #if defined(MONGO_SUPPORT) jpop->Append(sep); - jpop->Append(GetPluginDir()); + jpop->Append(GetMessageDir()); jpop->Append("Mongo3.jar"); jpop->Append(sep); - jpop->Append(GetPluginDir()); + jpop->Append(GetMessageDir()); jpop->Append("Mongo2.jar"); #endif // MONGO_SUPPORT diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index e3fa00e119f..4a7e65eb01f 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -123,6 +123,15 @@ char *GetPluginDir(void) return opt_plugin_dir; } // end of GetPluginDir +/***********************************************************************/ +/* Get the lc_messages_dir, it is where error messages for various */ +/* languages are installed, and by default the INSTALL_MYSQLSHAREDIR. */ +/***********************************************************************/ +char *GetMessageDir(void) +{ + return lc_messages_dir; +} // end of GetMessageDir + /***********************************************************************/ /* Get a unique enum table type ID. */ /***********************************************************************/ diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index 6473f7a5c11..147148f4a57 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -78,7 +78,8 @@ struct ha_table_option_struct { typedef class ha_connect *PHC; -char *GetPluginDir(void); +char *GetPluginDir(void); +char *GetMessageDir(void); TABTYPE GetTypeID(const char *type); bool IsFileType(TABTYPE type); bool IsExactType(TABTYPE type); diff --git a/storage/connect/mysql-test/connect/r/jdbc_oracle.result b/storage/connect/mysql-test/connect/r/jdbc_oracle.result index d895a9aed87..21a2d10fef7 100644 --- a/storage/connect/mysql-test/connect/r/jdbc_oracle.result +++ b/storage/connect/mysql-test/connect/r/jdbc_oracle.result @@ -3,7 +3,7 @@ command varchar(128) not null, number int(5) not null flag=1, message varchar(255) flag=2) ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01,Execsrc=1'; +OPTION_LIST='User=system,Password=Biscote01,Execsrc=1'; SELECT * FROM t2 WHERE command = 'drop table employee'; command number message drop table employee 0 Execute: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist @@ -23,14 +23,14 @@ Warnings: Warning 1105 Affected rows CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01'; +OPTION_LIST='User=system,Password=Biscote01'; SELECT * FROM t1 WHERE table_name='employee'; Table_Cat Table_Schema Table_Name Table_Type Remark NULL SYSTEM EMPLOYEE TABLE NULL DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='EMPLOYEE' CATFUNC=columns CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01'; +OPTION_LIST='User=system,Password=Biscote01'; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks NULL SYSTEM EMPLOYEE ID 3 NUMBER 38 0 0 10 0 NULL @@ -42,7 +42,7 @@ CREATE SERVER 'oracle' FOREIGN DATA WRAPPER 'oracle.jdbc.driver.OracleDriver' OP HOST 'jdbc:oracle:thin:@localhost:1521:xe', DATABASE 'SYSTEM', USER 'system', -PASSWORD 'Choupy01', +PASSWORD 'Biscote01', PORT 0, SOCKET '', OWNER 'SYSTEM'); diff --git a/storage/connect/mysql-test/connect/r/json_java_2.result b/storage/connect/mysql-test/connect/r/json_java_2.result index e0b08889f40..c05501013a5 100644 --- a/storage/connect/mysql-test/connect/r/json_java_2.result +++ b/storage/connect/mysql-test/connect/r/json_java_2.result @@ -10,7 +10,7 @@ SELECT * from t1 limit 3; Document {"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":"2014-03-03T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-09-11T00:00:00.000Z"},"grade":"A","score":6},{"date":{"$date":"2013-01-24T00:00:00.000Z"},"grade":"A","score":10},{"date":{"$date":"2011-11-23T00:00:00.000Z"},"grade":"A","score":9},{"date":{"$date":"2011-03-10T00:00:00.000Z"},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} {"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":"2014-12-30T00:00:00.000Z"},"grade":"A","score":8},{"date":{"$date":"2014-07-01T00:00:00.000Z"},"grade":"B","score":23},{"date":{"$date":"2013-04-30T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2012-05-08T00:00:00.000Z"},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} DROP TABLE t1; # # Test catfunc diff --git a/storage/connect/mysql-test/connect/r/json_java_3.result b/storage/connect/mysql-test/connect/r/json_java_3.result index b9ba919507d..b74f92bfee2 100644 --- a/storage/connect/mysql-test/connect/r/json_java_3.result +++ b/storage/connect/mysql-test/connect/r/json_java_3.result @@ -10,7 +10,7 @@ SELECT * from t1 limit 3; Document {"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} {"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} DROP TABLE t1; # # Test catfunc diff --git a/storage/connect/mysql-test/connect/r/json_mongo_c.result b/storage/connect/mysql-test/connect/r/json_mongo_c.result index 6d4957167fc..008e41f63d1 100644 --- a/storage/connect/mysql-test/connect/r/json_mongo_c.result +++ b/storage/connect/mysql-test/connect/r/json_mongo_c.result @@ -8,9 +8,9 @@ ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localho OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8; SELECT * from t1 limit 3; Document -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} DROP TABLE t1; # # Test catfunc diff --git a/storage/connect/mysql-test/connect/r/mongo_c.result b/storage/connect/mysql-test/connect/r/mongo_c.result index 899a123dc5f..5b29bb54d3a 100644 --- a/storage/connect/mysql-test/connect/r/mongo_c.result +++ b/storage/connect/mysql-test/connect/r/mongo_c.result @@ -8,9 +8,9 @@ ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8; SELECT * from t1 limit 3; Document -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris ParkBakeShop", "restaurant_id":"30075445"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} -{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj ReynoldsPubAndRestaurant", "restaurant_id":"30191841"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000.000000},"grade":"A","score":2},{"date":{"$date":1378857600000.000000},"grade":"A","score":6},{"date":{"$date":1358985600000.000000},"grade":"A","score":10},{"date":{"$date":1322006400000.000000},"grade":"A","score":9},{"date":{"$date":1299715200000.000000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000.000000},"grade":"A","score":8},{"date":{"$date":1404172800000.000000},"grade":"B","score":23},{"date":{"$date":1367280000000.000000},"grade":"A","score":12},{"date":{"$date":1336435200000.000000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"} +{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000.000000},"grade":"A","score":2},{"date":{"$date":1374451200000.000000},"grade":"A","score":11},{"date":{"$date":1343692800000.000000},"grade":"A","score":12},{"date":{"$date":1325116800000.000000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"} DROP TABLE t1; # # Test catfunc @@ -76,11 +76,11 @@ t1 CREATE TABLE `t1` ( ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=C,Version=0' `DATA_CHARSET`='utf8' SELECT * FROM t1 LIMIT 5; _id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id -58ada47de5a51ddfcd5ed51c 1007 [-73.856076999999999089,40.848447000000000173] Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445 -58ada47de5a51ddfcd5ed51d 469 [-73.96170399999999745,40.66294200000000103] Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340 -58ada47de5a51ddfcd5ed51e 351 [-73.985135599999992451,40.767691900000002647] West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841 -58ada47de5a51ddfcd5ed51f 2780 [-73.982419999999990523,40.579504999999997494] Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018 -58ada47de5a51ddfcd5ed520 97-22 [-73.860115199999995639,40.731173900000001709] 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed51c 1007 [-73.856077,40.848447] Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d 469 [-73.961704,40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e 351 [-73.985136,40.767692] West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f 2780 [-73.982420,40.579505] Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 97-22 [-73.860115,40.731174] 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068 DROP TABLE t1; # # Dropping a column @@ -89,16 +89,16 @@ CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' ; SELECT * FROM t1 LIMIT 10; _id address borough cuisine name restaurant_id -58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445 -58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340 -58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 -58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982419999999990523,40.579504999999997494],"street":"Stillwell Avenue", "zipcode":"11224"} Brooklyn American Riviera Caterer 40356018 -58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115199999995639,40.731173900000001709],"street":"63 Road", "zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068 -58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880382699999998408,40.764312400000001446],"street":"Astoria Boulevard", "zipcode":"11369"} Queens American Brunos On The Boulevard 40356151 -58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137728600000002643,40.611957199999999091],"street":"Victory Boulevard", "zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442 -58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906850599999998508,40.619903399999998328],"street":"Avenue U", "zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483 -58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005288999999990551,40.628886000000001388],"street":"11 Avenue", "zipcode":"11219"} Brooklyn American Regina Caterers 40356649 -58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948260899999993967,40.640827100000002758],"street":"Nostrand Avenue", "zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 +58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445 +58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340 +58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 +58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982420,40.579505],"street":"Stillwell Avenue","zipcode":"11224"} Brooklyn American Riviera Caterer 40356018 +58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115,40.731174],"street":"63 Road","zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068 +58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880383,40.764312],"street":"Astoria Boulevard","zipcode":"11369"} Queens American Brunos On The Boulevard 40356151 +58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137729,40.611957],"street":"Victory Boulevard","zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442 +58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906851,40.619903],"street":"Avenue U","zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483 +58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005289,40.628886],"street":"11 Avenue","zipcode":"11219"} Brooklyn American Regina Caterers 40356649 +58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948261,40.640827],"street":"Nostrand Avenue","zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 DROP TABLE t1; # # Specifying Jpath diff --git a/storage/connect/mysql-test/connect/r/odbc_oracle.result b/storage/connect/mysql-test/connect/r/odbc_oracle.result index acb7d9a74c9..317aacef7a9 100644 --- a/storage/connect/mysql-test/connect/r/odbc_oracle.result +++ b/storage/connect/mysql-test/connect/r/odbc_oracle.result @@ -10,7 +10,7 @@ SET NAMES utf8; # All tables in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -20,7 +20,7 @@ NULL MTR V1 VIEW NULL DROP TABLE t1; # All tables in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -30,7 +30,7 @@ NULL MTR V1 VIEW NULL DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -38,7 +38,7 @@ NULL MTR T1 TABLE NULL DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -46,7 +46,7 @@ NULL MTR T1 TABLE NULL DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -54,7 +54,7 @@ NULL MTR T1 TABLE NULL DROP TABLE t1; # All tables in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='MTR.%'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Table_Type Remark @@ -68,7 +68,7 @@ DROP TABLE t1; # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks @@ -80,7 +80,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu DROP TABLE t1; # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks @@ -91,7 +91,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu MTR V1 B 6 NUMBER 38 40 NULL NULL 1 DROP TABLE t1; # All tables "T1" in all schemas (limited with WHERE) -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' CATFUNC=Columns TABNAME='%.T1'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks MTR T1 A 3 DECIMAL 38 40 0 10 1 @@ -99,7 +99,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks @@ -108,7 +108,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu DROP TABLE t1; # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks @@ -121,14 +121,14 @@ DROP TABLE t1; # Table "T1" in the default schema ("MTR") CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='T1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, `B` double DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='T1' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='T1' SELECT * FROM t1 ORDER BY A; A B 10 1000000000 @@ -157,14 +157,14 @@ DROP VIEW v1; DROP TABLE t1; # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.T1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, `B` double DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1' SELECT * FROM t1; A B 10 1000000000 @@ -173,14 +173,14 @@ A B DROP TABLE t1; # View "V1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.V1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` decimal(40,0) DEFAULT NULL, `B` double DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1' SELECT * FROM t1; A B 10 1000000000 @@ -209,13 +209,13 @@ DROP VIEW v1; DROP TABLE t1; # Table "T2" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.T2'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `A` varchar(64) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T2' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T2' SELECT * FROM t1; A test diff --git a/storage/connect/mysql-test/connect/t/jdbc_oracle.test b/storage/connect/mysql-test/connect/t/jdbc_oracle.test index 1316352d4f5..0a475102ff7 100644 --- a/storage/connect/mysql-test/connect/t/jdbc_oracle.test +++ b/storage/connect/mysql-test/connect/t/jdbc_oracle.test @@ -8,20 +8,20 @@ CREATE TABLE t2 ( number int(5) not null flag=1, message varchar(255) flag=2) ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01,Execsrc=1'; +OPTION_LIST='User=system,Password=Biscote01,Execsrc=1'; SELECT * FROM t2 WHERE command = 'drop table employee'; SELECT * FROM t2 WHERE command = 'create table employee (id int not null, name varchar(32), title char(16), salary number(8,2))'; SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'Engineer', 12560.50)"; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01'; +OPTION_LIST='User=system,Password=Biscote01'; SELECT * FROM t1 WHERE table_name='employee'; DROP TABLE t1; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='EMPLOYEE' CATFUNC=columns CONNECTION='jdbc:oracle:thin:@localhost:1521:xe' -OPTION_LIST='User=system,Password=Choupy01'; +OPTION_LIST='User=system,Password=Biscote01'; SELECT * FROM t1; DROP TABLE t1; @@ -32,7 +32,7 @@ CREATE SERVER 'oracle' FOREIGN DATA WRAPPER 'oracle.jdbc.driver.OracleDriver' OP HOST 'jdbc:oracle:thin:@localhost:1521:xe', DATABASE 'SYSTEM', USER 'system', -PASSWORD 'Choupy01', +PASSWORD 'Biscote01', PORT 0, SOCKET '', OWNER 'SYSTEM'); diff --git a/storage/connect/mysql-test/connect/t/odbc_oracle.test b/storage/connect/mysql-test/connect/t/odbc_oracle.test index 18d29f69f1a..2a6eb5b7fce 100644 --- a/storage/connect/mysql-test/connect/t/odbc_oracle.test +++ b/storage/connect/mysql-test/connect/t/odbc_oracle.test @@ -78,42 +78,42 @@ SET NAMES utf8; --echo # All tables in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='%.%'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Tables TABNAME='MTR.%'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; DROP TABLE t1; @@ -127,7 +127,7 @@ DROP TABLE t1; --echo # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns; # Disable warnings to avoid "Result limited to 20000 lines" --disable_warnings @@ -137,7 +137,7 @@ DROP TABLE t1; --echo # All columns in all schemas (limited with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.%'; # Disable warnings to avoid "Result limited to 20000 lines" --disable_warnings @@ -146,20 +146,20 @@ SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables "T1" in all schemas (limited with WHERE) -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' CATFUNC=Columns TABNAME='%.T1'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='MTR.T1'; SELECT * FROM t1 ORDER BY Table_Schema, Table_Name; DROP TABLE t1; --echo # All tables "T1" in all schemas (filtered with WHERE) CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1'; SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name; DROP TABLE t1; @@ -172,7 +172,7 @@ DROP TABLE t1; --echo # Table "T1" in the default schema ("MTR") CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='T1'; SHOW CREATE TABLE t1; SELECT * FROM t1 ORDER BY A; @@ -189,7 +189,7 @@ DROP TABLE t1; --echo # Table "T1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.T1'; SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -197,7 +197,7 @@ DROP TABLE t1; --echo # View "V1" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.V1'; SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -214,7 +214,7 @@ DROP TABLE t1; --echo # Table "T2" in the schema "MTR" CREATE TABLE t1 ENGINE=CONNECT -TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' +TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' TABNAME='MTR.T2'; SHOW CREATE TABLE t1; SELECT * FROM t1; diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 2d3c6a6aacd..bb25d4803d9 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -93,8 +93,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) if (check_valid_path(module, strlen(module))) { strcpy(g->Message, "Module cannot contain a path"); return NULL; - } - else + } else PlugSetPath(soname, module, GetPluginDir()); // The exported name is always in uppercase diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index 8c57157f5a9..6c42ab2c810 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -2535,6 +2535,7 @@ void DOSCOL::ReadColumn(PGLOBAL g) char *p = NULL; int i, rc; int field; + bool err = false; double dval; PTDBDOS tdbp = (PTDBDOS)To_Tdb; @@ -2578,33 +2579,39 @@ void DOSCOL::ReadColumn(PGLOBAL g) case TYPE_SHORT: case TYPE_TINY: case TYPE_BIGINT: - if (Value->SetValue_char(p, field - Dcm)) { - sprintf(g->Message, "Out of range value for column %s at row %d", - Name, tdbp->RowNumber(g)); - PushWarning(g, tdbp); - } // endif SetValue_char - + err = Value->SetValue_char(p, field - Dcm); break; case TYPE_DOUBLE: - Value->SetValue_char(p, field); - dval = Value->GetFloatValue(); + if (!(err = Value->SetValue_char(p, field))) { + dval = Value->GetFloatValue(); - for (i = 0; i < Dcm; i++) - dval /= 10.0; + for (i = 0; i < Dcm; i++) + dval /= 10.0; + + Value->SetValue(dval); + } // endif err - Value->SetValue(dval); break; default: - Value->SetValue_char(p, field); + err = Value->SetValue_char(p, field); + + if (!err && Buf_Type == TYPE_DECIM) { + char* s = Value->GetCharValue(); + + if (!(err = ((i = strlen(s)) >= Value->GetClen()))) { + for (int d = Dcm + 1; d; i--, d--) + s[i + 1] = s[i]; + + s[i + 1] = '.'; + } // endif err + + } // endif DECIM + break; - } // endswitch Buf_Type + } // endswitch Buf_Type else - if (Value->SetValue_char(p, field)) { - sprintf(g->Message, "Out of range value for column %s at row %d", - Name, tdbp->RowNumber(g)); - PushWarning(g, tdbp); - } // endif SetValue_char + err = Value->SetValue_char(p, field); break; default: @@ -2612,6 +2619,12 @@ void DOSCOL::ReadColumn(PGLOBAL g) throw 34; } // endswitch Ftype + if (err) { + sprintf(g->Message, "Out of range value for column %s at row %d", + Name, tdbp->RowNumber(g)); + PushWarning(g, tdbp); + } // endif err + // Set null when applicable if (Nullable) Value->SetNull(Value->IsZero()); @@ -2702,7 +2715,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) case TYPE_DECIM: strcpy(fmt, (Ldz) ? "%0*.*lf" : "%*.*lf"); len = field + ((Nod && Dcm) ? 1 : 0); - snprintf(Buf, len, fmt, len, Dcm, Value->GetFloatValue()); + snprintf(Buf, len + 1, fmt, len, Dcm, Value->GetFloatValue()); len = strlen(Buf); if (Nod && Dcm) From e0edfc277f564752720950159e8a7c2803df8ad3 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 18 May 2021 16:42:19 +0200 Subject: [PATCH 06/98] - Fix MDEV-25715 modified: storage/connect/bsonudf.cpp modified: storage/connect/jsonudf.cpp --- storage/connect/bsonudf.cpp | 6 +++--- storage/connect/jsonudf.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp index a56db4d731b..d3174580e7f 100644 --- a/storage/connect/bsonudf.cpp +++ b/storage/connect/bsonudf.cpp @@ -4682,7 +4682,7 @@ char *bfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result, str = (char*)g->Xchk; if (!str) { - PUSH_WARNING(g->Message ? g->Message : "Unexpected error"); + PUSH_WARNING(*g->Message ? g->Message : "Unexpected error"); *is_null = 1; *error = 1; *res_length = 0; @@ -4742,7 +4742,7 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { int msgid = MSGID_OPEN_MODE_STRERROR; - FILE *fout; + FILE *fout = NULL; FILE *fin; if (!(fin = global_fopen(g, msgid, fn, "rt"))) @@ -4805,7 +4805,7 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, str = (char*)g->Xchk; if (!str) { - if (g->Message) + if (*g->Message) str = strcpy(result, g->Message); else str = strcpy(result, "Unexpected error"); diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 7db01af2f2b..1f635002e7e 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -5943,7 +5943,7 @@ char *jfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result, str = (char*)g->Xchk; if (!str) { - PUSH_WARNING(g->Message ? g->Message : "Unexpected error"); + PUSH_WARNING(*g->Message ? g->Message : "Unexpected error"); *is_null = 1; *error = 1; *res_length = 0; @@ -6004,7 +6004,7 @@ char *jfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { int msgid = MSGID_OPEN_MODE_STRERROR; - FILE *fout; + FILE *fout = NULL; FILE *fin; if (!(fin = global_fopen(g, msgid, fn, "rt"))) @@ -6071,7 +6071,7 @@ char *jfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, str = (char*)g->Xchk; if (!str) { - if (g->Message) + if (*g->Message) str = strcpy(result, g->Message); else str = strcpy(result, "Unexpected error"); From be7e41db96b0a05b4896be875b8797089100b7b6 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 24 May 2021 16:56:12 +0200 Subject: [PATCH 07/98] - Mongo defined columns modified: storage/connect/cmgoconn.cpp modified: storage/connect/cmgoconn.h - Change default array LIMIT from 10 to 50 modified: storage/connect/ha_connect.cc modified: storage/connect/tabbson.cpp modified: storage/connect/tabjson.cpp modified: storage/connect/tabxml.cpp --- storage/connect/cmgoconn.cpp | 21 +++++++++++++++++---- storage/connect/cmgoconn.h | 1 + storage/connect/ha_connect.cc | 6 +++--- storage/connect/tabbson.cpp | 4 ++-- storage/connect/tabjson.cpp | 4 ++-- storage/connect/tabxml.cpp | 2 +- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 5a81799c4a2..6ab9e781994 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -300,6 +300,7 @@ void CMgoConn::Project(PGLOBAL g, PSTRG s) for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) { path = cp->GetJpath(g, true); + // Resolve path collision for (hp = php; hp; hp = hp->Next) { if (strlen(path) < strlen(hp->Path)) { n = strlen(path); @@ -318,6 +319,7 @@ void CMgoConn::Project(PGLOBAL g, PSTRG s) // New path hp = (PTHP)PlugSubAlloc(g, NULL, sizeof(PTH)); hp->Path = path; + hp->Name = cp->GetName(); hp->Next = NULL; *nphp = hp; nphp = &hp->Next; @@ -332,8 +334,16 @@ void CMgoConn::Project(PGLOBAL g, PSTRG s) else b = true; - s->Append(hp->Path); - s->Append("\":1"); + if (*hp->Path == '{') { + // This is a Mongo defined column + s->Append(hp->Name); + s->Append("\":"); + s->Append(hp->Path); + } else { + s->Append(hp->Path); + s->Append("\":1"); + } // endif Path + } // endfor hp } // end of Project @@ -885,9 +895,12 @@ void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp) char *jpath = colp->GetJpath(g, false); bool b = false; PVAL value = colp->GetValue(); - bson_iter_t Iter; // Used to retrieve column value - bson_iter_t Desc; // Descendant iter + bson_iter_t Iter; // Used to retrieve column value + bson_iter_t Desc; // Descendant iter + if (*jpath == '{') + jpath = colp->GetName(); // This is a Mongo defined column + if (!*jpath || !strcmp(jpath, "*")) { value->SetValue_psz(Mini(g, colp, Document, false)); } else if (bson_iter_init(&Iter, Document) && diff --git a/storage/connect/cmgoconn.h b/storage/connect/cmgoconn.h index c69f53b366f..f37a96cb7b9 100644 --- a/storage/connect/cmgoconn.h +++ b/storage/connect/cmgoconn.h @@ -44,6 +44,7 @@ typedef struct _path_list *PTHP; typedef struct _path_list { PSZ Path; + PSZ Name; PTHP Next; } PTH; diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 5f210f649f5..416bbb5d071 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -167,10 +167,10 @@ #define SZCONV 1024 // Default converted text size #define SZWORK 67108864 // Default work area size 64M #define SZWMIN 4194304 // Minimum work area size 4M -#define JSONMAX 10 // JSON Default max grp size +#define JSONMAX 50 // JSON Default max grp size extern "C" { - char version[]= "Version 1.07.0003 May 02, 2021"; + char version[]= "Version 1.07.0003 May 22, 2021"; #if defined(__WIN__) char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__; char slash= '\\'; @@ -508,7 +508,7 @@ char *GetJsonNull(void) int GetDefaultDepth(void) {return THDVAR(current_thd, default_depth);} int GetDefaultPrec(void) {return THDVAR(current_thd, default_prec);} uint GetJsonGrpSize(void) - {return connect_hton ? THDVAR(current_thd, json_grp_size) : 10;} + {return connect_hton ? THDVAR(current_thd, json_grp_size) : 50;} size_t GetWorkSize(void) {return (size_t)THDVAR(current_thd, work_size);} void SetWorkSize(size_t) { diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index d36b9718cd6..c6758b21707 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -173,7 +173,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) lvl = GetIntegerTableOption(g, topt, "Depth", lvl); sep = GetStringTableOption(g, topt, "Separator", "."); sz = GetIntegerTableOption(g, topt, "Jsize", 1024); - limit = GetIntegerTableOption(g, topt, "Limit", 10); + limit = GetIntegerTableOption(g, topt, "Limit", 50); strfy = GetStringTableOption(g, topt, "Stringify", NULL); /*********************************************************************/ @@ -1159,7 +1159,7 @@ bool BSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Objname = GetStringCatInfo(g, "Object", NULL); Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); - Limit = GetIntCatInfo("Limit", 10); + Limit = GetIntCatInfo("Limit", 50); Base = GetIntCatInfo("Base", 0) ? 1 : 0; Sep = *GetStringCatInfo(g, "Separator", "."); Accept = GetBoolCatInfo("Accept", false); diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 4a8031113d2..cad098e0f9b 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -179,7 +179,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) sep = GetStringTableOption(g, topt, "Separator", "."); strfy = GetStringTableOption(g, topt, "Stringify", NULL); sz = GetIntegerTableOption(g, topt, "Jsize", 1024); - limit = GetIntegerTableOption(g, topt, "Limit", 10); + limit = GetIntegerTableOption(g, topt, "Limit", 50); /*********************************************************************/ /* Open the input file. */ @@ -635,7 +635,7 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Objname = GetStringCatInfo(g, "Object", NULL); Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); - Limit = GetIntCatInfo("Limit", 10); + Limit = GetIntCatInfo("Limit", 50); Base = GetIntCatInfo("Base", 0) ? 1 : 0; Sep = *GetStringCatInfo(g, "Separator", "."); Accept = GetBoolCatInfo("Accept", false); diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 6065bb1b5d2..d7f199a8092 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -525,7 +525,7 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) XmlDB = GetStringCatInfo(g, "XmlDB", NULL); Nslist = GetStringCatInfo(g, "Nslist", NULL); DefNs = GetStringCatInfo(g, "DefNs", NULL); - Limit = GetIntCatInfo("Limit", 10); + Limit = GetIntCatInfo("Limit", 50); Xpand = GetBoolCatInfo("Expand", false); Header = GetIntCatInfo("Header", 0); GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); From 5f64276fb2bd4a400927105cf5d536b82e01fbd2 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 8 Jun 2021 17:44:43 +0200 Subject: [PATCH 08/98] - Fix MDEV-25863 : Replace __WIN__ by _WIN32 modified: storage/connect/array.cpp modified: storage/connect/blkfil.cpp modified: storage/connect/block.h modified: storage/connect/bson.cpp modified: storage/connect/cmgoconn.cpp modified: storage/connect/colblk.cpp modified: storage/connect/domdoc.cpp modified: storage/connect/filamap.cpp modified: storage/connect/filamdbf.cpp modified: storage/connect/filamfix.cpp modified: storage/connect/filamgz.cpp modified: storage/connect/filamtxt.cpp modified: storage/connect/filamvct.cpp modified: storage/connect/filamzip.cpp modified: storage/connect/filter.cpp modified: storage/connect/filter.h modified: storage/connect/fmdlex.c modified: storage/connect/global.h modified: storage/connect/ha_connect.cc modified: storage/connect/javaconn.cpp modified: storage/connect/javaconn.h modified: storage/connect/jdbconn.cpp modified: storage/connect/jmgfam.cpp modified: storage/connect/json.cpp modified: storage/connect/macutil.cpp modified: storage/connect/macutil.h modified: storage/connect/maputil.cpp modified: storage/connect/mycat.cc modified: storage/connect/myconn.cpp modified: storage/connect/myconn.h modified: storage/connect/myutil.cpp modified: storage/connect/odbconn.cpp modified: storage/connect/odbconn.h modified: storage/connect/os.h modified: storage/connect/osutil.c modified: storage/connect/plgdbsem.h modified: storage/connect/plgdbutl.cpp modified: storage/connect/plugutil.cpp modified: storage/connect/rcmsg.c modified: storage/connect/reldef.cpp modified: storage/connect/reldef.h modified: storage/connect/tabdos.cpp modified: storage/connect/tabext.cpp modified: storage/connect/tabfix.cpp modified: storage/connect/tabfmt.cpp modified: storage/connect/tabjdbc.cpp modified: storage/connect/tabmac.cpp modified: storage/connect/tabmac.h modified: storage/connect/tabmul.cpp modified: storage/connect/tabmul.h modified: storage/connect/tabmysql.cpp modified: storage/connect/taboccur.cpp modified: storage/connect/tabodbc.cpp modified: storage/connect/tabpivot.cpp modified: storage/connect/tabrest.cpp modified: storage/connect/tabrest.h modified: storage/connect/tabsys.cpp modified: storage/connect/tabtbl.cpp modified: storage/connect/tabutil.cpp modified: storage/connect/tabvct.cpp modified: storage/connect/tabwmi.cpp modified: storage/connect/tabxcl.cpp modified: storage/connect/tabxml.cpp modified: storage/connect/valblk.cpp modified: storage/connect/value.cpp modified: storage/connect/xindex.cpp modified: storage/connect/xindex.h - Fix Date errors and SSL warnings modified: storage/connect/mysql-test/connect/r/jdbc.result modified: storage/connect/mysql-test/connect/r/jdbc_new.result modified: storage/connect/mysql-test/connect/t/jdbc.test modified: storage/connect/mysql-test/connect/t/jdbc_new.test - Update java source files modified: storage/connect/Mongo2Interface.java modified: storage/connect/Mongo3Interface.java added: storage/connect/Client2.java added: storage/connect/Client3.java added: storage/connect/TestInsert2.java added: storage/connect/TestInsert3.java --- storage/connect/Client2.java | 130 ++++++++++++ storage/connect/Client3.java | 154 ++++++++++++++ storage/connect/Mongo2Interface.java | 136 +++++++++++-- storage/connect/Mongo3Interface.java | 190 ++++++++++++++---- storage/connect/TestInsert2.java | 131 ++++++++++++ storage/connect/TestInsert3.java | 131 ++++++++++++ storage/connect/array.cpp | 6 +- storage/connect/blkfil.cpp | 6 +- storage/connect/block.h | 6 +- storage/connect/bson.cpp | 2 +- storage/connect/cmgoconn.cpp | 6 +- storage/connect/colblk.cpp | 4 +- storage/connect/domdoc.cpp | 2 +- storage/connect/filamap.cpp | 16 +- storage/connect/filamdbf.cpp | 10 +- storage/connect/filamfix.cpp | 40 ++-- storage/connect/filamgz.cpp | 16 +- storage/connect/filamtxt.cpp | 26 +-- storage/connect/filamvct.cpp | 72 +++---- storage/connect/filamzip.cpp | 18 +- storage/connect/filter.cpp | 6 +- storage/connect/filter.h | 2 +- storage/connect/fmdlex.c | 4 +- storage/connect/global.h | 16 +- storage/connect/ha_connect.cc | 62 +++--- storage/connect/javaconn.cpp | 28 +-- storage/connect/javaconn.h | 10 +- storage/connect/jdbconn.cpp | 14 +- storage/connect/jmgfam.cpp | 6 +- storage/connect/json.cpp | 2 +- storage/connect/macutil.cpp | 6 +- storage/connect/macutil.h | 6 +- storage/connect/maputil.cpp | 2 +- storage/connect/mycat.cc | 22 +- storage/connect/myconn.cpp | 12 +- storage/connect/myconn.h | 12 +- .../connect/mysql-test/connect/r/jdbc.result | 18 +- .../mysql-test/connect/r/jdbc_new.result | 50 ++--- .../connect/mysql-test/connect/t/jdbc.test | 10 +- .../mysql-test/connect/t/jdbc_new.test | 32 +-- storage/connect/myutil.cpp | 6 +- storage/connect/odbconn.cpp | 16 +- storage/connect/odbconn.h | 4 +- storage/connect/os.h | 10 +- storage/connect/osutil.c | 2 +- storage/connect/plgdbsem.h | 6 +- storage/connect/plgdbutl.cpp | 30 +-- storage/connect/plugutil.cpp | 26 +-- storage/connect/rcmsg.c | 4 +- storage/connect/reldef.cpp | 36 ++-- storage/connect/reldef.h | 6 +- storage/connect/tabdos.cpp | 18 +- storage/connect/tabext.cpp | 2 +- storage/connect/tabfix.cpp | 6 +- storage/connect/tabfmt.cpp | 8 +- storage/connect/tabjdbc.cpp | 2 +- storage/connect/tabmac.cpp | 6 +- storage/connect/tabmac.h | 6 +- storage/connect/tabmul.cpp | 80 ++++---- storage/connect/tabmul.h | 22 +- storage/connect/tabmysql.cpp | 6 +- storage/connect/taboccur.cpp | 2 +- storage/connect/tabodbc.cpp | 2 +- storage/connect/tabpivot.cpp | 2 +- storage/connect/tabrest.cpp | 16 +- storage/connect/tabrest.h | 6 +- storage/connect/tabsys.cpp | 20 +- storage/connect/tabtbl.cpp | 8 +- storage/connect/tabutil.cpp | 2 +- storage/connect/tabvct.cpp | 6 +- storage/connect/tabwmi.cpp | 4 +- storage/connect/tabxcl.cpp | 2 +- storage/connect/tabxml.cpp | 28 +-- storage/connect/valblk.cpp | 2 +- storage/connect/value.cpp | 14 +- storage/connect/xindex.cpp | 28 +-- storage/connect/xindex.h | 2 +- 77 files changed, 1317 insertions(+), 551 deletions(-) create mode 100644 storage/connect/Client2.java create mode 100644 storage/connect/Client3.java create mode 100644 storage/connect/TestInsert2.java create mode 100644 storage/connect/TestInsert3.java diff --git a/storage/connect/Client2.java b/storage/connect/Client2.java new file mode 100644 index 00000000000..6dbf4188032 --- /dev/null +++ b/storage/connect/Client2.java @@ -0,0 +1,130 @@ +package wrappers; + +import java.io.BufferedReader; +import java.io.Console; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Set; + +public class Client2 { + static boolean DEBUG = true; + static final Console c = System.console(); + static Mongo2Interface jdi = null; + + public static void main(String[] args) { + int rc, m, i = 0; + boolean brc; + Set columns; + String[] parms = new String[4]; + + jdi = new Mongo2Interface(DEBUG); + + parms[0] = getLine("URI: ", false); + parms[1] = getLine("DB: ", false); + parms[2] = null; + parms[3] = null; + + if (parms[0] == null) + parms[0] = "mongodb://localhost:27017"; + + if (parms[1] == null) + parms[1] = "test"; + + rc = jdi.MongoConnect(parms); + + if (rc == 0) { + String name, pipeline, query, fields; + System.out.println("Successfully connected to " + parms[1]); + + while ((name = getLine("Collection: ", false)) != null) { + if (jdi.GetCollection(name)) + System.out.println("GetCollection failed"); + else + System.out.println("Collection size: " + jdi.GetCollSize()); + + pipeline = getLine("Pipeline: ", false); + + if (pipeline == null) { + query = getLine("Filter: ", false); + fields = getLine("Proj: ", false); + brc = jdi.FindColl(query, fields); + } else + brc = jdi.AggregateColl(pipeline); + + System.out.println("Returned brc = " + brc); + + if (!brc) { + for (i = 0; i < 10; i++) { + m = jdi.ReadNext(); + + if (m > 0) { + columns = jdi.GetColumns(); + + for (String col : columns) + System.out.println(col + "=" + jdi.GetField(col)); + + if (pipeline == null) { + if (name.equalsIgnoreCase("gtst")) + System.out.println("gtst=" + jdi.GetField("*")); + + if (name.equalsIgnoreCase("inventory")) { + System.out.println("warehouse=" + jdi.GetField("instock.0.warehouse")); + System.out.println("quantity=" + jdi.GetField("instock.1.qty")); + } // endif inventory + + if (name.equalsIgnoreCase("restaurants")) { + System.out.println("score=" + jdi.GetField("grades.0.score")); + System.out.println("date=" + jdi.GetField("grades.0.date")); + } // endif restaurants + + } // endif pipeline + + } else if (m < 0) { + System.out.println("ReadNext: " + jdi.GetErrmsg()); + break; + } else + break; + + } // endfor i + + } // endif brc + + } // endwhile name + + rc = jdi.MongoDisconnect(); + System.out.println("Disconnect returned " + rc); + } else + System.out.println(jdi.GetErrmsg() + " rc=" + rc); + + } // end of main + + // ================================================================== + private static String getLine(String p, boolean b) { + String response; + + if (c != null) { + // Standard console mode + if (b) { + response = new String(c.readPassword(p)); + } else + response = c.readLine(p); + + } else { + // For instance when testing from Eclipse + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + System.out.print(p); + + try { + // Cannot suppress echo for password entry + response = in.readLine(); + } catch (IOException e) { + response = ""; + } // end of try/catch + + } // endif c + + return (response.isEmpty()) ? null : response; + } // end of getLine + +} // end of class Client diff --git a/storage/connect/Client3.java b/storage/connect/Client3.java new file mode 100644 index 00000000000..0d3914cdd0d --- /dev/null +++ b/storage/connect/Client3.java @@ -0,0 +1,154 @@ +package wrappers; + +import java.io.BufferedReader; +import java.io.Console; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Set; + +public class Client3 { + static boolean DEBUG = true; + static final Console c = System.console(); + static Mongo3Interface jdi = null; + + public static void main(String[] args) { + int rc, level = 0; + boolean brc, desc = false; + Set columns; + String[] parms = new String[4]; + + jdi = new Mongo3Interface(DEBUG); + + parms[0] = getLine("URI: ", false); + parms[1] = getLine("Database: ", false); + parms[2] = null; + parms[3] = null; + + if (parms[0] == null) + parms[0] = "mongodb://localhost:27017"; + + if (parms[1] == null) + parms[1] = "test"; + + rc = jdi.MongoConnect(parms); + + if (rc == 0) { + String name, pipeline, query, fields; + System.out.println("Successfully connected to " + parms[0]); + + while ((name = getLine("Collection: ", false)) != null) { + if (jdi.GetCollection(name)) + System.out.println("GetCollection failed"); + else + System.out.println("Collection size: " + jdi.GetCollSize()); + + pipeline = getLine("Pipeline: ", false); + + if (pipeline == null || (desc = pipeline.equals("*"))) { + query = getLine("Filter: ", false); + fields = getLine("Proj: ", false); + + if (desc) + level = Integer.parseInt(getLine("Level: ", false)); + + brc = jdi.FindColl(query, fields); + } else + brc = jdi.AggregateColl(pipeline); + + System.out.println("Returned brc = " + brc); + + if (!brc && !desc) { + for (int i = 0; jdi.ReadNext() > 0 && i < 10; i++) { + columns = jdi.GetColumns(); + + for (String col : columns) + System.out.println(col + "=" + jdi.GetField(col)); + + if (name.equalsIgnoreCase("gtst")) + System.out.println("gtst=" + jdi.GetField("*")); + + if (name.equalsIgnoreCase("inventory")) { + System.out.println("warehouse=" + jdi.GetField("instock.0.warehouse")); + System.out.println("quantity=" + jdi.GetField("instock.1.qty")); + } // endif inventory + + if (name.equalsIgnoreCase("restaurants")) { + System.out.println("score=" + jdi.GetField("grades.0.score")); + System.out.println("date=" + jdi.GetField("grades.0.date")); + } // endif inventory + + } // endfor i + + } else if (desc) { + int ncol; + + for (int i = 0; (ncol = jdi.ReadNext()) > 0 && i < 2; i++) { + if (discovery(null, "", ncol, level)) + break; + + System.out.println("--------------"); + } // endfor i + + } // endif desc + + } // endwhile query + + rc = jdi.MongoDisconnect(); + System.out.println("Disconnect returned " + rc); + } else + System.out.println(jdi.GetErrmsg() + " rc=" + rc); + + } // end of main + + private static boolean discovery(Object obj, String name, int ncol, int level) { + int[] val = new int[5]; + Object ret = null; + String bvn = null; + + for (int k = 0; k < ncol; k++) { + ret = jdi.ColumnDesc(obj, k, val, level); + bvn = jdi.ColDescName(); + + if (ret != null) + discovery(ret, name.concat(bvn).concat("."), val[4], level - 1); + else if (val[0] > 0) + System.out.println( + name + bvn + ": type=" + val[0] + " length=" + val[1] + " prec=" + val[2] + " nullable=" + val[3]); + else if (val[0] < 0) + System.out.println(jdi.GetErrmsg()); + + } // endfor k + + return false; + } // end of discovery + + // ================================================================== + private static String getLine(String p, boolean b) { + String response; + + if (c != null) { + // Standard console mode + if (b) { + response = new String(c.readPassword(p)); + } else + response = c.readLine(p); + + } else { + // For instance when testing from Eclipse + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + System.out.print(p); + + try { + // Cannot suppress echo for password entry + response = in.readLine(); + } catch (IOException e) { + response = ""; + } // end of try/catch + + } // endif c + + return (response.isEmpty()) ? null : response; + } // end of getLine + +} // end of class Client diff --git a/storage/connect/Mongo2Interface.java b/storage/connect/Mongo2Interface.java index 106dd4a4d63..5d27fe467d6 100644 --- a/storage/connect/Mongo2Interface.java +++ b/storage/connect/Mongo2Interface.java @@ -21,6 +21,7 @@ import com.mongodb.util.JSON; public class Mongo2Interface { boolean DEBUG = false; String Errmsg = "No error"; + String ovalName = null; Set Colnames = null; Cursor cursor = null; MongoClient client = null; @@ -220,7 +221,7 @@ public class Mongo2Interface { System.out.println("Class doc = " + doc.getClass()); Colnames = doc.keySet(); - return 1; + return Colnames.size(); } else return 0; @@ -253,30 +254,106 @@ public class Mongo2Interface { } // end of GetColumns - public String ColumnDesc(int n, int[] val) { - // if (rsmd == null) { - // System.out.println("No result metadata"); - // return null; - // } else try { - // val[0] = rsmd.getColumnType(n); - // val[1] = rsmd.getPrecision(n); - // val[2] = rsmd.getScale(n); - // val[3] = rsmd.isNullable(n); - // return rsmd.getColumnLabel(n); - // } catch (SQLException se) { - // SetErrmsg(se); - // } //end try/catch + public Object ColumnDesc(Object obj, int n, int[] val, int lvl) { + Object ret = null; + Object oval = ((obj != null) ? obj : doc); + BasicDBObject dob = (oval instanceof BasicDBObject) ? (BasicDBObject) oval : null; + BasicDBList ary = (oval instanceof BasicDBList) ? (BasicDBList) oval : null; + try { + if (ary != null) { + oval = ary.get(n); + ovalName = Integer.toString(n); + } else if (dob != null) { + // String[] k = dob.keySet().toArray(new String[0]); + Object[] k = dob.keySet().toArray(); + oval = dob.get(k[n]); + ovalName = (String) k[n]; + } else + ovalName = "x" + Integer.toString(n); + + if (DEBUG) + System.out.println("Class of " + ovalName + " = " + oval.getClass()); + + val[0] = 0; // ColumnType + val[1] = 0; // Precision + val[2] = 0; // Scale + val[3] = 0; // Nullable + val[4] = 0; // ncol + + if (oval == null) { + val[3] = 1; + } else if (oval instanceof String) { + val[0] = 1; + val[1] = ((String) oval).length(); + } else if (oval instanceof org.bson.types.ObjectId) { + val[0] = 1; + val[1] = ((org.bson.types.ObjectId) oval).toString().length(); + } else if (oval instanceof Integer) { + val[0] = 7; + val[1] = Integer.toString(((Integer) oval).intValue()).length(); + } else if (oval instanceof Long) { + val[0] = 5; + val[1] = Long.toString(((Long) oval).longValue()).length(); + } else if (oval instanceof Date) { + Long TS = (((Date) oval).getTime() / 1000); + val[0] = 8; + val[1] = TS.toString().length(); + } else if (oval instanceof Double) { + String d = Double.toString(((Double) oval).doubleValue()); + int i = d.indexOf('.') + 1; + + val[0] = 2; + val[1] = d.length(); + val[2] = (i > 0) ? val[1] - i : 0; + } else if (oval instanceof Boolean) { + val[0] = 4; + val[1] = 1; + } else if (oval instanceof BasicDBObject) { + if (lvl > 0) { + ret = oval; + val[0] = 1; + val[4] = ((BasicDBObject) oval).size(); + } else if (lvl == 0) { + val[0] = 1; + val[1] = oval.toString().length(); + } // endif lvl + + } else if (oval instanceof BasicDBList) { + if (lvl > 0) { + ret = oval; + val[0] = 2; + val[4] = ((BasicDBList) oval).size(); + } else if (lvl == 0) { + val[0] = 1; + val[1] = oval.toString().length(); + } // endif lvl + + } else { + SetErrmsg("Type " + " of " + ovalName + " not supported"); + val[0] = -1; + } // endif's + + return ret; + } catch (Exception ex) { + SetErrmsg(ex); + } // end try/catch + + val[0] = -1; return null; } // end of ColumnDesc + public String ColDescName() { + return ovalName; + } // end of ColDescName + protected Object GetFieldObject(String path) { Object o = null; BasicDBObject dob = null; BasicDBList lst = null; String[] names = null; - if (path == null || path.equals("*")) + if (path == null || path.equals("") || path.equals("*")) return doc; else if (doc instanceof BasicDBObject) dob = doc; @@ -325,9 +402,10 @@ public class Mongo2Interface { if (o != null) { if (o instanceof Date) { - Integer TS = (int) (((Date) o).getTime() / 1000); + Long TS = (((Date) o).getTime() / 1000); return TS.toString(); - } // endif Date + } else if (o instanceof Boolean) + return (Boolean) o ? "1" : "0"; return o.toString(); } else @@ -335,13 +413,25 @@ public class Mongo2Interface { } // end of GetField + public Object MakeBson(String s, int json) { + if (json == 1 || json == 2) { + return com.mongodb.util.JSON.parse(s); + } else + return null; + + } // end of MakeBson + public Object MakeDocument() { return new BasicDBObject(); } // end of MakeDocument - public boolean DocAdd(Object bdc, String key, Object val) { + public boolean DocAdd(Object bdc, String key, Object val, int json) { try { - ((BasicDBObject) bdc).append(key, val); + if (json != 0 && val instanceof String) + ((BasicDBObject) bdc).append(key, JSON.parse((String) val)); + else + ((BasicDBObject) bdc).append(key, val); + } catch (MongoException me) { SetErrmsg(me); return true; @@ -354,9 +444,13 @@ public class Mongo2Interface { return new BasicDBList(); } // end of MakeArray - public boolean ArrayAdd(Object bar, int n, Object val) { + public boolean ArrayAdd(Object bar, int n, Object val, int json) { try { - ((BasicDBList) bar).put(n, val); + if (json != 0 && val instanceof String) + ((BasicDBList) bar).put(n, JSON.parse((String) val)); + else + ((BasicDBList) bar).put(n, val); + } catch (MongoException me) { SetErrmsg(me); return true; diff --git a/storage/connect/Mongo3Interface.java b/storage/connect/Mongo3Interface.java index f587c01b391..73175e13aa3 100644 --- a/storage/connect/Mongo3Interface.java +++ b/storage/connect/Mongo3Interface.java @@ -1,5 +1,6 @@ package wrappers; +//import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; @@ -9,6 +10,7 @@ import java.util.Set; import org.bson.BsonArray; import org.bson.BsonBoolean; import org.bson.BsonDateTime; +//import org.bson.BsonDecimal128; import org.bson.BsonDocument; import org.bson.BsonDouble; import org.bson.BsonInt32; @@ -18,6 +20,7 @@ import org.bson.BsonString; import org.bson.BsonValue; import org.bson.Document; import org.bson.conversions.Bson; +//import org.bson.types.Decimal128; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; @@ -34,6 +37,7 @@ import com.mongodb.client.result.UpdateResult; public class Mongo3Interface { boolean DEBUG = false; String Errmsg = "No error"; + String bvalName = null; Set Colnames = null; MongoClient client = null; MongoDatabase db = null; @@ -167,7 +171,7 @@ public class Mongo3Interface { try { if (query != null) { - Bson dbq = Document.parse((query != null) ? query : "{}"); + Bson dbq = Document.parse(query); finditer = coll.find(dbq); } else finditer = coll.find(); @@ -218,17 +222,23 @@ public class Mongo3Interface { } // end of Rewind public int ReadNext() { - if (cursor.hasNext()) { - doc = cursor.next(); + try { + if (cursor.hasNext()) { + doc = cursor.next(); - if (DEBUG) - System.out.println("Class doc = " + doc.getClass()); + if (DEBUG) + System.out.println("Class doc = " + doc.getClass()); - Colnames = doc.keySet(); - return 1; - } else - return 0; + Colnames = doc.keySet(); + return Colnames.size(); + } else + return 0; + } catch (MongoException mx) { + SetErrmsg(mx); + } // end try/catch + + return -1; } // end of ReadNext public boolean Fetch(int row) { @@ -254,13 +264,11 @@ public class Mongo3Interface { } // end of GetColumns public String ColumnName(int n) { - int i = 1; + if (n < Colnames.size()) + return (String) Colnames.toArray()[n]; + else + return null; - for (String name : Colnames) - if (i++ == n) - return name; - - return null; } // end of ColumnName public int ColumnType(int n, String name) { @@ -278,30 +286,111 @@ public class Mongo3Interface { return 666; // Not a type } // end of ColumnType - public String ColumnDesc(int n, int[] val) { - // if (rsmd == null) { - // System.out.println("No result metadata"); - // return null; - // } else try { - // val[0] = rsmd.getColumnType(n); - // val[1] = rsmd.getPrecision(n); - // val[2] = rsmd.getScale(n); - // val[3] = rsmd.isNullable(n); - // return rsmd.getColumnLabel(n); - // } catch (SQLException se) { - // SetErrmsg(se); - // } //end try/catch + public Object ColumnDesc(Object obj, int n, int[] val, int lvl) { + Object ret = null; + BsonValue bval = (BsonValue) ((obj != null) ? obj : doc); + BsonDocument dob = (bval instanceof BsonDocument) ? (BsonDocument) bval : null; + BsonArray ary = (bval instanceof BsonArray) ? (BsonArray) bval : null; + try { + if (ary != null) { + bval = ary.get(n); + bvalName = Integer.toString(n); + } else if (dob != null) { + // String[] k = dob.keySet().toArray(new String[0]); + Object[] k = dob.keySet().toArray(); + bval = dob.get(k[n]); + bvalName = (String) k[n]; + } else + bvalName = "x" + Integer.toString(n); + + val[0] = 0; // ColumnType + val[1] = 0; // Precision + val[2] = 0; // Scale + val[3] = 0; // Nullable + val[4] = 0; // ncol + + if (bval.isString()) { + val[0] = 1; + val[1] = bval.asString().getValue().length(); + } else if (bval.isInt32()) { + val[0] = 7; + val[1] = Integer.toString(bval.asInt32().getValue()).length(); + } else if (bval.isInt64()) { + val[0] = 5; + val[1] = Long.toString(bval.asInt64().getValue()).length(); + } else if (bval.isObjectId()) { + val[0] = 1; + val[1] = bval.asObjectId().getValue().toString().length(); + } else if (bval.isDateTime()) { + Long TS = (bval.asDateTime().getValue() / 1000); + val[0] = 8; + val[1] = TS.toString().length(); + } else if (bval.isDouble()) { + String d = Double.toString(bval.asDouble().getValue()); + int i = d.indexOf('.') + 1; + + val[0] = 2; + val[1] = d.length(); + val[2] = (i > 0) ? val[1] - i : 0; + } else if (bval.isBoolean()) { + val[0] = 4; + val[1] = 1; + } else if (bval.isDocument()) { + if (lvl > 0) { + ret = bval; + val[0] = 1; + val[4] = bval.asDocument().keySet().size(); + } else if (lvl == 0) { + val[0] = 1; + val[1] = bval.asDocument().toJson().length(); + } // endif lvl + + } else if (bval.isArray()) { + if (lvl > 0) { + ret = bval; + val[0] = 2; + val[4] = bval.asArray().size(); + } else if (lvl == 0) { + val[0] = 1; + util = new BsonDocument("arr", bval.asArray()); + String s = util.toJson(); + int i1 = s.indexOf('['); + int i2 = s.lastIndexOf(']'); + val[1] = i2 - i1 + 1; + } // endif lvl + + } else if (bval.isDecimal128()) { + val[0] = 9; + val[1] = bval.asDecimal128().toString().length(); + } else if (bval.isNull()) { + val[0] = 0; + val[3] = 1; + } else { + SetErrmsg("Type " + bval.getBsonType() + " of " + bvalName + " not supported"); + val[0] = -1; + } // endif's + + return ret; + } catch (Exception ex) { + SetErrmsg(ex); + } // end try/catch + + val[0] = -1; return null; } // end of ColumnDesc + public String ColDescName() { + return bvalName; + } // end of ColDescName + protected BsonValue GetFieldObject(String path) { BsonValue o = doc; BsonDocument dob = null; BsonArray ary = null; String[] names = null; - if (path == null || path.equals("*")) + if (path == null || path.equals("") || path.equals("*")) return doc; else if (o instanceof BsonDocument) dob = doc; @@ -362,6 +451,8 @@ public class Mongo3Interface { return TS.toString(); } else if (o.isDouble()) { return Double.toString(o.asDouble().getValue()); + } else if (o.isBoolean()) { + return o.asBoolean().getValue() ? "1" : "0"; } else if (o.isDocument()) { return o.asDocument().toJson(); } else if (o.isArray()) { @@ -370,6 +461,8 @@ public class Mongo3Interface { int i1 = s.indexOf('['); int i2 = s.lastIndexOf(']'); return s.substring(i1, i2 + 1); + } else if (o.isDecimal128()) { + return o.asDecimal128().toString(); } else if (o.isNull()) { return null; } else @@ -380,14 +473,33 @@ public class Mongo3Interface { } // end of GetField - protected BsonValue ObjToBson(Object val) { + public Object MakeBson(String s, int json) { + BsonValue bval; + + if (json == 1) + bval = BsonDocument.parse(s); + else if (json == 2) + bval = BsonArray.parse(s); + else + bval = null; + + return bval; + } // end of MakeBson + + protected BsonValue ObjToBson(Object val, int json) { BsonValue bval = null; if (val == null) bval = bsonull; - else if (val.getClass() == String.class) - bval = new BsonString((String) val); - else if (val.getClass() == Integer.class) + else if (val.getClass() == String.class) { + if (json == 1) + bval = BsonDocument.parse((String) val); + else if (json == 2) + bval = BsonArray.parse((String) val); + else + bval = new BsonString((String) val); + + } else if (val.getClass() == Integer.class) bval = new BsonInt32((int) val); else if (val.getClass() == Double.class) bval = new BsonDouble((double) val); @@ -401,6 +513,8 @@ public class Mongo3Interface { bval = (BsonDocument) val; else if (val.getClass() == BsonArray.class) bval = (BsonArray) val; + // else if (val.getClass() == BigDecimal.class) + // bval = new BsonDecimal128((BigDecimal) val); return bval; } // end of ObjToBson @@ -409,9 +523,9 @@ public class Mongo3Interface { return new BsonDocument(); } // end of MakeDocument - public boolean DocAdd(Object bdc, String key, Object val) { + public boolean DocAdd(Object bdc, String key, Object val, int json) { try { - ((BsonDocument) bdc).append(key, ObjToBson(val)); + ((BsonDocument) bdc).append(key, ObjToBson(val, json)); } catch (MongoException me) { SetErrmsg(me); return true; @@ -424,12 +538,12 @@ public class Mongo3Interface { return new BsonArray(); } // end of MakeArray - public boolean ArrayAdd(Object bar, int n, Object val) { + public boolean ArrayAdd(Object bar, int n, Object val, int json) { try { for (int i = ((BsonArray) bar).size(); i < n; i++) ((BsonArray) bar).add(bsonull); - ((BsonArray) bar).add(ObjToBson(val)); + ((BsonArray) bar).add(ObjToBson(val, json)); } catch (MongoException me) { SetErrmsg(me); return true; @@ -501,4 +615,4 @@ public class Mongo3Interface { return n; } // end of CollDelete -} // end of class MongoInterface +} // end of class Mongo3Interface diff --git a/storage/connect/TestInsert2.java b/storage/connect/TestInsert2.java new file mode 100644 index 00000000000..e1a7cb4f98b --- /dev/null +++ b/storage/connect/TestInsert2.java @@ -0,0 +1,131 @@ +package wrappers; + +import java.io.BufferedReader; +import java.io.Console; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Date; + +public class TestInsert2 { + static boolean DEBUG = true; + static final Console c = System.console(); + static Mongo2Interface jdi = null; + + public static void main(String[] args) { + int rc; + String[] parms = new String[4]; + + jdi = new Mongo2Interface(DEBUG); + + parms[0] = getLine("URI: ", false); + parms[1] = getLine("Database: ", false); + parms[2] = null; + parms[3] = null; + + if (parms[0] == null) + parms[0] = "mongodb://localhost:27017"; + + if (parms[1] == null) + parms[1] = "test"; + + rc = jdi.MongoConnect(parms); + + if (rc == 0) { + Object bdoc = jdi.MakeDocument(); + + if (jdi.DocAdd(bdoc, "_id", (Object) 1, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Name", (Object) "Smith", 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Age", (Object) 39, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Pi", (Object) 3.14, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Phone", (Object) "{\"ext\":[4,5,7]}", 1)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Scores", (Object) "[24,2,13]", 2)) + System.out.println(jdi.GetErrmsg()); + + Object bar = jdi.MakeArray(); + + for (int i = 1; i < 3; i++) + if (jdi.ArrayAdd(bar, i, (Object) (Math.random() * 10.0), 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Prices", bar, 0)) + System.out.println(jdi.GetErrmsg()); + + Object dat = new Date(); + + if (jdi.DocAdd(bdoc, "Date", dat, 0)) + System.out.println(jdi.GetErrmsg()); + + System.out.println(bdoc); + + // Try to update + if (!jdi.GetCollection("updtest") && !jdi.FindColl(null, null)) { + if (jdi.CollDelete(true) < 0) + System.out.println(jdi.GetErrmsg()); + + if (jdi.CollInsert(bdoc)) + System.out.println(jdi.GetErrmsg()); + + Object updlist = jdi.MakeDocument(); + + if (jdi.DocAdd(updlist, "Age", (Object) 45, 0)) + System.out.println(jdi.GetErrmsg()); + + Object upd = jdi.MakeDocument(); + + if (jdi.DocAdd(upd, "$set", updlist, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.ReadNext() > 0 && jdi.CollUpdate(upd) < 0) + System.out.println(jdi.GetErrmsg()); + + if (!jdi.Rewind() && jdi.ReadNext() > 0) + System.out.println(jdi.GetDoc()); + else + System.out.println("Failed Rewind"); + + } // endif n + + } // endif rc + + } // end of main + + // ================================================================== + private static String getLine(String p, boolean b) { + String response; + + if (c != null) { + // Standard console mode + if (b) { + response = new String(c.readPassword(p)); + } else + response = c.readLine(p); + + } else { + // For instance when testing from Eclipse + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + System.out.print(p); + + try { + // Cannot suppress echo for password entry + response = in.readLine(); + } catch (IOException e) { + response = ""; + } // end of try/catch + + } // endif c + + return (response.isEmpty()) ? null : response; + } // end of getLine + +} diff --git a/storage/connect/TestInsert3.java b/storage/connect/TestInsert3.java new file mode 100644 index 00000000000..a56a361e7aa --- /dev/null +++ b/storage/connect/TestInsert3.java @@ -0,0 +1,131 @@ +package wrappers; + +import java.io.BufferedReader; +import java.io.Console; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Date; + +public class TestInsert3 { + static boolean DEBUG = true; + static final Console c = System.console(); + static Mongo3Interface jdi = null; + + public static void main(String[] args) { + int rc; + String[] parms = new String[4]; + + jdi = new Mongo3Interface(DEBUG); + + parms[0] = getLine("URI: ", false); + parms[1] = getLine("Database: ", false); + parms[2] = null; + parms[3] = null; + + if (parms[0] == null) + parms[0] = "mongodb://localhost:27017"; + + if (parms[1] == null) + parms[1] = "test"; + + rc = jdi.MongoConnect(parms); + + if (rc == 0) { + Object bdoc = jdi.MakeDocument(); + + if (jdi.DocAdd(bdoc, "_id", (Object) 1, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Name", (Object) "Smith", 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Age", (Object) 39, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Pi", (Object) 3.14, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Phone", (Object) "{\"ext\":[4,5,7]}", 1)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Scores", (Object) "[24,2,13]", 2)) + System.out.println(jdi.GetErrmsg()); + + Object bar = jdi.MakeArray(); + + for (int i = 0; i < 2; i++) + if (jdi.ArrayAdd(bar, i, (Object) (Math.random() * 10.0), 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.DocAdd(bdoc, "Prices", bar, 0)) + System.out.println(jdi.GetErrmsg()); + + Object dat = new Date(); + + if (jdi.DocAdd(bdoc, "Date", dat, 0)) + System.out.println(jdi.GetErrmsg()); + + System.out.println(bdoc); + + // Try to update + if (!jdi.GetCollection("updtest") && !jdi.FindColl(null, null)) { + if (jdi.CollDelete(true) < 0) + System.out.println(jdi.GetErrmsg()); + + if (jdi.CollInsert(bdoc)) + System.out.println(jdi.GetErrmsg()); + + Object updlist = jdi.MakeDocument(); + + if (jdi.DocAdd(updlist, "Age", (Object) 40, 0)) + System.out.println(jdi.GetErrmsg()); + + Object upd = jdi.MakeDocument(); + + if (jdi.DocAdd(upd, "$set", updlist, 0)) + System.out.println(jdi.GetErrmsg()); + + if (jdi.ReadNext() > 0 && jdi.CollUpdate(upd) < 0) + System.out.println(jdi.GetErrmsg()); + + if (!jdi.Rewind() && jdi.ReadNext() > 0) + System.out.println(jdi.GetDoc()); + else + System.out.println("Failed Rewind"); + + } // endif n + + } // endif rc + + } // end of main + + // ================================================================== + private static String getLine(String p, boolean b) { + String response; + + if (c != null) { + // Standard console mode + if (b) { + response = new String(c.readPassword(p)); + } else + response = c.readLine(p); + + } else { + // For instance when testing from Eclipse + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + System.out.print(p); + + try { + // Cannot suppress echo for password entry + response = in.readLine(); + } catch (IOException e) { + response = ""; + } // end of try/catch + + } // endif c + + return (response.isEmpty()) ? null : response; + } // end of getLine + +} diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index 84a686cc145..0e7e3ffc701 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -19,14 +19,14 @@ #include "sql_class.h" //#include "sql_time.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include #include #include #include // for uintprt_h -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include required application header files */ diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index 76c9d09ac93..93ae5a5ef0c 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -20,13 +20,13 @@ #include "sql_class.h" //#include "sql_time.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include #include #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/block.h b/storage/connect/block.h index c10fc4761ac..e8871277d48 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -24,11 +24,11 @@ #if !defined(BLOCK_DEFINED) #define BLOCK_DEFINED -#if defined(__WIN__) && !defined(NOEX) +#if defined(_WIN32) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !__WIN__ +#else // !_WIN32 #define DllExport -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Definition of class BLOCK with its method function new. */ diff --git a/storage/connect/bson.cpp b/storage/connect/bson.cpp index 060e8b1e394..bf03f47a10d 100644 --- a/storage/connect/bson.cpp +++ b/storage/connect/bson.cpp @@ -30,7 +30,7 @@ #define CheckType(X,Y) #endif -#if defined(__WIN__) +#if defined(_WIN32) #define EL "\r\n" #else #define EL "\n" diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 6ab9e781994..f3fc30fa9e2 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -161,16 +161,16 @@ bool CMgoConn::Connect(PGLOBAL g) } // endif name if (!IsInit) -#if defined(__WIN__) +#if defined(_WIN32) __try { mongo_init(true); } __except (EXCEPTION_EXECUTE_HANDLER) { strcpy(g->Message, "Cannot load MongoDB C driver"); return true; } // end try/except -#else // !__WIN__ +#else // !_WIN32 mongo_init(true); -#endif // !__WIN__ +#endif // !_WIN32 Uri = mongoc_uri_new_with_error(Pcg->Uristr, &Error); diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index a9cf43f3d96..7bbebaaa889 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -297,9 +297,9 @@ FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) Buf_Type = TYPE_STRING; *Format.Type = 'C'; Format.Length = Long; -#if defined(__WIN__) +#if defined(_WIN32) Format.Prec = 1; // Case insensitive -#endif // __WIN__ +#endif // _WIN32 Constant = (!To_Tdb->GetDef()->GetMultiple() && To_Tdb->GetAmType() != TYPE_AM_PLG && To_Tdb->GetAmType() != TYPE_AM_PLM); diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp index 9ae34a3b9ef..9da73bdc770 100644 --- a/storage/connect/domdoc.cpp +++ b/storage/connect/domdoc.cpp @@ -4,7 +4,7 @@ /******************************************************************/ #include "my_global.h" #include -#if defined(__WIN__) +#if defined(_WIN32) //#include #if defined(MSX2) #import "msxml2.dll" //Does not exist on Vista diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 18ba0b1018f..9f873e4f180 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -17,12 +17,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -30,7 +30,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -197,11 +197,11 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) return true; } // endif Memory -#if defined(__WIN__) +#if defined(_WIN32) if (mode != MODE_DELETE) { -#else // !__WIN__ +#else // !_WIN32 if (mode == MODE_READ) { -#endif // !__WIN__ +#endif // !_WIN32 CloseFileHandle(hFile); // Not used anymore hFile = INVALID_HANDLE_VALUE; // For Fblock } // endif Mode @@ -468,7 +468,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ n = (int)(Tpos - Memory); -#if defined(__WIN__) +#if defined(_WIN32) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -498,7 +498,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) #endif // UNIX } // endif Abort -#if defined(__WIN__) +#if defined(_WIN32) CloseHandle(fp->Handle); #else // UNIX close(fp->Handle); diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 542159fd172..a93fba52a50 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -22,12 +22,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include //#include //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -35,7 +35,7 @@ //#include #endif // !UNIX //#include -#endif // !__WIN__ +#endif // !_WIN32 #include #include #include @@ -649,7 +649,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); if (mode == MODE_INSERT) { -#if defined(__WIN__) +#if defined(_WIN32) /************************************************************************/ /* Now we can revert to binary mode in particular because the eventual */ /* writing of a new header must be done in binary mode to avoid */ @@ -659,7 +659,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) sprintf(g->Message, MSG(BIN_MODE_FAIL), strerror(errno)); return true; } // endif setmode -#endif // __WIN__ +#endif // _WIN32 /************************************************************************/ /* If this is a new file, the header must be generated. */ diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index 0a98ec5b54a..e0002f6f784 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -34,7 +34,7 @@ #endif // !UNIX #include #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -338,7 +338,7 @@ int FIXFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); #else sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); @@ -678,7 +678,7 @@ BGXFAM::BGXFAM(PBGXFAM txfp) : FIXFAM(txfp) /***********************************************************************/ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) { -#if defined(__WIN__) +#if defined(_WIN32) char buf[256]; DWORD drc; LARGE_INTEGER of; @@ -694,14 +694,14 @@ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) sprintf(g->Message, MSG(SFP_ERROR), buf); return true; } // endif -#else // !__WIN__ +#else // !_WIN32 if (lseek64(h, pos, org) < 0) { // sprintf(g->Message, MSG(ERROR_IN_LSK), errno); sprintf(g->Message, "lseek64: %s", strerror(errno)); printf("%s\n", g->Message); return true; } // endif -#endif // !__WIN__ +#endif // !_WIN32 return false; } // end of BigSeek @@ -714,7 +714,7 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), { int rc; -#if defined(__WIN__) +#if defined(_WIN32) DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); @@ -736,12 +736,12 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), rc = -1; } else rc = (int)nbr; -#else // !__WIN__ +#else // !_WIN32 size_t len = (size_t)req; ssize_t nbr = read(h, inbuf, len); rc = (int)nbr; -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of BigRead @@ -753,7 +753,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(__WIN__) +#if defined(_WIN32) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); @@ -781,7 +781,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbw -#else // !__WIN__ +#else // !_WIN32 size_t len = (size_t)req; ssize_t nbw = write(h, inbuf, len); @@ -796,7 +796,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of BigWrite @@ -831,7 +831,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) if (trace(1)) htrc("OpenTableFile: filename=%s mode=%d\n", filename, mode); -#if defined(__WIN__) +#if defined(_WIN32) DWORD rc, access, creation, share = 0; /*********************************************************************/ @@ -989,7 +989,7 @@ int BGXFAM::Cardinality(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); -#if defined(__WIN__) // OB +#if defined(_WIN32) // OB LARGE_INTEGER len; DWORD rc = 0; @@ -1348,7 +1348,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) if (BigSeek(g, Hfile, (BIGINT)Tpos * (BIGINT)Lrecl)) return RC_FX; @@ -1358,12 +1358,12 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) sprintf(g->Message, MSG(SETEOF_ERROR), drc); return RC_FX; } // endif error -#else // !__WIN__ +#else // !_WIN32 if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) { sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); return RC_FX; } // endif -#endif // !__WIN__ +#endif // !_WIN32 } // endif UseTemp @@ -1388,7 +1388,7 @@ bool BGXFAM::OpenTempFile(PGLOBAL g) strcat(PlugRemoveType(tempname, tempname), ".t"); remove(tempname); // Be sure it does not exist yet -#if defined(__WIN__) +#if defined(_WIN32) Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); @@ -1528,7 +1528,7 @@ void BGXFAM::CloseTableFile(PGLOBAL g, bool abort) void BGXFAM::Rewind(void) { #if 0 // This is probably unuseful because file is accessed directly -#if defined(__WIN__) //OB +#if defined(_WIN32) //OB SetFilePointer(Hfile, 0, NULL, FILE_BEGIN); #else // UNIX lseek64(Hfile, 0, SEEK_SET); diff --git a/storage/connect/filamgz.cpp b/storage/connect/filamgz.cpp index 880db54c91d..1f785fc73ac 100644 --- a/storage/connect/filamgz.cpp +++ b/storage/connect/filamgz.cpp @@ -17,21 +17,21 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #else // !UNIX #include #endif #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -89,11 +89,11 @@ int GZFAM::Zerror(PGLOBAL g) strcpy(g->Message, gzerror(Zfile, &errnum)); if (errnum == Z_ERRNO) -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(NULL)); -#else // !__WIN__ +#else // !_WIN32 sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); -#endif // !__WIN__ +#endif // !_WIN32 return (errnum == Z_STREAM_END) ? RC_EF : RC_FX; } // end of Zerror @@ -764,9 +764,9 @@ bool GZXFAM::AllocateBuffer(PGLOBAL g) if (Tdbp->GetFtype() < 2) // if not binary, the file is physically a text file for (int len = Lrecl; len <= Buflen; len += Lrecl) { -#if defined(__WIN__) +#if defined(_WIN32) To_Buf[len - 2] = '\r'; -#endif // __WIN__ +#endif // _WIN32 To_Buf[len - 1] = '\n'; } // endfor len diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index 30ce19a5d37..13779858d48 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) || defined(UNIV_LINUX) #include #include @@ -36,7 +36,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -82,7 +82,7 @@ TXTFAM::TXTFAM(PDOSDEF tdp) To_File = NULL; Lrecl = 0; Eof = false; -#if defined(__WIN__) +#if defined(_WIN32) Ending = 2; #else Ending = 1; @@ -731,7 +731,7 @@ int DOSFAM::SkipRecord(PGLOBAL g, bool header) if (feof(Stream)) return RC_EF; -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); #else sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); @@ -814,7 +814,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g) if (trace(2)) htrc(" Read: To_Buf=%p p=%c\n", To_Buf, p); -#if defined(__WIN__) +#if defined(_WIN32) if (Bin) { // Data file is read in binary so CRLF remains #else @@ -848,7 +848,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); #else sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); @@ -1043,7 +1043,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) if (chsize(h, Tpos)) { sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno)); close(h); @@ -1482,7 +1482,7 @@ int BLKFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); #else sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); @@ -1567,11 +1567,11 @@ int BLKFAM::WriteBuffer(PGLOBAL g) Spos = GetNextPos(); // New start position // Prepare the output buffer -#if defined(__WIN__) +#if defined(_WIN32) crlf = "\r\n"; #else crlf = "\n"; -#endif // __WIN__ +#endif // _WIN32 strcat(strcpy(OutBuf, Tdbp->GetLine()), crlf); len = strlen(OutBuf); } else { @@ -1871,7 +1871,7 @@ int BINFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(__WIN__) +#if defined(_WIN32) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); #else sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); @@ -2065,7 +2065,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) if (chsize(h, Tpos)) { sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno)); close(h); diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index 5a3e025cd55..7a3c43e507f 100644 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -21,7 +21,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) @@ -29,7 +29,7 @@ #endif // __BORLAND__ //#include #include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -40,7 +40,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -371,11 +371,11 @@ bool VCTFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) int h, n; PlugSetPath(filename, fn, Tdbp->GetPath()); -#if defined(__WIN__) +#if defined(_WIN32) h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, _O_CREAT | _O_WRONLY, S_IREAD | S_IWRITE); -#else // !__WIN__ +#else // !_WIN32 h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, O_CREAT | O_WRONLY, S_IREAD | S_IWRITE); -#endif // !__WIN__ +#endif // !_WIN32 if (h == -1) return true; @@ -1672,7 +1672,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) // Remove extra blocks n = Block * Blksize; -#if defined(__WIN__) +#if defined(_WIN32) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -2579,11 +2579,11 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) char fn[_MAX_PATH]; sprintf(fn, Colfn, colp->Index); -#if defined(__WIN__) +#if defined(_WIN32) if (feof(Streams[i])) -#else // !__WIN__ +#else // !_WIN32 if (errno == NO_ERROR) -#endif // !__WIN__ +#endif // !_WIN32 sprintf(g->Message, MSG(BAD_READ_NUMBER), (int) n, fn); else sprintf(g->Message, MSG(READ_ERROR), @@ -2979,7 +2979,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ n = Tpos * Clens[i]; -#if defined(__WIN__) +#if defined(_WIN32) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -3059,7 +3059,7 @@ BGVFAM::BGVFAM(PBGVFAM txfp) : VCTFAM(txfp) /***********************************************************************/ bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b) { -#if defined(__WIN__) +#if defined(_WIN32) char buf[256]; DWORD drc, m = (b) ? FILE_END : FILE_BEGIN; LARGE_INTEGER of; @@ -3075,12 +3075,12 @@ bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b) sprintf(g->Message, MSG(SFP_ERROR), buf); return true; } // endif -#else // !__WIN__ +#else // !_WIN32 if (lseek64(h, pos, (b) ? SEEK_END : SEEK_SET) < 0) { sprintf(g->Message, MSG(ERROR_IN_LSK), errno); return true; } // endif -#endif // !__WIN__ +#endif // !_WIN32 return false; } // end of BigSeek @@ -3092,7 +3092,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(__WIN__) +#if defined(_WIN32) DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); @@ -3118,7 +3118,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbr -#else // !__WIN__ +#else // !_WIN32 size_t len = (size_t)req; ssize_t nbr = read(h, inbuf, len); @@ -3133,7 +3133,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of BigRead @@ -3145,7 +3145,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(__WIN__) +#if defined(_WIN32) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); @@ -3173,7 +3173,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbw -#else // !__WIN__ +#else // !_WIN32 size_t len = (size_t)req; ssize_t nbw = write(h, inbuf, len); @@ -3188,7 +3188,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of BigWrite @@ -3214,7 +3214,7 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) if (Header == 2) strcat(PlugRemoveType(filename, filename), ".blk"); -#if defined(__WIN__) +#if defined(_WIN32) LARGE_INTEGER len; h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, @@ -3226,11 +3226,11 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) } // endif h if (h == INVALID_HANDLE_VALUE || !len.QuadPart) { -#else // !__WIN__ +#else // !_WIN32 h = open64(filename, O_RDONLY, 0); if (h == INVALID_HANDLE_VALUE || !_filelength(h)) { -#endif // !__WIN__ +#endif // !_WIN32 // Consider this is a void table if (trace(1)) htrc("Void table h=%d\n", h); @@ -3291,17 +3291,17 @@ bool BGVFAM::SetBlockInfo(PGLOBAL g) strcat(PlugRemoveType(filename, filename), ".blk"); if (h == INVALID_HANDLE_VALUE) { -#if defined(__WIN__) +#if defined(_WIN32) DWORD creation = (b) ? OPEN_EXISTING : TRUNCATE_EXISTING; h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, creation, FILE_ATTRIBUTE_NORMAL, NULL); -#else // !__WIN__ +#else // !_WIN32 int oflag = (b) ? O_RDWR : O_RDWR | O_TRUNC; h = open64(filename, oflag, 0); -#endif // !__WIN__ +#endif // !_WIN32 if (h == INVALID_HANDLE_VALUE) { sprintf(g->Message, "Error opening header file %s", filename); @@ -3339,7 +3339,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) PlugSetPath(filename, fn, Tdbp->GetPath()); -#if defined(__WIN__) +#if defined(_WIN32) PCSZ p; DWORD rc; bool brc; @@ -3391,7 +3391,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) CloseHandle(h); return true; -#else // !__WIN__ +#else // !_WIN32 int h; BIGINT pos; @@ -3420,7 +3420,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) sprintf(g->Message, MSG(MAKE_EMPTY_FILE), To_File, strerror(errno)); close(h); return true; -#endif // !__WIN__ +#endif // !_WIN32 } // end of MakeEmptyFile /***********************************************************************/ @@ -3451,7 +3451,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) htrc("OpenTableFile: filename=%s mode=%d Last=%d\n", filename, mode, Last); -#if defined(__WIN__) +#if defined(_WIN32) DWORD access, creation, share = 0, rc = 0; /*********************************************************************/ @@ -3779,7 +3779,7 @@ int BGVFAM::WriteBuffer(PGLOBAL g) if (!Closing && !MaxBlk) { // Close the VCT file and reopen it in mode Insert -//#if defined(__WIN__) //OB +//#if defined(_WIN32) //OB // CloseHandle(Hfile); //#else // UNIX // close(Hfile); @@ -3906,7 +3906,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) /***************************************************************/ /* Remove extra records. */ /***************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) BIGINT pos = (BIGINT)Block * (BIGINT)Blksize; if (BigSeek(g, Hfile, pos)) @@ -3918,12 +3918,12 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) sprintf(g->Message, MSG(SETEOF_ERROR), drc); return RC_FX; } // endif error -#else // !__WIN__ +#else // !_WIN32 if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) { sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); return RC_FX; } // endif -#endif // !__WIN__ +#endif // !_WIN32 } else // MaxBlk // Clean the unused space in the file, this is required when // inserting again with a partial column list. @@ -3960,7 +3960,7 @@ bool BGVFAM::OpenTempFile(PGLOBAL g) else if (MakeEmptyFile(g, tempname)) return true; -#if defined(__WIN__) +#if defined(_WIN32) DWORD access = (MaxBlk) ? OPEN_EXISTING : CREATE_NEW; Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL, @@ -4231,7 +4231,7 @@ void BGVFAM::Rewind(void) CurNum = Nrec - 1; #if 0 // This is probably unuseful as the file is directly accessed -#if defined(__WIN__) //OB +#if defined(_WIN32) //OB SetFilePointer(Hfile, 0, NULL, FILE_BEGIN); #else // UNIX lseek64(Hfile, 0, SEEK_SET); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index eeb23e1f053..3d576e97ebb 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if !defined(__WIN__) +#if !defined(_WIN32) #if defined(UNIX) #include #include @@ -27,7 +27,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 #include /***********************************************************************/ @@ -154,7 +154,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) /*********************************************************************/ strcpy(filename, pat); -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE], direc[_MAX_DIR]; WIN32_FIND_DATA FileData; HANDLE hSearch; @@ -210,7 +210,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) return true; } // endif FindClose -#else // !__WIN__ +#else // !_WIN32 struct stat fileinfo; char fn[FN_REFLEN], direc[FN_REFLEN], pattern[FN_HEADLEN], ftype[FN_EXTLEN]; DIR *dir; @@ -251,7 +251,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) // Close the dir handle. closedir(dir); -#endif // !__WIN__ +#endif // !_WIN32 return false; } // end of ZipFiles @@ -275,9 +275,9 @@ bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul if (!entry) { // entry defaults to the file name char* p = strrchr((char*)fn, '/'); -#if defined(__WIN__) +#if defined(_WIN32) if (!p) p = strrchr((char*)fn, '\\'); -#endif // __WIN__ +#endif // _WIN32 entp = (p) ? p + 1 : entry; } else entp = entry; @@ -467,7 +467,7 @@ UNZIPUTL::UNZIPUTL(PCSZ tgt, PCSZ pw, bool mul) memset(fn, 0, sizeof(fn)); // Init the case mapping table. -#if defined(__WIN__) +#if defined(_WIN32) for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i); #else for (int i = 0; i < 256; ++i) mapCaseTable[i] = i; @@ -487,7 +487,7 @@ UNZIPUTL::UNZIPUTL(PDOSDEF tdp) memset(fn, 0, sizeof(fn)); // Init the case mapping table. -#if defined(__WIN__) +#if defined(_WIN32) for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i); #else for (int i = 0; i < 256; ++i) mapCaseTable[i] = i; diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index 7082b082c67..afcd2adfab0 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -13,13 +13,13 @@ //#include "sql_class.h" //#include "sql_time.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include #include #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ diff --git a/storage/connect/filter.h b/storage/connect/filter.h index c6ab8fddd35..12ac3a169c1 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -106,7 +106,7 @@ class FILTERX : public FILTER { // Fake operator new used to change a filter into a derived filter void * operator new(size_t, PFIL filp) {return filp;} -#if defined(__WIN__) +#if defined(_WIN32) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PFIL) {} #else diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index 729b1b883c1..1fb2b3fee65 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -22,12 +22,12 @@ */ #define FLEX_SCANNER -#ifdef __WIN__ +#ifdef _WIN32 #define __STDC__ 1 #define isatty _isatty #endif #include -#ifndef __WIN__ +#ifndef _WIN32 #include #endif diff --git a/storage/connect/global.h b/storage/connect/global.h index 8774285e54b..eb3d4106477 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -14,11 +14,11 @@ #include /* time_t type declaration */ #include /* Long jump declarations */ -#if defined(__WIN__) && !defined(NOEX) +#if defined(_WIN32) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !__WIN__ +#else // !_WIN32 #define DllExport -#endif // !__WIN__ +#endif // !_WIN32 #if defined(DOMDOC_SUPPORT) || defined(LIBXML2_SUPPORT) #define XML_SUPPORT 1 @@ -43,11 +43,11 @@ #define STEP(I) MSG_##I #endif // !XMSG and !NEWMSG -#if defined(__WIN__) +#if defined(_WIN32) #define CRLF 2 -#else // !__WIN__ +#else // !_WIN32 #define CRLF 1 -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Define access to the thread based trace value. */ @@ -204,9 +204,9 @@ DllExport char *PlugReadMessage(PGLOBAL, int, char *); #elif defined(NEWMSG) DllExport char *PlugGetMessage(PGLOBAL, int); #endif // XMSG || NEWMSG -#if defined(__WIN__) +#if defined(_WIN32) DllExport short GetLineLength(PGLOBAL); // Console line length -#endif // __WIN__ +#endif // _WIN32 DllExport PGLOBAL PlugInit(LPCSTR, size_t); // Plug global initialization DllExport PGLOBAL PlugExit(PGLOBAL); // Plug global termination DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 416bbb5d071..01fe7a6d2b3 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -139,10 +139,10 @@ //#include "reldef.h" #include "tabcol.h" #include "xindex.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include "tabwmi.h" -#endif // __WIN__ +#endif // _WIN32 #include "connect.h" #include "user_connect.h" #include "ha_connect.h" @@ -170,13 +170,13 @@ #define JSONMAX 50 // JSON Default max grp size extern "C" { - char version[]= "Version 1.07.0003 May 22, 2021"; -#if defined(__WIN__) + char version[]= "Version 1.07.0003 June 06, 2021"; +#if defined(_WIN32) char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__; char slash= '\\'; -#else // !__WIN__ +#else // !_WIN32 char slash= '/'; -#endif // !__WIN__ +#endif // !_WIN32 } // extern "C" #if MYSQL_VERSION_ID > 100200 @@ -802,11 +802,11 @@ static int connect_init_func(void *p) } #endif // 0 (LINUX) -#if defined(__WIN__) +#if defined(_WIN32) sql_print_information("CONNECT: %s", compver); -#else // !__WIN__ +#else // !_WIN32 sql_print_information("CONNECT: %s", version); -#endif // !__WIN__ +#endif // !_WIN32 pthread_mutex_init(&parmut, NULL); pthread_mutex_init(&usrmut, NULL); pthread_mutex_init(&tblmut, NULL); @@ -865,9 +865,9 @@ static int connect_done_func(void *) JAVAConn::ResetJVM(); #endif // JAVA_SUPPORT -#if !defined(__WIN__) +#if !defined(_WIN32) PROFILE_End(); -#endif // !__WIN__ +#endif // !_WIN32 pthread_mutex_lock(&usrmut); for (pc= user_connect::to_users; pc; pc= pn) { @@ -941,11 +941,11 @@ ha_connect::ha_connect(handlerton *hton, TABLE_SHARE *table_arg) xp= (table) ? GetUser(ha_thd(), NULL) : NULL; if (xp) xp->SetHandler(this); -#if defined(__WIN__) +#if defined(_WIN32) datapath= ".\\"; -#else // !__WIN__ +#else // !_WIN32 datapath= "./"; -#endif // !__WIN__ +#endif // !_WIN32 tdbp= NULL; sdvalin1= sdvalin2= sdvalin3= sdvalin4= NULL; sdvalout= NULL; @@ -4549,11 +4549,11 @@ static bool checkPrivileges(THD *thd, TABTYPE type, PTOS options, strcpy(dbpath, mysql_real_data_home); if (db) -#if defined(__WIN__) +#if defined(_WIN32) strcat(strcat(dbpath, db), "\\"); -#else // !__WIN__ +#else // !_WIN32 strcat(strcat(dbpath, db), "/"); -#endif // !__WIN__ +#endif // !_WIN32 (void)fn_format(path, options->filename, dbpath, "", MY_RELATIVE_PATH | MY_UNPACK_FILENAME); @@ -5607,9 +5607,9 @@ static int connect_assisted_discovery(handlerton *, THD* thd, PCSZ user, fn, db, host, pwd, sep, tbl, src; PCSZ col, ocl, rnk, pic, fcl, skc, zfn; char *tab, *dsn, *shm, *dpath, *url; -#if defined(__WIN__) +#if defined(_WIN32) PCSZ nsp= NULL, cls= NULL; -#endif // __WIN__ +#endif // _WIN32 //int hdr, mxe; int port= 0, mxr= 0, rc= 0, mul= 0, lrecl= 0; //PCSZ tabtyp= NULL; @@ -5670,10 +5670,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd, skc= GetListOption(g, "skipcol", topt->oplist, NULL); rnk= GetListOption(g, "rankcol", topt->oplist, NULL); pwd= GetListOption(g, "password", topt->oplist); -#if defined(__WIN__) +#if defined(_WIN32) nsp= GetListOption(g, "namespace", topt->oplist); cls= GetListOption(g, "class", topt->oplist); -#endif // __WIN__ +#endif // _WIN32 port= atoi(GetListOption(g, "port", topt->oplist, "0")); #if defined(ODBC_SUPPORT) // tabtyp= GetListOption(g, "Tabtype", topt->oplist, NULL); @@ -5904,11 +5904,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd, ok= false; break; -#if defined(__WIN__) +#if defined(_WIN32) case TAB_WMI: ok= true; break; -#endif // __WIN__ +#endif // _WIN32 case TAB_PIVOT: supfnc= FNC_NO; case TAB_PRX: @@ -6072,11 +6072,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd, case TAB_CSV: qrp= CSVColumns(g, dpath, topt, fnc == FNC_COL); break; -#if defined(__WIN__) +#if defined(_WIN32) case TAB_WMI: qrp= WMIColumns(g, nsp, cls, fnc == FNC_COL); break; -#endif // __WIN__ +#endif // _WIN32 case TAB_PRX: case TAB_TBL: case TAB_XCL: @@ -6606,11 +6606,11 @@ int ha_connect::create(const char *name, TABLE *table_arg, // on Windows and libxml2 otherwise switch (toupper(*xsup)) { case '*': -#if defined(__WIN__) +#if defined(_WIN32) dom= true; -#else // !__WIN__ +#else // !_WIN32 dom= false; -#endif // !__WIN__ +#endif // !_WIN32 break; case 'M': case 'D': @@ -6993,11 +6993,11 @@ bool ha_connect::FileExists(const char *fn, bool bf) int n; struct stat info; -#if defined(__WIN__) +#if defined(_WIN32) s= "\\"; -#else // !__WIN__ +#else // !_WIN32 s= "/"; -#endif // !__WIN__ +#endif // !_WIN32 if (IsPartitioned()) { sprintf(tfn, fn, GetPartName()); diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index 34b844f59b0..2b288e3cdc6 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -6,24 +6,24 @@ /* This file contains the JAVA connection classes functions. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) // This is needed for RegGetValue #define _WINVER 0x0601 #undef _WIN32_WINNT #define _WIN32_WINNT 0x0601 -#endif // __WIN__ +#endif // _WIN32 /***********************************************************************/ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include //#include -#if defined(__WIN__) +#if defined(_WIN32) #include // for getcwd #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #else // !UNIX @@ -31,7 +31,7 @@ #include #include // for getenv #define NODW -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Required objects includes. */ @@ -47,9 +47,9 @@ #include "valblk.h" #include "osutil.h" -#if defined(__WIN__) +#if defined(_WIN32) extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // __WIN__ +#endif // _WIN32 #define nullptr 0 //TYPCONV GetTypeConv(); @@ -200,11 +200,11 @@ int JAVAConn::GetMaxValue(int n) void JAVAConn::ResetJVM(void) { if (LibJvm) { -#if defined(__WIN__) +#if defined(_WIN32) FreeLibrary((HMODULE)LibJvm); -#else // !__WIN__ +#else // !_WIN32 dlclose(LibJvm); -#endif // !__WIN__ +#endif // !_WIN32 LibJvm = NULL; CreateJavaVM = NULL; GetCreatedJavaVMs = NULL; @@ -227,7 +227,7 @@ bool JAVAConn::GetJVM(PGLOBAL g) if (!LibJvm) { char soname[512]; -#if defined(__WIN__) +#if defined(_WIN32) for (ntry = 0; !LibJvm && ntry < 3; ntry++) { if (!ntry && JvmPath) { strcat(strcpy(soname, JvmPath), "\\jvm.dll"); @@ -295,7 +295,7 @@ bool JAVAConn::GetJVM(PGLOBAL g) LibJvm = NULL; #endif // _DEBUG } // endif LibJvm -#else // !__WIN__ +#else // !_WIN32 const char *error = NULL; for (ntry = 0; !LibJvm && ntry < 2; ntry++) { @@ -336,7 +336,7 @@ bool JAVAConn::GetJVM(PGLOBAL g) LibJvm = NULL; #endif // _DEBUG } // endif LibJvm -#endif // !__WIN__ +#endif // !_WIN32 } // endif LibJvm @@ -378,7 +378,7 @@ bool JAVAConn::Open(PGLOBAL g) char *cp = NULL; char sep; -#if defined(__WIN__) +#if defined(_WIN32) sep = ';'; #define N 1 //#define N 2 diff --git a/storage/connect/javaconn.h b/storage/connect/javaconn.h index 73812f6ab3b..963b8c1a6ac 100644 --- a/storage/connect/javaconn.h +++ b/storage/connect/javaconn.h @@ -27,9 +27,9 @@ //efine MAX_CURSOR_NAME 18 // Max size of a cursor name //efine DEFAULT_FIELD_TYPE 0 // TYPE_NULL -#if !defined(__WIN__) +#if !defined(_WIN32) typedef unsigned char *PUCHAR; -#endif // !__WIN__ +#endif // !_WIN32 enum JCATINFO { JCAT_TAB = 1, // JDBC Tables @@ -104,11 +104,11 @@ public: protected: // Members -#if defined(__WIN__) +#if defined(_WIN32) static HANDLE LibJvm; // Handle to the jvm DLL -#else // !__WIN__ +#else // !_WIN32 static void *LibJvm; // Handle for the jvm shared library -#endif // !__WIN__ +#endif // !_WIN32 static CRTJVM CreateJavaVM; static GETJVM GetCreatedJavaVMs; #if defined(_DEBUG) diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index 2cb75e0adc1..20918745316 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -6,19 +6,19 @@ /* This file contains the JDBC connection classes functions. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) // This is needed for RegGetValue #define _WINVER 0x0601 #undef _WIN32_WINNT #define _WIN32_WINNT 0x0601 -#endif // __WIN__ +#endif // _WIN32 /***********************************************************************/ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include #include -#if defined(__WIN__) +#if defined(_WIN32) //nclude //nclude #include // for getcwd @@ -26,7 +26,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #else // !UNIX @@ -36,7 +36,7 @@ #include // for getenv //nclude #define NODW -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Required objects includes. */ @@ -53,9 +53,9 @@ #include "osutil.h" -//#if defined(__WIN__) +//#if defined(_WIN32) //extern "C" HINSTANCE s_hModule; // Saved module handle -//#endif // __WIN__ +//#endif // _WIN32 #define nullptr 0 TYPCONV GetTypeConv(); diff --git a/storage/connect/jmgfam.cpp b/storage/connect/jmgfam.cpp index d7f469cf4fe..670781da6f5 100644 --- a/storage/connect/jmgfam.cpp +++ b/storage/connect/jmgfam.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include //#include //#include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) || defined(UNIV_LINUX) //#include #include @@ -36,7 +36,7 @@ //#include #endif // !UNIX //#include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index b376a8c5c27..9b7145bb498 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -23,7 +23,7 @@ #define ARGS MY_MIN(24,(int)len-i),s+MY_MAX(i-3,0) -#if defined(__WIN__) +#if defined(_WIN32) #define EL "\r\n" #else #define EL "\n" diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index f95f3adcc6e..93cd0bcb5e1 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -2,11 +2,11 @@ /* MACUTIL: Author Olivier Bertrand -- 2008-2012 */ /* From the article and sample code by Khalid Shaikh. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) #include "my_global.h" -#else // !__WIN__ +#else // !_WIN32 #error This is WINDOWS only DLL -#endif // !__WIN__ +#endif // !_WIN32 #include "global.h" #include "plgdbsem.h" #include "macutil.h" diff --git a/storage/connect/macutil.h b/storage/connect/macutil.h index c80bd58e20a..69a785dc9da 100644 --- a/storage/connect/macutil.h +++ b/storage/connect/macutil.h @@ -1,10 +1,10 @@ // MACUTIL.H Olivier Bertrand 2008-2012 // Get Mac Addresses via GetAdaptersInfo -#if defined(__WIN__) +#if defined(_WIN32) #include -#else // !__WIN__ +#else // !_WIN32 #error This is WINDOWS only -#endif // !__WIN__ +#endif // !_WIN32 #include "block.h" typedef class MACINFO *MACIP; diff --git a/storage/connect/maputil.cpp b/storage/connect/maputil.cpp index 87263b3adf6..e4ad70f5032 100644 --- a/storage/connect/maputil.cpp +++ b/storage/connect/maputil.cpp @@ -14,7 +14,7 @@ #include "plgdbsem.h" #include "maputil.h" -#ifdef __WIN__ +#ifdef _WIN32 /***********************************************************************/ /* In Insert mode, just open the file for append. Otherwise */ /* create the mapping file object. The map handle can be released */ diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 4a7e65eb01f..d4b182b4c64 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -62,10 +62,10 @@ #include "tabvct.h" #endif // VCT_SUPPORT #include "tabsys.h" -#if defined(__WIN__) +#if defined(_WIN32) #include "tabmac.h" #include "tabwmi.h" -#endif // __WIN__ +#endif // _WIN32 //#include "tabtbl.h" #include "tabxcl.h" #include "tabtbl.h" @@ -105,9 +105,9 @@ /***********************************************************************/ /* Extern static variables. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // !__WIN__ +#endif // !_WIN32 #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) bool MongoEnabled(void); #endif // JAVA_SUPPORT || CMGO_SUPPORT @@ -161,10 +161,10 @@ TABTYPE GetTypeID(const char *type) : (!stricmp(type, "MYSQL")) ? TAB_MYSQL : (!stricmp(type, "MYPRX")) ? TAB_MYSQL : (!stricmp(type, "DIR")) ? TAB_DIR -#if defined(__WIN__) +#if defined(_WIN32) : (!stricmp(type, "MAC")) ? TAB_MAC : (!stricmp(type, "WMI")) ? TAB_WMI -#endif // __WIN__ +#endif // _WIN32 : (!stricmp(type, "TBL")) ? TAB_TBL : (!stricmp(type, "XCOL")) ? TAB_XCL : (!stricmp(type, "OCCUR")) ? TAB_OCCUR @@ -383,11 +383,11 @@ uint GetFuncID(const char *func) /***********************************************************************/ CATALOG::CATALOG(void) { -#if defined(__WIN__) +#if defined(_WIN32) //DataPath= ".\\"; -#else // !__WIN__ +#else // !_WIN32 //DataPath= "./"; -#endif // !__WIN__ +#endif // !_WIN32 memset(&Ctb, 0, sizeof(CURTAB)); Cbuf= NULL; Cblen= 0; @@ -481,10 +481,10 @@ PTABDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am) #if defined(JAVA_SUPPORT) case TAB_JDBC: tdp= new(g) JDBCDEF; break; #endif // JAVA_SUPPORT -#if defined(__WIN__) +#if defined(_WIN32) case TAB_MAC: tdp= new(g) MACDEF; break; case TAB_WMI: tdp= new(g) WMIDEF; break; -#endif // __WIN__ +#endif // _WIN32 case TAB_OEM: tdp= new(g) OEMDEF; break; case TAB_TBL: tdp= new(g) TBLDEF; break; case TAB_XCL: tdp= new(g) XCLDEF; break; diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 4303a9e191b..945c4e698be 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -35,11 +35,11 @@ #include "my_sys.h" #include "mysqld_error.h" #endif // !MYSQL_PREPARED_STATEMENTS -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include "osutil.h" -#endif // !__WIN__ +#endif // !_WIN32 #include "global.h" #include "plgdbsem.h" @@ -492,15 +492,15 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db, //mysql_options(m_DB, MYSQL_OPT_READ_TIMEOUT, &nrt); //mysql_options(m_DB, MYSQL_OPT_WRITE_TIMEOUT, ...); -#if defined(__WIN__) +#if defined(_WIN32) if (!strcmp(host, ".")) { mysql_options(m_DB, MYSQL_OPT_NAMED_PIPE, NULL); pipe = mysqld_unix_port; } // endif host -#else // !__WIN__ +#else // !_WIN32 if (!strcmp(host, "localhost")) pipe = mysqld_unix_port; -#endif // !__WIN__ +#endif // !_WIN32 #if 0 if (pwd && !strcmp(pwd, "*")) { diff --git a/storage/connect/myconn.h b/storage/connect/myconn.h index 9ebd37527a6..5f64f933878 100644 --- a/storage/connect/myconn.h +++ b/storage/connect/myconn.h @@ -7,24 +7,24 @@ /* DO NOT define DLL_EXPORT in your application so these items are */ /* declared are imported from the Myconn DLL. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) #include -#else // !__WIN__ +#else // !_WIN32 #include -#endif // !__WIN__ +#endif // !_WIN32 #include #include #include "myutil.h" -#if defined(__WIN__) && defined(MYCONN_EXPORTS) +#if defined(_WIN32) && defined(MYCONN_EXPORTS) #if defined(DLL_EXPORT) #define DllItem _declspec(dllexport) #else // !DLL_EXPORT #define DllItem _declspec(dllimport) #endif // !DLL_EXPORT -#else // !__WIN__ || !MYCONN_EXPORTS +#else // !_WIN32 || !MYCONN_EXPORTS #define DllItem -#endif // !__WIN__ +#endif // !_WIN32 #define MYSQL_ENABLED 0x00000001 #define MYSQL_LOGON 0x00000002 diff --git a/storage/connect/mysql-test/connect/r/jdbc.result b/storage/connect/mysql-test/connect/r/jdbc.result index 0dbdf851860..b42311b8136 100644 --- a/storage/connect/mysql-test/connect/r/jdbc.result +++ b/storage/connect/mysql-test/connect/r/jdbc.result @@ -1,4 +1,5 @@ -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; CREATE DATABASE connect; USE connect; CREATE TABLE t2 ( @@ -16,7 +17,7 @@ id msg tm dt dtm ts # Testing JDBC connection to MySQL driver # USE test; -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false'; SELECT * FROM t1; id msg tm dt dtm ts 455000000000 A very big number 18:10:25 2016-03-16 1999-12-11 23:01:52 2015-07-24 09:32:45 @@ -26,7 +27,7 @@ Note 1105 t2: 1 affected rows SELECT * FROM t1; id msg tm dt dtm ts 455000000000 A very big number 18:10:25 2016-03-16 1999-12-11 23:01:52 2015-07-24 09:32:45 -786325481247 Hello! 19:45:03 1933-08-09 1985-11-12 09:02:44 2014-06-17 10:32:01 +786325481247 Hello! 19:45:03 1933-08-10 1985-11-12 09:02:44 2014-06-17 10:32:01 DELETE FROM t1 WHERE msg = 'Hello!'; Warnings: Note 1105 t2: 1 affected rows @@ -37,7 +38,7 @@ DROP TABLE t1; # # Testing JDBC view # -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false'; SELECT * FROM t1; id msg tm dt 455000000000 A very big number 18:10:25 2016-03-16 @@ -74,7 +75,7 @@ SELECT * FROM t3; name city birth hired Donald Atlanta 1999-04-01 2016-03-31 Mick New York 1980-01-20 2002-09-11 -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root' OPTION_LIST='scrollable=1'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false' OPTION_LIST='scrollable=1'; SELECT * FROM t1; name city birth hired John Boston 1986-01-25 2010-06-02 @@ -100,9 +101,9 @@ George San Jose 1981-08-10 2010-06-02 Sam Chicago 1979-11-22 2007-10-10 James Dallas 1992-05-13 2009-12-14 Bill Boston 1986-09-11 2008-02-10 -Donald Atlanta 1999-03-31 2016-03-30 -Mick New York 1980-01-20 2002-09-10 -Tom Seatle 2002-03-15 1970-01-01 +Donald Atlanta 1999-04-01 2016-03-31 +Mick New York 1980-01-20 2002-09-11 +Tom Seatle 2002-03-15 NULL DROP TABLE t3; # # Testing JDBC join operations @@ -280,3 +281,4 @@ DROP TABLE t1; DROP TABLE connect.tx1; DROP DATABASE connect; SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; diff --git a/storage/connect/mysql-test/connect/r/jdbc_new.result b/storage/connect/mysql-test/connect/r/jdbc_new.result index 33d8bd3b7d8..a47fb9ccaf9 100644 --- a/storage/connect/mysql-test/connect/r/jdbc_new.result +++ b/storage/connect/mysql-test/connect/r/jdbc_new.result @@ -2,7 +2,8 @@ connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; connection master; connection slave; -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; CREATE TABLE t1 (a int, b char(10)); INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); SELECT * FROM t1; @@ -16,31 +17,32 @@ NULL NULL # Testing errors # connection master; -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown&useSSL=false'; ERROR HY000: Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2 CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root&useSSL=false'; ERROR HY000: Connecting: java.sql.SQLSyntaxErrorException: Unknown database 'unknown' rc=-2 CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='unknown' - CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; ERROR HY000: Cannot get columns from unknown SHOW CREATE TABLE t1; ERROR 42S02: Table 'test.t1' doesn't exist CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL, `y` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC SELECT * FROM t1; ERROR HY000: Got error 174 'ExecuteQuery: java.sql.SQLSyntaxErrorException: Unknown column 'x' in 'field list'' from CONNECT DROP TABLE t1; CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; connection slave; ALTER TABLE t1 RENAME t1backup; connection master; @@ -54,13 +56,13 @@ DROP TABLE t1; # Testing SELECT, etc. # CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(10) DEFAULT NULL, `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC' SELECT * FROM t1; a b NULL NULL @@ -70,13 +72,13 @@ NULL NULL 3 test03 DROP TABLE t1; CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='t1' - CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC `TABNAME`='t1' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC `TABNAME`='t1' SELECT * FROM t1; a b NULL NULL @@ -86,13 +88,13 @@ NULL NULL 3 test03 DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL, `b` char(10) NOT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC SELECT * FROM t1; a b 0 @@ -102,13 +104,13 @@ a b 3 test03 DROP TABLE t1; CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` char(10) DEFAULT NULL, `b` int(11) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC SELECT * FROM t1; a b NULL NULL @@ -138,7 +140,7 @@ t1 CREATE TABLE `t1` ( INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265); connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( @@ -150,7 +152,7 @@ t1 CREATE TABLE `t1` ( `f` double(14,0) DEFAULT NULL, `g` double(24,0) DEFAULT NULL, `h` decimal(27,5) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC' SELECT * FROM t1; a b c d e f g h 100 3333 41235 1234567890 235000000000 3 3 3141.59265 @@ -173,13 +175,13 @@ a b Welcome Hello, World connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `a` char(12) DEFAULT NULL, `b` varchar(12) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC' SELECT * FROM t1; a b Welcome Hello, World @@ -209,7 +211,7 @@ a b c d e 2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003 connection master; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC -CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root'; +CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( @@ -218,13 +220,15 @@ t1 CREATE TABLE `t1` ( `c` time DEFAULT NULL, `d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `e` year(4) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC' SELECT * FROM t1; a b c d e -2003-05-27 2003-05-27 11:45:23 10:45:23 2003-05-27 10:45:23 2003 +2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003 DROP TABLE t1; connection slave; DROP TABLE t1; SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; connection master; SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; diff --git a/storage/connect/mysql-test/connect/t/jdbc.test b/storage/connect/mysql-test/connect/t/jdbc.test index 58a527a3e6b..79809f4eaf3 100644 --- a/storage/connect/mysql-test/connect/t/jdbc.test +++ b/storage/connect/mysql-test/connect/t/jdbc.test @@ -1,6 +1,7 @@ -- source windows.inc -- source jdbconn.inc -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; let $MYSQLD_DATADIR= `select @@datadir`; --copy_file $MTR_SUITE_DIR/std_data/girls.txt $MYSQLD_DATADIR/test/girls.txt @@ -27,7 +28,7 @@ SELECT * FROM t2; --echo # USE test; --replace_result $PORT PORT ---eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root' +--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false' SELECT * FROM t1; INSERT INTO t1 VALUES(786325481247, 'Hello!', '19:45:03', '1933-08-10', '1985-11-12 09:02:44', '2014-06-17 10:32:01'); SELECT * FROM t1; @@ -39,7 +40,7 @@ DROP TABLE t1; --echo # Testing JDBC view --echo # --replace_result $PORT PORT ---eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root' +--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false' SELECT * FROM t1; SELECT msg, dt FROM t1; DROP TABLE t1, connect.t2; @@ -67,7 +68,7 @@ INSERT INTO t3 VALUES('Donald','Atlanta','1999-04-01','2016-03-31'),('Mick','New SELECT * FROM t3; --replace_result $PORT PORT ---eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root' OPTION_LIST='scrollable=1' +--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false' OPTION_LIST='scrollable=1' SELECT * FROM t1; UPDATE t1 SET city = 'Phoenix' WHERE name = 'Henry'; INSERT INTO t1 SELECT * FROM t3; @@ -145,4 +146,5 @@ DROP TABLE connect.tx1; DROP DATABASE connect; --remove_file $MYSQLD_DATADIR/test/girls.txt SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; -- source jdbconn_cleanup.inc diff --git a/storage/connect/mysql-test/connect/t/jdbc_new.test b/storage/connect/mysql-test/connect/t/jdbc_new.test index 36e8f36ced0..1eaafdfbf43 100644 --- a/storage/connect/mysql-test/connect/t/jdbc_new.test +++ b/storage/connect/mysql-test/connect/t/jdbc_new.test @@ -9,7 +9,8 @@ connection master; -- source jdbconn.inc connection slave; -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; CREATE TABLE t1 (a int, b char(10)); INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); @@ -19,33 +20,34 @@ SELECT * FROM t1; --echo # Testing errors --echo # connection master; -SET GLOBAL time_zone='+1:00'; +SET GLOBAL time_zone='+0:00'; +SET time_zone='+0:00'; # Bad user name # Suppress "mysql_real_connect failed:" (printed in _DEBUG build) --replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" --error ER_UNKNOWN_ERROR eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown&useSSL=false'; # Bad database name --replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" --error ER_UNKNOWN_ERROR eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/unknown?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/unknown?user=root&useSSL=false'; # Bad table name --replace_result $SLAVE_MYPORT SLAVE_PORT --error ER_UNKNOWN_ERROR eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='unknown' - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --error ER_NO_SUCH_TABLE SHOW CREATE TABLE t1; # Bad column name --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; --error ER_GET_ERRMSG @@ -55,7 +57,7 @@ DROP TABLE t1; # The remote table disappeared --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; connection slave; ALTER TABLE t1 RENAME t1backup; @@ -77,7 +79,7 @@ DROP TABLE t1; # Automatic table structure --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -86,7 +88,7 @@ DROP TABLE t1; # Explicit table structure --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='t1' - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -95,7 +97,7 @@ DROP TABLE t1; # Explicit table structure: remote NULL, local NOT NULL --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -104,7 +106,7 @@ DROP TABLE t1; # Explicit table structure with wrong column types --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -125,7 +127,7 @@ INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.141592 connection master; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -146,7 +148,7 @@ SELECT * FROM t1; connection master; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -167,7 +169,7 @@ SELECT * FROM t1; connection master; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC - CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root'; + CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false'; --replace_result $SLAVE_MYPORT SLAVE_PORT SHOW CREATE TABLE t1; SELECT * FROM t1; @@ -176,8 +178,10 @@ DROP TABLE t1; connection slave; DROP TABLE t1; SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; connection master; SET GLOBAL time_zone=SYSTEM; +SET time_zone=SYSTEM; -- source jdbconn_cleanup.inc diff --git a/storage/connect/myutil.cpp b/storage/connect/myutil.cpp index ed25abc4bc5..1c73ded5e05 100644 --- a/storage/connect/myutil.cpp +++ b/storage/connect/myutil.cpp @@ -13,11 +13,11 @@ /************************************************************************/ #include "my_global.h" #include -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include "osutil.h" -#endif // !__WIN__ +#endif // !_WIN32 #include "global.h" #include "plgdbsem.h" diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index d08c6d1b7a5..5b20b33e240 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -11,7 +11,7 @@ /***********************************************************************/ #include #include -#if defined(__WIN__) +#if defined(_WIN32) //nclude //nclude #include // for getcwd @@ -45,13 +45,13 @@ #include "osutil.h" -#if defined(__WIN__) +#if defined(_WIN32) /***********************************************************************/ /* For dynamic load of ODBC32.DLL */ /***********************************************************************/ #pragma comment(lib, "odbc32.lib") extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // __WIN__ +#endif // _WIN32 TYPCONV GetTypeConv(); int GetConvSize(); @@ -1280,15 +1280,15 @@ bool ODBConn::DriverConnect(DWORD Options) SWORD nResult; PUCHAR ConnOut = (PUCHAR)PlugSubAlloc(m_G, NULL, MAX_CONNECT_LEN); UWORD wConnectOption = SQL_DRIVER_COMPLETE; -#if defined(__WIN__) +#if defined(_WIN32) HWND hWndTop = GetForegroundWindow(); HWND hWnd = GetParent(hWndTop); if (hWnd == NULL) hWnd = GetDesktopWindow(); -#else // !__WIN__ +#else // !_WIN32 HWND hWnd = (HWND)1; -#endif // !__WIN__ +#endif // !_WIN32 PGLOBAL& g = m_G; PDBUSER dup = PlgGetUser(g); @@ -1301,10 +1301,10 @@ bool ODBConn::DriverConnect(DWORD Options) SQL_NTS, ConnOut, MAX_CONNECT_LEN, &nResult, wConnectOption); -#if defined(__WIN__) +#if defined(_WIN32) if (hWndTop) EnableWindow(hWndTop, true); -#endif // __WIN__ +#endif // _WIN32 // If user hit 'Cancel' if (rc == SQL_NO_DATA_FOUND) { diff --git a/storage/connect/odbconn.h b/storage/connect/odbconn.h index f98c67bd12f..7038f06e5f3 100644 --- a/storage/connect/odbconn.h +++ b/storage/connect/odbconn.h @@ -29,9 +29,9 @@ //efine MAX_CURSOR_NAME 18 // Max size of a cursor name //efine DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type -#if !defined(__WIN__) +#if !defined(_WIN32) typedef unsigned char *PUCHAR; -#endif // !__WIN__ +#endif // !_WIN32 // Field Flags, used to indicate status of fields //efine SQL_FIELD_FLAG_DIRTY 0x1 diff --git a/storage/connect/os.h b/storage/connect/os.h index 797692d47b2..7d0d5cabbb6 100644 --- a/storage/connect/os.h +++ b/storage/connect/os.h @@ -16,19 +16,19 @@ typedef off_t off64_t; #endif #endif -#if defined(__WIN__) +#if defined(_WIN32) typedef __int64 BIGINT; typedef _Null_terminated_ const char *PCSZ; -#else // !__WIN__ +#else // !_WIN32 typedef longlong BIGINT; #define FILE_BEGIN SEEK_SET #define FILE_CURRENT SEEK_CUR #define FILE_END SEEK_END typedef const char *PCSZ; -#endif // !__WIN__ +#endif // !_WIN32 -#if !defined(__WIN__) +#if !defined(_WIN32) typedef const void *LPCVOID; typedef const char *LPCTSTR; typedef const char *LPCSTR; @@ -65,6 +65,6 @@ typedef int HANDLE; #define _MAX_EXT FN_EXTLEN #define INVALID_HANDLE_VALUE (-1) #define __stdcall -#endif /* !__WIN__ */ +#endif /* !_WIN32 */ #endif /* _OS_H_INCLUDED */ diff --git a/storage/connect/osutil.c b/storage/connect/osutil.c index da896fec50e..278023f55a2 100644 --- a/storage/connect/osutil.c +++ b/storage/connect/osutil.c @@ -5,7 +5,7 @@ #include #include "osutil.h" -#ifdef __WIN__ +#ifdef _WIN32 my_bool CloseFileHandle(HANDLE h) { return !CloseHandle(h); diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index dd204d065ed..370bf69ffa0 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -581,11 +581,11 @@ typedef struct _colres { char Var; /* Type added information */ } COLRES; -#if defined(__WIN__) && !defined(NOEX) +#if defined(_WIN32) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !__WIN__ +#else // !_WIN32 #define DllExport -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Utility routines. */ diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 7bc7c5f592b..6c1ce4ad6d3 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -39,12 +39,12 @@ /***********************************************************************/ #include "my_global.h" #include "my_pthread.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include #define BIGMEM 1048576 // 1 Megabyte -#else // !__WIN__ +#else // !_WIN32 #include #include //#if defined(THREAD) @@ -52,7 +52,7 @@ //#endif // THREAD #include #define BIGMEM 2147483647 // Max int value -#endif // !__WIN__ +#endif // !_WIN32 #include /***********************************************************************/ @@ -89,11 +89,11 @@ extern "C" { extern char version[]; } // extern "C" -//#if defined(__WIN__) +//#if defined(_WIN32) //extern CRITICAL_SECTION parsec; // Used calling the Flex parser -//#else // !__WIN__ +//#else // !_WIN32 extern pthread_mutex_t parmut; -//#endif // !__WIN__ +//#endif // !_WIN32 // The debug trace used by the main thread FILE *pfile = NULL; @@ -386,11 +386,11 @@ char *SetPath(PGLOBAL g, const char *path) } // endif path if (*path != '.') { -#if defined(__WIN__) +#if defined(_WIN32) const char *s = "\\"; -#else // !__WIN__ +#else // !_WIN32 const char *s = "/"; -#endif // !__WIN__ +#endif // !_WIN32 strcat(strcat(strcat(strcpy(buf, "."), s), path), s); } else strcpy(buf, path); @@ -409,7 +409,7 @@ char *ExtractFromPath(PGLOBAL g, char *pBuff, char *FileName, OPVAL op) char *drive = NULL, *direc = NULL, *fname = NULL, *ftype = NULL; switch (op) { // Determine which part to extract -#if defined(__WIN__) +#if defined(_WIN32) case OP_FDISK: drive = pBuff; break; #endif // !UNIX case OP_FPATH: direc = pBuff; break; @@ -1249,7 +1249,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) // For allocations greater than one fourth of remaining storage // in the area, do allocate from virtual storage. const char*v = "malloc"; -#if defined(__WIN__) +#if defined(_WIN32) if (mp.Size >= BIGMEM) { v = "VirtualAlloc"; mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); @@ -1352,7 +1352,7 @@ void PlgDBfree(MBLOCK& mp) { if (!mp.Sub && mp.Memp) { const char*v = "free"; -#if defined(__WIN__) +#if defined(_WIN32) if (mp.Size >= BIGMEM) { v = "VirtualFree"; VirtualFree(mp.Memp, 0, MEM_RELEASE); @@ -1554,11 +1554,11 @@ int FileComp(PGLOBAL g, char *file1, char *file2) bp[0] = buff1; bp[1] = buff2; for (i = 0; i < 2; i++) { -#if defined(__WIN__) +#if defined(_WIN32) h[i]= global_open(g, MSGID_NONE, fn[i], _O_RDONLY | _O_BINARY); -#else // !__WIN__ +#else // !_WIN32 h[i]= global_open(g, MSGOD_NONE, fn[i], O_RDONLY); -#endif // !__WIN__ +#endif // !_WIN32 if (h[i] == -1) { // if (errno != ENOENT) { diff --git a/storage/connect/plugutil.cpp b/storage/connect/plugutil.cpp index 9e1f006d605..4aecbadfc6a 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -44,7 +44,7 @@ /* */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include #else #if defined(UNIX) || defined(UNIV_LINUX) @@ -81,9 +81,9 @@ #include "rcmsg.h" #endif // NEWMSG -#if defined(__WIN__) +#if defined(_WIN32) extern HINSTANCE s_hModule; /* Saved module handle */ -#endif // __WIN__ +#endif // _WIN32 #if defined(XMSG) extern char *msg_path; @@ -205,7 +205,7 @@ PGLOBAL PlugExit(PGLOBAL g) /***********************************************************************/ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) { -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -232,7 +232,7 @@ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) BOOL PlugIsAbsolutePath(LPCSTR path) { -#if defined(__WIN__) +#if defined(_WIN32) return ((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) && path[1] == ':'; #else @@ -250,7 +250,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) char direc[_MAX_DIR], defdir[_MAX_DIR], tmpdir[_MAX_DIR]; char fname[_MAX_FNAME]; char ftype[_MAX_EXT]; -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE], defdrv[_MAX_DRIVE]; #else char *drive = NULL, *defdrv = NULL; @@ -270,7 +270,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) return pBuff; } // endif -#if !defined(__WIN__) +#if !defined(_WIN32) if (*FileName == '~') { if (_fullpath(pBuff, FileName, _MAX_PATH)) { if (trace(2)) @@ -281,7 +281,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) return FileName; // Error, return unchanged name } // endif FileName -#endif // !__WIN__ +#endif // !_WIN32 if (prefix && strcmp(prefix, ".") && !PlugIsAbsolutePath(defpath)) { @@ -310,7 +310,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) if (trace(2)) { htrc("after _splitpath: FileName=%s\n", FileName); -#if defined(__WIN__) +#if defined(_WIN32) htrc("drive=%s dir=%s fname=%s ext=%s\n", drive, direc, fname, ftype); htrc("defdrv=%s defdir=%s\n", defdrv, defdir); #else @@ -442,7 +442,7 @@ char *PlugGetMessage(PGLOBAL g, int mid) } // end of PlugGetMessage #endif // NEWMSG -#if defined(__WIN__) +#if defined(_WIN32) /***********************************************************************/ /* Return the line length of the console screen buffer. */ /***********************************************************************/ @@ -454,7 +454,7 @@ short GetLineLength(PGLOBAL g) return (b) ? coninfo.dwSize.X : 0; } // end of GetLineLength -#endif // __WIN__ +#endif // _WIN32 /***********************************************************************/ /* Program for memory allocation of work and language areas. */ @@ -464,7 +464,7 @@ bool AllocSarea(PGLOBAL g, size_t size) /*********************************************************************/ /* This is the allocation routine for the WIN32/UNIX/AIX version. */ /*********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) if (size >= 1048576) // 1M g->Sarea = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); else @@ -500,7 +500,7 @@ bool AllocSarea(PGLOBAL g, size_t size) void FreeSarea(PGLOBAL g) { if (g->Sarea) { -#if defined(__WIN__) +#if defined(_WIN32) if (g->Sarea_Size >= 1048576) // 1M VirtualFree(g->Sarea, 0, MEM_RELEASE); else diff --git a/storage/connect/rcmsg.c b/storage/connect/rcmsg.c index 895f8f5862b..4cd443d88bb 100644 --- a/storage/connect/rcmsg.c +++ b/storage/connect/rcmsg.c @@ -21,9 +21,9 @@ #include "msgid.h" #endif // NEWMSG -#if !defined(__WIN__) +#if !defined(_WIN32) #define stricmp strcasecmp -#endif // !__WIN__ +#endif // !_WIN32 char *msglang(void); diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index bb25d4803d9..d7715a2ea9f 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -17,7 +17,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #else //#include // dlopen(), dlclose(), dlsym() ... @@ -52,9 +52,9 @@ #include "ha_connect.h" #include "mycat.h" -#if !defined(__WIN__) +#if !defined(_WIN32) extern handlerton *connect_hton; -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* External function. */ @@ -71,11 +71,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) typedef PQRYRES(__stdcall* XCOLDEF) (PGLOBAL, void*, char*, char*, bool); const char* module, * subtype; char c, soname[_MAX_PATH], getname[40] = "Col"; -#if defined(__WIN__) +#if defined(_WIN32) HANDLE hdll; /* Handle to the external DLL */ -#else // !__WIN__ +#else // !_WIN32 void* hdll; /* Handle for the loaded shared library */ -#endif // !__WIN__ +#endif // !_WIN32 XCOLDEF coldef = NULL; PQRYRES qrp = NULL; @@ -103,7 +103,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) if (!c) break; } // endfor i -#if defined(__WIN__) +#if defined(_WIN32) // Load the Dll implementing the table if (!(hdll = LoadLibrary(soname))) { char buf[256]; @@ -123,7 +123,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) FreeLibrary((HMODULE)hdll); return NULL; } // endif coldef -#else // !__WIN__ +#else // !_WIN32 const char* error = NULL; // Load the desired shared library @@ -140,7 +140,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) dlclose(hdll); return NULL; } // endif coldef -#endif // !__WIN__ +#endif // !_WIN32 // Just in case the external Get function does not set error messages sprintf(g->Message, "Error getting column info from %s", subtype); @@ -148,11 +148,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info) // Get the table column definition qrp = coldef(g, topt, tab, db, info); -#if defined(__WIN__) +#if defined(_WIN32) FreeLibrary((HMODULE)hdll); -#else // !__WIN__ +#else // !_WIN32 dlclose(hdll); -#endif // !__WIN__ +#endif // !_WIN32 return qrp; } // end of OEMColumns @@ -407,13 +407,13 @@ int TABDEF::GetColCatInfo(PGLOBAL g) // Take care of the column definitions i= poff= nof= nlg= 0; -#if defined(__WIN__) +#if defined(_WIN32) // Offsets of HTML and DIR tables start from 0, DBF at 1 loff= (trf == RECFM_DBF) ? 1 : (trf == RECFM_XML || trf == RECFM_DIR) ? -1 : 0; -#else // !__WIN__ +#else // !_WIN32 // Offsets of HTML tables start from 0, DIR and DBF at 1 loff = (trf == RECFM_DBF || trf == RECFM_DIR) ? 1 : (trf == RECFM_XML) ? -1 : 0; -#endif // !__WIN__ +#endif // !_WIN32 while (true) { // Default Offset depends on table format @@ -624,7 +624,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) strncat(strcpy(soname, GetPluginDir()), Module, sizeof(soname) - strlen(soname) - 1); -#if defined(__WIN__) +#if defined(_WIN32) // Is the DLL already loaded? if (!Hdll && !(Hdll = GetModuleHandle(soname))) // No, load the Dll implementing the function @@ -660,7 +660,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) FreeLibrary((HMODULE)Hdll); return NULL; } // endif getdef -#else // !__WIN__ +#else // !_WIN32 const char *error = NULL; #if 0 // Don't know what all this stuff does @@ -702,7 +702,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) dlclose(Hdll); return NULL; } // endif getdef -#endif // !__WIN__ +#endif // !_WIN32 // Just in case the external Get function does not set error messages sprintf(g->Message, MSG(DEF_ALLOC_ERROR), Subtype); diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 73e178ed51c..1b81ae9e3b3 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -146,11 +146,11 @@ class DllExport OEMDEF : public TABDEF { /* OEM table */ PTABDEF GetXdef(PGLOBAL g); // Members -#if defined(__WIN__) +#if defined(_WIN32) HANDLE Hdll; /* Handle to the external DLL */ -#else // !__WIN__ +#else // !_WIN32 void *Hdll; /* Handle for the loaded shared library */ -#endif // !__WIN__ +#endif // !_WIN32 PTABDEF Pxdef; /* Pointer to the external TABDEF class */ char *Module; /* Path/Name of the DLL implenting it */ char *Subtype; /* The name of the OEM table sub type */ diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index 6c42ab2c810..d2485bdc8ac 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include // For testing only #include @@ -26,7 +26,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -34,7 +34,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -233,11 +233,11 @@ void DOSDEF::RemoveOptValues(PGLOBAL g) // Delete any eventually ill formed non matching optimization file if (!GetOptFileName(g, filename)) -#if defined(__WIN__) +#if defined(_WIN32) DeleteFile(filename); #else // UNIX remove(filename); -#endif // __WIN__ +#endif // _WIN32 Optimized = 0; } // end of RemoveOptValues @@ -279,7 +279,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) /*********************************************************************/ if (sep) { // Indexes are save in separate files -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -296,7 +296,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) strcat(strcat(fname, "_"), pxdf->GetName()); _makepath(filename, drive, direc, fname, ftype); PlugSetPath(filename, filename, GetPath()); -#if defined(__WIN__) +#if defined(_WIN32) if (!DeleteFile(filename)) rc |= (GetLastError() != ERROR_FILE_NOT_FOUND); #else // UNIX @@ -313,7 +313,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) // Drop all indexes, delete the common file PlugSetPath(filename, Ofn, GetPath()); strcat(PlugRemoveType(filename, filename), ftype); -#if defined(__WIN__) +#if defined(_WIN32) if (!DeleteFile(filename)) rc = (GetLastError() != ERROR_FILE_NOT_FOUND); #else // UNIX @@ -1026,7 +1026,7 @@ bool TDBDOS::GetBlockValues(PGLOBAL g) #if 0 if (Mode == MODE_INSERT && Txfp->GetAmType() == TYPE_AM_DOS) return false; -#endif // __WIN__ +#endif // _WIN32 if (defp->Optimized || !(dup->Check & CHK_OPT)) return false; // Already done or to be redone diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp index e9c7b2490d8..698f792b1f4 100644 --- a/storage/connect/tabext.cpp +++ b/storage/connect/tabext.cpp @@ -14,7 +14,7 @@ #include "sql_class.h" #include "sql_servers.h" #include "sql_string.h" -#if !defined(__WIN__) +#if !defined(_WIN32) #include "osutil.h" #endif diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index 4a0a75460cd..5deb5fd0d40 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -17,7 +17,7 @@ /* Include relevant section of system dependant header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -35,7 +35,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index 9a1e43dd798..cc49fdf9db7 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -20,7 +20,7 @@ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include @@ -156,14 +156,14 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) p = (char*)GetStringTableOption(g, topt, "Separator", ","); tdp->Sep = (strlen(p) == 2 && p[0] == '\\' && p[1] == 't') ? '\t' : *p; -#if defined(__WIN__) +#if defined(_WIN32) if (tdp->Sep == ',' || strnicmp(setlocale(LC_NUMERIC, NULL), "French", 6)) dechar = '.'; else dechar = ','; -#else // !__WIN__ +#else // !_WIN32 dechar = '.'; -#endif // !__WIN__ +#endif // !_WIN32 sep = tdp->Sep; tdp->Quoted = GetIntegerTableOption(g, topt, "Quoted", -1); diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index 06b6b3a9730..7a8eedad12b 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -38,7 +38,7 @@ #include "my_global.h" #include "sql_class.h" #include "sql_servers.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabmac.cpp b/storage/connect/tabmac.cpp index 8260ab65391..ed161ac4be1 100644 --- a/storage/connect/tabmac.cpp +++ b/storage/connect/tabmac.cpp @@ -3,12 +3,12 @@ /* From the article and sample code by Khalid Shaikh. */ /* TABMAC: virtual table to get the list of MAC addresses. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) #include "my_global.h" //#include -#else // !__WIN__ +#else // !_WIN32 #error This is a WINDOWS only table type -#endif // !__WIN__ +#endif // !_WIN32 #include "global.h" #include "plgdbsem.h" //#include "catalog.h" diff --git a/storage/connect/tabmac.h b/storage/connect/tabmac.h index 47565bb2541..68135edb95f 100644 --- a/storage/connect/tabmac.h +++ b/storage/connect/tabmac.h @@ -1,11 +1,11 @@ // TABMAC.H Olivier Bertrand 2011-2012 // MAC: virtual table to Get Mac Addresses via GetAdaptersInfo -#if defined(__WIN__) +#if defined(_WIN32) #include #include -#else // !__WIN__ +#else // !_WIN32 #error This is a WINDOWS only table TYPE -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Definitions. */ diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 649fc6706c6..d10f3cfab67 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -37,7 +37,7 @@ /* Include relevant section of system dependant header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) @@ -166,11 +166,11 @@ bool TDBMUL::InitFileNames(PGLOBAL g) while (true) if ((rc = dirp->ReadDB(g)) == RC_OK) { -#if defined(__WIN__) +#if defined(_WIN32) strcat(strcpy(filename, dirp->Drive), dirp->Direc); -#else // !__WIN__ +#else // !_WIN32 strcpy(filename, dirp->Direc); -#endif // !__WIN__ +#endif // !_WIN32 strcat(strcat(filename, dirp->Fname), dirp->Ftype); pfn[n++] = PlugDup(g, filename); } else @@ -199,7 +199,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) p = filename + strlen(filename) - 1; -#if !defined(__WIN__) +#if !defined(_WIN32) // Data files can be imported from Windows (having CRLF) if (*p == '\n' || *p == '\r') { // is this enough for Unix ??? @@ -566,11 +566,11 @@ bool TDBMSD::InitFileNames(PGLOBAL g) while (true) if ((rc = dirp->ReadDB(g)) == RC_OK) { -#if defined(__WIN__) +#if defined(_WIN32) strcat(strcpy(filename, dirp->Drive), dirp->Direc); -#else // !__WIN__ +#else // !_WIN32 strcpy(filename, dirp->Direc); -#endif // !__WIN__ +#endif // !_WIN32 strcat(strcat(filename, dirp->Fname), dirp->Ftype); pfn[n++] = PlugDup(g, filename); } else @@ -634,18 +634,18 @@ PTDB DIRDEF::GetTable(PGLOBAL g, MODE) void TDBDIR::Init(void) { iFile = 0; -#if defined(__WIN__) +#if defined(_WIN32) Dvalp = NULL; memset(&FileData, 0, sizeof(_finddata_t)); hSearch = INVALID_HANDLE_VALUE; *Drive = '\0'; -#else // !__WIN__ +#else // !_WIN32 memset(&Fileinfo, 0, sizeof(struct stat)); Entry = NULL; Dir = NULL; Done = false; *Pattern = '\0'; -#endif // !__WIN__ +#endif // !_WIN32 *Fpath = '\0'; *Direc = '\0'; *Fname = '\0'; @@ -674,7 +674,7 @@ char* TDBDIR::Path(PGLOBAL g) PCATLG cat = PlgGetCatalog(g); PTABDEF defp = (PTABDEF)To_Def; -#if defined(__WIN__) +#if defined(_WIN32) if (!*Drive) { PlugSetPath(Fpath, To_File, defp ? defp->GetPath() : NULL); _splitpath(Fpath, Drive, Direc, Fname, Ftype); @@ -682,7 +682,7 @@ char* TDBDIR::Path(PGLOBAL g) _makepath(Fpath, Drive, Direc, Fname, Ftype); // Usefull for TDBSDR return Fpath; -#else // !__WIN__ +#else // !_WIN32 if (!Done) { PlugSetPath(Fpath, To_File, defp ? defp->GetPath() : NULL); _splitpath(Fpath, NULL, Direc, Fname, Ftype); @@ -691,7 +691,7 @@ char* TDBDIR::Path(PGLOBAL g) } // endif Done return Pattern; -#endif // !__WIN__ +#endif // !_WIN32 } // end of Path /***********************************************************************/ @@ -709,7 +709,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) { if (MaxSize < 0) { int rc, n = -1; -#if defined(__WIN__) +#if defined(_WIN32) // Start searching files in the target directory. hSearch = FindFirstFile(Path(g), &FileData); @@ -750,7 +750,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) // Close the search handle. FindClose(hSearch); -#else // !__WIN__ +#else // !_WIN32 Path(g); // Start searching files in the target directory. @@ -774,7 +774,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) // Close the DIR handle. closedir(Dir); -#endif // !__WIN__ +#endif // !_WIN32 MaxSize = n; } // endif MaxSize @@ -800,10 +800,10 @@ bool TDBDIR::OpenDB(PGLOBAL g) } // endif use Use = USE_OPEN; -#if !defined(__WIN__) +#if !defined(_WIN32) Path(g); // Be sure it is done Dir = NULL; // For ReadDB -#endif // !__WIN__ +#endif // !_WIN32 return false; } // end of OpenDB @@ -814,7 +814,7 @@ int TDBDIR::ReadDB(PGLOBAL g) { int rc = RC_OK; -#if defined(__WIN__) +#if defined(_WIN32) do { if (hSearch == INVALID_HANDLE_VALUE) { /*****************************************************************/ @@ -877,7 +877,7 @@ int TDBDIR::ReadDB(PGLOBAL g) rc = RC_EF; } // endif Entry -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of ReadDB @@ -905,17 +905,17 @@ int TDBDIR::DeleteDB(PGLOBAL g, int) /***********************************************************************/ void TDBDIR::CloseDB(PGLOBAL) { -#if defined(__WIN__) +#if defined(_WIN32) // Close the search handle. FindClose(hSearch); hSearch = INVALID_HANDLE_VALUE; -#else // !__WIN__ +#else // !_WIN32 // Close the DIR handle if (Dir) { closedir(Dir); Dir = NULL; } // endif dir -#endif // !__WIN__ +#endif // !_WIN32 iFile = 0; } // end of CloseDB @@ -950,7 +950,7 @@ DIRCOL::DIRCOL(DIRCOL *col1, PTDB tdbp) : COLBLK(col1, tdbp) N = col1->N; } // end of DIRCOL copy constructor -#if defined(__WIN__) +#if defined(_WIN32) /***********************************************************************/ /* Retrieve time information from FileData. */ /***********************************************************************/ @@ -977,7 +977,7 @@ void DIRCOL::SetTimeValue(PGLOBAL g, FILETIME& ftime) Value->Reset(); } // end of SetTimeValue -#endif // __WIN__ +#endif // _WIN32 /***********************************************************************/ /* ReadColumn: what this routine does is to access the information */ @@ -993,19 +993,19 @@ void DIRCOL::ReadColumn(PGLOBAL g) /* Retrieve the information corresponding to the column number. */ /*********************************************************************/ switch (N) { -#if defined(__WIN__) +#if defined(_WIN32) case 0: Value->SetValue_psz(Tdbp->Drive); break; -#endif // __WIN__ +#endif // _WIN32 case 1: Value->SetValue_psz(Tdbp->Direc); break; case 2: Value->SetValue_psz(Tdbp->Fname); break; case 3: Value->SetValue_psz(Tdbp->Ftype); break; -#if defined(__WIN__) +#if defined(_WIN32) case 4: Value->SetValue((int)Tdbp->FileData.dwFileAttributes); break; case 5: Value->SetValue((int)Tdbp->FileData.nFileSizeLow); break; case 6: SetTimeValue(g, Tdbp->FileData.ftLastWriteTime); break; case 7: SetTimeValue(g, Tdbp->FileData.ftCreationTime); break; case 8: SetTimeValue(g, Tdbp->FileData.ftLastAccessTime); break; -#else // !__WIN__ +#else // !_WIN32 case 4: Value->SetValue((int)Tdbp->Fileinfo.st_mode); break; case 5: Value->SetValue((int)Tdbp->Fileinfo.st_size); break; case 6: Value->SetValue((int)Tdbp->Fileinfo.st_mtime); break; @@ -1013,7 +1013,7 @@ void DIRCOL::ReadColumn(PGLOBAL g) case 8: Value->SetValue((int)Tdbp->Fileinfo.st_atime); break; case 9: Value->SetValue((int)Tdbp->Fileinfo.st_uid); break; case 10: Value->SetValue((int)Tdbp->Fileinfo.st_gid); break; -#endif // !__WIN__ +#endif // !_WIN32 default: sprintf(g->Message, MSG(INV_DIRCOL_OFST), N); throw GetAmType(); @@ -1045,7 +1045,7 @@ int TDBSDR::FindInDir(PGLOBAL g) size_t m = strlen(Direc); // Start searching files in the target directory. -#if defined(__WIN__) +#if defined(_WIN32) HANDLE h; #if defined(PATHMATCHSPEC) @@ -1155,7 +1155,7 @@ int TDBSDR::FindInDir(PGLOBAL g) // Close the search handle. FindClose(h); -#else // !__WIN__ +#else // !_WIN32 int k; DIR *dir = opendir(Direc); @@ -1189,7 +1189,7 @@ int TDBSDR::FindInDir(PGLOBAL g) // Close the DIR handle. closedir(dir); -#endif // !__WIN__ +#endif // !_WIN32 return n; } // end of FindInDir @@ -1205,13 +1205,13 @@ bool TDBSDR::OpenDB(PGLOBAL g) Sub = (PSUBDIR)PlugSubAlloc(g, NULL, sizeof(SUBDIR)); Sub->Next = NULL; Sub->Prev = NULL; -#if defined(__WIN__) +#if defined(_WIN32) Sub->H = INVALID_HANDLE_VALUE; Sub->Len = strlen(Direc); -#else // !__WIN__ +#else // !_WIN32 Sub->D = NULL; Sub->Len = 0; -#endif // !__WIN__ +#endif // !_WIN32 } // endif To_Sub return TDBDIR::OpenDB(g); @@ -1224,7 +1224,7 @@ int TDBSDR::ReadDB(PGLOBAL g) { int rc; -#if defined(__WIN__) +#if defined(_WIN32) again: rc = TDBDIR::ReadDB(g); @@ -1280,7 +1280,7 @@ int TDBSDR::ReadDB(PGLOBAL g) } // endif H } // endif rc -#else // !__WIN__ +#else // !_WIN32 rc = RC_NF; again: @@ -1338,7 +1338,7 @@ int TDBSDR::ReadDB(PGLOBAL g) } // endif Entry -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of ReadDB diff --git a/storage/connect/tabmul.h b/storage/connect/tabmul.h index 8a95a772c41..a9d3f88cc44 100644 --- a/storage/connect/tabmul.h +++ b/storage/connect/tabmul.h @@ -6,14 +6,14 @@ /* */ /* This file contains the TDBMUL and TDBDIR classes declares. */ /***********************************************************************/ -#if defined(__WIN__) +#if defined(_WIN32) #include -#else // !__WIN__ +#else // !_WIN32 #include #include #include #include -#endif // !__WIN__ +#endif // !_WIN32 //#include "osutil.h" #include "block.h" @@ -160,18 +160,18 @@ public: // Members PSZ To_File; // Points to file search pathname int iFile; // Index of currently retrieved file -#if defined(__WIN__) +#if defined(_WIN32) PVAL Dvalp; // Used to retrieve file date values WIN32_FIND_DATA FileData; // Find data structure HANDLE hSearch; // Search handle char Drive[_MAX_DRIVE]; // Drive name -#else // !__WIN__ +#else // !_WIN32 struct stat Fileinfo; // File info structure struct dirent *Entry; // Point to directory entry structure DIR *Dir; // To searched directory structure bool Done; // true when _splipath is done char Pattern[_MAX_FNAME+_MAX_EXT]; -#endif // !__WIN__ +#endif // !_WIN32 char Fpath[_MAX_PATH]; // Absolute file search pattern char Direc[_MAX_DIR]; // Search path char Fname[_MAX_FNAME]; // File name @@ -207,11 +207,11 @@ class TDBSDR : public TDBDIR { typedef struct _Sub_Dir { struct _Sub_Dir *Next; struct _Sub_Dir *Prev; -#if defined(__WIN__) +#if defined(_WIN32) HANDLE H; // Search handle -#else // !__WIN__ +#else // !_WIN32 DIR *D; -#endif // !__WIN__ +#endif // !_WIN32 size_t Len; // Initial directory name length } SUBDIR, *PSUBDIR; @@ -238,9 +238,9 @@ class DIRCOL : public COLBLK { protected: // Default constructor not to be used DIRCOL(void) {} -#if defined(__WIN__) +#if defined(_WIN32) void SetTimeValue(PGLOBAL g, FILETIME& ftime); -#endif // __WIN__ +#endif // _WIN32 // Members PTDBDIR Tdbp; // To DIR table diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 7e165fb5a80..f8f995f211e 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -35,9 +35,9 @@ #include "my_global.h" #include "sql_class.h" #include "sql_servers.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 //#include //#include #include @@ -46,7 +46,7 @@ #include "osutil.h" //#include //#include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 07272d1b298..6bf2bd2b47f 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -13,7 +13,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index ba5c65e2c94..bede19f7344 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -36,7 +36,7 @@ /***********************************************************************/ #include "my_global.h" #include "sql_class.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 9121a0453e5..2dab1cba981 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -17,7 +17,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(__WIN__) +#if defined(_WIN32) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif diff --git a/storage/connect/tabrest.cpp b/storage/connect/tabrest.cpp index 4b6bb6a9e62..3b89d5232b7 100644 --- a/storage/connect/tabrest.cpp +++ b/storage/connect/tabrest.cpp @@ -13,10 +13,10 @@ #include // All MariaDB stuff #include #include -#if !defined(__WIN__) && !defined(_WINDOWS) +#if !defined(_WIN32) && !defined(_WINDOWS) #include #include -#endif // !__WIN__ && !_WINDOWS +#endif // !_WIN32 && !_WINDOWS /***********************************************************************/ /* Include application header files: */ @@ -67,7 +67,7 @@ int Xcurl(PGLOBAL g, PCSZ Http, PCSZ Uri, PCSZ filename) } else strcpy(buf, Http); -#if defined(__WIN__) +#if defined(_WIN32) char cmd[1024]; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -90,7 +90,7 @@ int Xcurl(PGLOBAL g, PCSZ Http, PCSZ Uri, PCSZ filename) sprintf(g->Message, "CreateProcess curl failed (%d)", GetLastError()); rc = 1; } // endif CreateProcess -#else // !__WIN__ +#else // !_WIN32 char fn[600]; pid_t pID; @@ -130,7 +130,7 @@ int Xcurl(PGLOBAL g, PCSZ Http, PCSZ Uri, PCSZ filename) // Parent process wait(NULL); // Wait for the child to terminate } // endif pID -#endif // !__WIN__ +#endif // !_WIN32 return rc; } // end of Xcurl @@ -147,7 +147,7 @@ XGETREST GetRestFunction(PGLOBAL g) if (trace(515)) htrc("Looking for GetRest library\n"); -#if defined(__WIN__) || defined(_WINDOWS) +#if defined(_WIN32) || defined(_WINDOWS) HANDLE Hdll; const char* soname = "GetRest.dll"; // Module name @@ -176,7 +176,7 @@ XGETREST GetRestFunction(PGLOBAL g) FreeLibrary((HMODULE)Hdll); return NULL; } // endif getRestFnc -#else // !__WIN__ +#else // !_WIN32 void* Hso; const char* error = NULL; const char* soname = "GetRest.so"; // Module name @@ -195,7 +195,7 @@ XGETREST GetRestFunction(PGLOBAL g) dlclose(Hso); return NULL; } // endif getdef -#endif // !__WIN__ +#endif // !_WIN32 #else // REST_SOURCE getRestFnc = restGetFile; #endif // REST_SOURCE diff --git a/storage/connect/tabrest.h b/storage/connect/tabrest.h index 9cf2d10a6b8..9066a89b306 100644 --- a/storage/connect/tabrest.h +++ b/storage/connect/tabrest.h @@ -5,12 +5,12 @@ /***********************************************************************/ #pragma once -#if defined(__WIN__) +#if defined(_WIN32) static PCSZ slash = "\\"; -#else // !__WIN__ +#else // !_WIN32 static PCSZ slash = "/"; #define stricmp strcasecmp -#endif // !__WIN__ +#endif // !_WIN32 typedef int(__stdcall* XGETREST) (char*, bool, PCSZ, PCSZ, PCSZ); diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index f73a2b6578d..9a8e4a9c562 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -12,12 +12,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -25,7 +25,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include application header files: */ @@ -36,9 +36,9 @@ #include "global.h" #include "plgdbsem.h" #include "reldef.h" -#if !defined(__WIN__) +#if !defined(_WIN32) #include "osutil.h" -#endif // !__WIN__ +#endif // !_WIN32 #include "filamtxt.h" #include "tabdos.h" #include "tabsys.h" @@ -48,10 +48,10 @@ #define CSZ 36 // Column section name length #define CDZ 256 // Column definition length -#if !defined(__WIN__) +#if !defined(_WIN32) #define GetPrivateProfileSectionNames(S,L,I) \ GetPrivateProfileString(NULL,NULL,"",S,L,I) -#endif // !__WIN__ +#endif // !_WIN32 /* -------------- Implementation of the INI classes ------------------ */ @@ -123,7 +123,7 @@ bool INIDEF::DeleteTableFile(PGLOBAL g) // Delete the INI table file if not protected if (!IsReadOnly()) { PlugSetPath(filename, Fn, GetPath()); -#if defined(__WIN__) +#if defined(_WIN32) rc = !DeleteFile(filename); #else // UNIX rc = remove(filename); @@ -345,9 +345,9 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ void TDBINI::CloseDB(PGLOBAL) { -#if !defined(__WIN__) +#if !defined(_WIN32) PROFILE_Close(Ifile); -#endif // !__WIN__ +#endif // !_WIN32 } // end of CloseDB // ------------------------ INICOL functions ---------------------------- diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 1150824464f..b6277088bac 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -36,7 +36,7 @@ //#include "sql_base.h" #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) @@ -71,15 +71,15 @@ #include "tabmysql.h" #include "ha_connect.h" -#if defined(__WIN__) +#if defined(_WIN32) #if defined(__BORLANDC__) #define SYSEXIT void _USERENTRY #else #define SYSEXIT void #endif -#else // !__WIN__ +#else // !_WIN32 #define SYSEXIT void * -#endif // !__WIN__ +#endif // !_WIN32 extern pthread_mutex_t tblmut; diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index e187e6eaec5..47a882e11b1 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -14,7 +14,7 @@ #include "sql_class.h" #include "table.h" #include "field.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 0ed466f6ffb..9cf5f41d1fe 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -35,7 +35,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) @@ -149,7 +149,7 @@ bool VCTDEF::Erase(char *filename) for (i = 1, cdp = To_Cols; cdp; i++, cdp = cdp->GetNext()) { sprintf(filename, fpat, i); -//#if defined(__WIN__) +//#if defined(_WIN32) // rc |= !DeleteFile(filename); //#else // UNIX rc |= remove(filename); @@ -178,7 +178,7 @@ bool VCTDEF::Erase(char *filename) int VCTDEF::MakeFnPattern(char *fpat) { char pat[16]; -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 8a8e1bcbcb6..a6aab7d2563 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -2,9 +2,9 @@ /* TABWMI: Author Olivier Bertrand -- PlugDB -- 2012 - 2017 */ /* TABWMI: Virtual table to get WMI information. */ /***********************************************************************/ -#if !defined(__WIN__) +#if !defined(_WIN32) #error This is a WINDOWS only table type -#endif // !__WIN__ +#endif // !_WIN32 #include "my_global.h" #include diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 93a24accc3c..87fa799d87e 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -17,7 +17,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(__WIN__) +#if defined(_WIN32) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index d7f199a8092..cb428f5a94c 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -15,12 +15,12 @@ #include #include #include -#if defined(__WIN__) +#if defined(_WIN32) #include #include //#include #include -#else // !__WIN__ +#else // !_WIN32 #include #include #include @@ -28,7 +28,7 @@ //#include #include "osutil.h" #define _O_RDONLY O_RDONLY -#endif // !__WIN__ +#endif // !_WIN32 #include "resource.h" // for IDS_COLUMNS #define INCLUDE_TDBXML @@ -53,11 +53,11 @@ extern "C" char version[]; -#if defined(__WIN__) && defined(DOMDOC_SUPPORT) +#if defined(_WIN32) && defined(DOMDOC_SUPPORT) #define XMLSUP "MS-DOM" -#else // !__WIN__ +#else // !_WIN32 #define XMLSUP "libxml2" -#endif // !__WIN__ +#endif // !_WIN32 #define TYPE_UNKNOWN 12 /* Must be greater than other types */ #define XLEN(M) sizeof(M) - strlen(M) - 1 /* To avoid overflow*/ @@ -180,11 +180,11 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) tdp->Skip = GetBooleanTableOption(g, topt, "Skipnull", false); if (!(op = GetStringTableOption(g, topt, "Xmlsup", NULL))) -#if defined(__WIN__) +#if defined(_WIN32) tdp->Usedom = true; -#else // !__WIN__ +#else // !_WIN32 tdp->Usedom = false; -#endif // !__WIN__ +#endif // !_WIN32 else tdp->Usedom = (toupper(*op) == 'M' || toupper(*op) == 'D'); @@ -533,11 +533,11 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise if (*buf == '*') -#if defined(__WIN__) +#if defined(_WIN32) Usedom = true; -#else // !__WIN__ +#else // !_WIN32 Usedom = false; -#endif // !__WIN__ +#endif // !_WIN32 else Usedom = (toupper(*buf) == 'M' || toupper(*buf) == 'D'); @@ -970,7 +970,7 @@ bool TDBXML::Initialize(PGLOBAL g) Docp->SetNofree(true); // For libxml2 -#if defined(__WIN__) +#if defined(_WIN32) } catch (_com_error e) { // We come here if a DOM command threw an error char buf[128]; @@ -984,7 +984,7 @@ bool TDBXML::Initialize(PGLOBAL g) sprintf(g->Message, "%s hr=%x", MSG(COM_ERROR), e.Error()); goto error; -#endif // __WIN__ +#endif // _WIN32 #if !defined(UNIX) } catch(...) { // Other errors diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index b7c8c704e65..a993c1371c2 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -23,7 +23,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include #else #include "osutil.h" diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index e710fefc624..1366362dac0 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -30,11 +30,11 @@ #include "sql_class.h" #include "sql_time.h" -#if defined(__WIN__) +#if defined(_WIN32) //#include -#else // !__WIN__ +#else // !_WIN32 #include -#endif // !__WIN__ +#endif // !_WIN32 #include @@ -77,12 +77,12 @@ int DTVAL::Shift = 0; /***********************************************************************/ bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool); -#if !defined(__WIN__) +#if !defined(_WIN32) extern "C" { PSZ strupr(PSZ s); PSZ strlwr(PSZ s); } -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Get a long long number from its character representation. */ @@ -1648,10 +1648,10 @@ int TYPVAL::CompareValue(PVAL vp) else n = strcmp(Strp, vp->GetCharValue()); -#if defined(__WIN__) +#if defined(_WIN32) if (n == _NLSCMPERROR) return n; // Here we should raise an error -#endif // __WIN__ +#endif // _WIN32 return (n > 0) ? 1 : (n < 0) ? -1 : 0; } // end of CompareValue diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 95f038d494c..84a730788e2 100644 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -10,12 +10,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(__WIN__) +#if defined(_WIN32) #include #include #include //#include -#else // !__WIN__ +#else // !_WIN32 #if defined(UNIX) #include #include @@ -25,7 +25,7 @@ #include #endif // !UNIX #include -#endif // !__WIN__ +#endif // !_WIN32 /***********************************************************************/ /* Include required application header files */ @@ -846,7 +846,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) if ((sep = defp->GetBoolCatInfo("SepIndex", false))) { // Index is saved in a separate file -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1000,7 +1000,7 @@ bool XINDEX::Init(PGLOBAL g) if (defp->SepIndex()) { // Index was saved in a separate file -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1254,7 +1254,7 @@ bool XINDEX::MapInit(PGLOBAL g) if (defp->SepIndex()) { // Index was save in a separate file -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1469,7 +1469,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) if (defp->SepIndex()) { // Index was saved in a separate file -#if defined(__WIN__) +#if defined(_WIN32) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -2517,7 +2517,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) if (trace(1)) htrc(" Xopen: filename=%s id=%d mode=%d\n", filename, id, mode); -#if defined(__WIN__) +#if defined(_WIN32) LONG high = 0; DWORD rc, drc, access, share, creation; @@ -2693,7 +2693,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) /***********************************************************************/ bool XHUGE::Seek(PGLOBAL g, int low, int high, int origin) { -#if defined(__WIN__) +#if defined(_WIN32) LONG hi = high; DWORD rc = SetFilePointer(Hfile, low, &hi, origin); @@ -2729,7 +2729,7 @@ bool XHUGE::Read(PGLOBAL g, void *buf, int n, int size) { bool rc = false; -#if defined(__WIN__) +#if defined(_WIN32) bool brc; DWORD nbr, count = (DWORD)(n * size); @@ -2775,7 +2775,7 @@ bool XHUGE::Read(PGLOBAL g, void *buf, int n, int size) /***********************************************************************/ int XHUGE::Write(PGLOBAL g, void *buf, int n, int size, bool& rc) { -#if defined(__WIN__) +#if defined(_WIN32) bool brc; DWORD nbw, count = (DWORD)n * (DWORD) size; @@ -2817,7 +2817,7 @@ void XHUGE::Close(char *fn, int id) if (trace(1)) htrc("XHUGE::Close: fn=%s id=%d NewOff=%lld\n", fn, id, NewOff.Val); -#if defined(__WIN__) +#if defined(_WIN32) if (id >= 0 && fn) { CloseFileHandle(Hfile); Hfile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, 0, NULL, @@ -2832,7 +2832,7 @@ void XHUGE::Close(char *fn, int id) } // endif SetFilePointer } // endif id -#else // !__WIN__ +#else // !_WIN32 if (id >= 0 && fn) { if (Hfile != INVALID_HANDLE_VALUE) { if (lseek64(Hfile, id * sizeof(IOFF), SEEK_SET) >= 0) { @@ -2848,7 +2848,7 @@ void XHUGE::Close(char *fn, int id) htrc("(XHUGE)error reopening %s: %s\n", fn, strerror(errno)); } // endif id -#endif // !__WIN__ +#endif // !_WIN32 XLOAD::Close(); } // end of Close diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index 339d7e68b75..ce62f0591c1 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -350,7 +350,7 @@ class DllExport XLOAD : public BLOCK { protected: // Members -#if defined(__WIN__) +#if defined(_WIN32) HANDLE Hfile; // Handle to file or map #else // UNIX int Hfile; // Descriptor to file or map From ed70f76cf7cbe2195909c5e495a4b18347a7c58c Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Thu, 24 Jun 2021 00:46:12 +0200 Subject: [PATCH 09/98] - Make function strz return null when LEX_STRING is null modified: storage/connect/ha_connect.cc - Use NOTE instead of WARNING in connect_assisted_discovery This because MariaDB raise an error when doing so modified: storage/connect/ha_connect.cc modified: storage/connect/tabrest.cpp - Make MONGO tables recognize STRINGIFY and JsonAllPath modified: storage/connect/mongo.cpp modified: storage/connect/mongo.h modified: storage/connect/tabcmg.h modified: storage/connect/tabjmg.cpp modified: storage/connect/tabcmg.cpp modified: storage/connect/tabjmg.h - Fix OBJECT option for Pretty != 2 JSN and BSON tables Accept all syntaxes for the OBJECT option modified: storage/connect/tabbson.cpp modified: storage/connect/tabjson.cpp - Use my_snprintf in function xcurl (by vuvova) modified: storage/connect/tabrest.cpp - Format dates entered as integer when formatted modified: storage/connect/value.cpp modified: storage/connect/value.h --- storage/connect/ha_connect.cc | 30 +++++++----- storage/connect/mongo.cpp | 8 +-- storage/connect/mongo.h | 5 +- storage/connect/tabbson.cpp | 92 +++++++++++++++++++++++++---------- storage/connect/tabcmg.cpp | 7 ++- storage/connect/tabcmg.h | 1 + storage/connect/tabjmg.cpp | 9 ++-- storage/connect/tabjmg.h | 3 +- storage/connect/tabjson.cpp | 90 +++++++++++++++++++++++++--------- storage/connect/tabrest.cpp | 10 ++-- storage/connect/value.cpp | 28 +++++++++-- storage/connect/value.h | 3 +- 12 files changed, 201 insertions(+), 85 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 01fe7a6d2b3..a9a6e6732e9 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -290,10 +290,14 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, /****************************************************************************/ static char *strz(PGLOBAL g, LEX_STRING &ls) { - char *str= (char*)PlugSubAlloc(g, NULL, ls.length + 1); + char* str= NULL; + + if (ls.str) { + str= (char*)PlugSubAlloc(g, NULL, ls.length + 1); + memcpy(str, ls.str, ls.length); + str[ls.length] = 0; + } // endif str - memcpy(str, ls.str, ls.length); - str[ls.length]= 0; return str; } // end of strz @@ -5625,7 +5629,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // JAVA_SUPPORT uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL); bool bif, ok= false, dbf= false; - TABTYPE ttp= TAB_UNDEF; + TABTYPE ttp= TAB_UNDEF, ttr=TAB_UNDEF; PQRYRES qrp= NULL; PCOLRES crp; PCONNECT xp= NULL; @@ -5707,7 +5711,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, topt->type= (src) ? "MYSQL" : (tab) ? "PROXY" : "DOS"; ttp= GetTypeID(topt->type); sprintf(g->Message, "No table_type. Was set to %s", topt->type); - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); } else if (ttp == TAB_NIY) { sprintf(g->Message, "Unsupported table type %s", topt->type); rc= HA_ERR_INTERNAL_ERROR; @@ -5715,13 +5719,13 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #if defined(REST_SUPPORT) } else if (topt->http) { if (ttp == TAB_UNDEF) { - topt->type = "JSON"; - ttp= GetTypeID(topt->type); - sprintf(g->Message, "No table_type. Was set to %s", topt->type); - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); - } // endif ttp + ttr= TAB_JSON; + strcpy(g->Message, "No table_type. Was set to JSON"); + push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); + } else + ttr= ttp; - switch (ttp) { + switch (ttr) { case TAB_JSON: #if defined(BSON_SUPPORT) case TAB_BSON: @@ -5956,7 +5960,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #if defined(REST_SUPPORT) case TAB_REST: if (!topt->http) - sprintf(g->Message, "Missing %s HTTP address", topt->type); + strcpy(g->Message, "Missing REST HTTP option"); else ok = true; @@ -6176,7 +6180,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, // Restore language type if (ttp == TAB_REST) - ttp = GetTypeID(topt->type); + ttp = ttr; for (i= 0; !rc && i < qrp->Nblin; i++) { typ= len= prec= dec= flg= 0; diff --git a/storage/connect/mongo.cpp b/storage/connect/mongo.cpp index 5f10a89ee67..a9c4813684b 100644 --- a/storage/connect/mongo.cpp +++ b/storage/connect/mongo.cpp @@ -1,6 +1,6 @@ /************** mongo C++ Program Source Code File (.CPP) **************/ -/* PROGRAM NAME: mongo Version 1.0 */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* PROGRAM NAME: mongo Version 1.1 */ +/* (C) Copyright to the author Olivier BERTRAND 2021 */ /* These programs are the MGODEF class execution routines. */ /***********************************************************************/ @@ -36,6 +36,7 @@ bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s); bool IsNum(PSZ s); int GetDefaultDepth(void); +bool JsonAllPath(void); /***********************************************************************/ /* Make selector json representation for Mongo tables. */ @@ -350,7 +351,7 @@ void MGODISC::AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k) bcp->Name = PlugDup(g, colname); length[0] = MY_MAX(length[0], (signed)strlen(colname)); - if (k) { + if (k || JsonAllPath()) { bcp->Fmt = PlugDup(g, fmt); length[7] = MY_MAX(length[7], (signed)strlen(fmt)); } else @@ -395,6 +396,7 @@ bool MGODEF::DefineAM(PGLOBAL g, LPCSTR, int poff) Uri = GetStringCatInfo(g, "Connect", "mongodb://localhost:27017"); Colist = GetStringCatInfo(g, "Colist", NULL); Filter = GetStringCatInfo(g, "Filter", NULL); + Strfy = GetStringCatInfo(g, "Stringify", NULL); Base = GetIntCatInfo("Base", 0) ? 1 : 0; Version = GetIntCatInfo("Version", 3); diff --git a/storage/connect/mongo.h b/storage/connect/mongo.h index dcefac372c0..fddc491f2d0 100644 --- a/storage/connect/mongo.h +++ b/storage/connect/mongo.h @@ -1,7 +1,7 @@ /**************** mongo H Declares Source Code File (.H) ***************/ -/* Name: mongo.h Version 1.0 */ +/* Name: mongo.h Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2021 */ /* */ /* This file contains the common MongoDB classes declares. */ /***********************************************************************/ @@ -82,6 +82,7 @@ protected: PSZ Wrapname; /* Java wrapper name */ PCSZ Colist; /* Options list */ PCSZ Filter; /* Filtering query */ + PCSZ Strfy; /* Stringify column */ int Base; /* The array index base */ int Version; /* The Java driver version */ bool Pipe; /* True is Colist is a pipeline */ diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index c6758b21707..abffd0b64df 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -1,5 +1,5 @@ /************* tabbson C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabbson Version 1.1 */ +/* PROGRAM NAME: tabbson Version 1.2 */ /* (C) Copyright to the author Olivier BERTRAND 2020 - 2021 */ /* This program are the BSON class DB execution routines. */ /***********************************************************************/ @@ -193,7 +193,11 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) if (!(tdp->Database = SetPath(g, db))) return 0; - tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); + if ((tdp->Objname = GetStringTableOption(g, topt, "Object", NULL))) { + if (*tdp->Objname == '$') tdp->Objname++; + if (*tdp->Objname == '.') tdp->Objname++; + } // endif Objname + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); tdp->Xcol = GetStringTableOption(g, topt, "Expand", NULL); @@ -603,33 +607,51 @@ void BSONDISC::AddColumn(PGLOBAL g) /***********************************************************************/ PBVAL BTUTIL::FindRow(PGLOBAL g) { - char *p, *objpath; + char *p, *objpath = PlugDup(g, Tp->Objname); + char *sep = (Tp->Sep == ':') ? ":[" : ".["; + bool bp = false, b = false; PBVAL jsp = Tp->Row; PBVAL val = NULL; - for (objpath = PlugDup(g, Tp->Objname); jsp && objpath; objpath = p) { - if ((p = strchr(objpath, Tp->Sep))) + for (; jsp && objpath; objpath = p, bp = b) { + if ((p = strpbrk(objpath + 1, sep))) { + b = (*p == '['); *p++ = 0; + } // endif p - if (*objpath != '[' && !IsNum(objpath)) { // objpass is a key + if (!bp && *objpath != '[' && !IsNum(objpath)) { // objpass is a key val = (jsp->Type == TYPE_JOB) ? GetKeyValue(jsp, objpath) : NULL; } else { - if (*objpath == '[') { - if (objpath[strlen(objpath) - 1] == ']') - objpath++; - else + if (bp || *objpath == '[') { // Old style + if (objpath[strlen(objpath) - 1] != ']') { + sprintf(g->Message, "Invalid Table path %s", Tp->Objname); return NULL; - } // endif [ + } else if (!bp) + objpath++; + + } // endif bp val = (jsp->Type == TYPE_JAR) ? - GetArrayValue(GetArray(jsp), atoi(objpath) - Tp->B) : NULL; + GetArrayValue(jsp, atoi(objpath) - Tp->B) : NULL; } // endif objpath // jsp = (val) ? val->GetJson() : NULL; jsp = val; } // endfor objpath + if (jsp && jsp->Type != TYPE_JOB) { + if (jsp->Type == TYPE_JAR) { + jsp = GetArrayValue(jsp, Tp->B); + + if (jsp->Type != TYPE_JOB) + jsp = NULL; + + } else + jsp = NULL; + + } // endif Type + return jsp; } // end of FindRow @@ -653,17 +675,22 @@ PBVAL BTUTIL::MakeTopTree(PGLOBAL g, int type) if (Tp->Objname) { if (!Tp->Row) { // Parse and allocate Objpath item(s) - char* p; - char *objpath = PlugDup(g, Tp->Objname); + char *p, *objpath = PlugDup(g, Tp->Objname); + char *sep = (Tp->Sep == ':') ? ":[" : ".["; int i; + bool bp = false, b = false; PBVAL objp = NULL; PBVAL arp = NULL; - for (; objpath; objpath = p) { - if ((p = strchr(objpath, Tp->Sep))) + for (; objpath; objpath = p, bp = b) { + if ((p = strpbrk(objpath + 1, sep))) { + b = (*p == '['); *p++ = 0; + } // endif p - if (*objpath != '[' && !IsNum(objpath)) { + + if (!bp && *objpath != '[' && !IsNum(objpath)) { + // objpass is a key objp = NewVal(TYPE_JOB); if (!top) @@ -675,15 +702,15 @@ PBVAL BTUTIL::MakeTopTree(PGLOBAL g, int type) val = NewVal(); SetKeyValue(objp, MOF(val), objpath); } else { - if (*objpath == '[') { + if (bp || *objpath == '[') { // Old style if (objpath[strlen(objpath) - 1] != ']') { sprintf(g->Message, "Invalid Table path %s", Tp->Objname); return NULL; - } else + } else if (!bp) objpath++; - } // endif objpath + } // endif bp if (!top) top = NewVal(TYPE_JAR); @@ -755,10 +782,16 @@ void BCUTIL::SetJsonValue(PGLOBAL g, PVAL vp, PBVAL jvp) break; case TYPE_DATE: if (jvp->Type == TYPE_STRG) { - if (!((DTVAL*)vp)->IsFormatted()) - ((DTVAL*)vp)->SetFormat(g, "YYYY-MM-DDThh:mm:ssZ", 20, 0); + PSZ dat = GetString(jvp); + + if (!IsNum(dat)) { + if (!((DTVAL*)vp)->IsFormatted()) + ((DTVAL*)vp)->SetFormat(g, "YYYY-MM-DDThh:mm:ssZ", 20, 0); + + vp->SetValue_psz(dat); + } else + vp->SetValue(atoi(dat)); - vp->SetValue_psz(GetString(jvp)); } else vp->SetValue(GetInteger(jvp)); @@ -1156,7 +1189,12 @@ bool BSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) G = g; Schema = GetStringCatInfo(g, "DBname", Schema); Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); - Objname = GetStringCatInfo(g, "Object", NULL); + + if ((Objname = GetStringCatInfo(g, "Object", NULL))) { + if (*Objname == '$') Objname++; + if (*Objname == '.') Objname++; + } // endif Objname + Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); Limit = GetIntCatInfo("Limit", 50); @@ -1935,6 +1973,10 @@ bool BSONCOL::ParseJpath(PGLOBAL g) // Analyse intermediate array processing if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) return true; + else if (Xpd && Tbp->Mode == MODE_DELETE) { + strcpy(g->Message, "Cannot delete expanded columns"); + return true; + } // endif Xpd } else if (*p == '*') { // Return JSON @@ -2237,8 +2279,6 @@ int TDBBSON::MakeDocument(PGLOBAL g) return RC_FX; if ((objpath = PlugDup(g, Objname))) { - if (*objpath == '$') objpath++; - if (*objpath == '.') objpath++; p1 = (*objpath == '[') ? objpath++ : NULL; /*********************************************************************/ diff --git a/storage/connect/tabcmg.cpp b/storage/connect/tabcmg.cpp index 1552bdde58a..608445bb1ab 100644 --- a/storage/connect/tabcmg.cpp +++ b/storage/connect/tabcmg.cpp @@ -1,5 +1,5 @@ /************** tabcmg C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabcmg Version 1.2 */ +/* PROGRAM NAME: tabcmg Version 1.3 */ /* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* This program are the C MongoDB class DB execution routines. */ /***********************************************************************/ @@ -192,6 +192,7 @@ TDBCMG::TDBCMG(MGODEF *tdp) : TDBEXT(tdp) Pcg.Line = NULL; Pcg.Pipe = tdp->Pipe && tdp->Colist != NULL; B = tdp->Base ? 1 : 0; + Strfy = tdp->Strfy; } else { Pcg.Uristr = NULL; Pcg.Db_name = NULL; @@ -200,6 +201,7 @@ TDBCMG::TDBCMG(MGODEF *tdp) : TDBEXT(tdp) Pcg.Filter = NULL; Pcg.Line = NULL; Pcg.Pipe = false; + Strfy = NULL; B = 0; } // endif tdp @@ -213,6 +215,7 @@ TDBCMG::TDBCMG(TDBCMG *tdbp) : TDBEXT(tdbp) Cmgp = tdbp->Cmgp; Cnd = tdbp->Cnd; Pcg = tdbp->Pcg; + Strfy = tdbp->Strfy; B = tdbp->B; Fpos = tdbp->Fpos; N = tdbp->N; @@ -394,7 +397,7 @@ MGOCOL::MGOCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBCMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Sgfy = false; + Sgfy = (Tmgp->Strfy && !stricmp(Tmgp->Strfy, Name)); if ((Jpath = cdp->GetFmt())) { int n = strlen(Jpath) - 1; diff --git a/storage/connect/tabcmg.h b/storage/connect/tabcmg.h index 44448590da1..0a29a6ce909 100644 --- a/storage/connect/tabcmg.h +++ b/storage/connect/tabcmg.h @@ -75,6 +75,7 @@ protected: CMgoConn *Cmgp; // Points to a C Mongo connection class CMGOPARM Pcg; // Parms passed to Cmgp const Item *Cnd; // The first condition + PCSZ Strfy; // The stringified column int Fpos; // The current row index int N; // The current Rownum int B; // Array index base diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index b02bf6a7f36..9271873b800 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -1,6 +1,6 @@ /************** tabjmg C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabjmg Version 1.2 */ -/* (C) Copyright to the author Olivier BERTRAND 2017 */ +/* PROGRAM NAME: tabjmg Version 1.3 */ +/* (C) Copyright to the author Olivier BERTRAND 2021 */ /* This file contains the MongoDB classes using the Java Driver. */ /***********************************************************************/ @@ -166,6 +166,7 @@ TDBJMG::TDBJMG(PMGODEF tdp) : TDBEXT(tdp) Coll_name = tdp->Tabname; Options = tdp->Colist; Filter = tdp->Filter; + Strfy = tdp->Strfy; B = tdp->Base ? 1 : 0; Pipe = tdp->Pipe && Options != NULL; } else { @@ -177,6 +178,7 @@ TDBJMG::TDBJMG(PMGODEF tdp) : TDBEXT(tdp) Coll_name = NULL; Options = NULL; Filter = NULL; + Strfy = NULL; B = 0; Pipe = false; } // endif tdp @@ -197,6 +199,7 @@ TDBJMG::TDBJMG(TDBJMG *tdbp) : TDBEXT(tdbp) Coll_name = tdbp->Coll_name; Options = tdbp->Options; Filter = tdbp->Filter; + Strfy = tdbp->Strfy; B = tdbp->B; Fpos = tdbp->Fpos; N = tdbp->N; @@ -420,7 +423,7 @@ JMGCOL::JMGCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBJMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Sgfy = false; + Sgfy = (Tmgp->Strfy && !stricmp(Tmgp->Strfy, Name)); if ((Jpath = cdp->GetFmt())) { int n = strlen(Jpath) - 1; diff --git a/storage/connect/tabjmg.h b/storage/connect/tabjmg.h index e8f08730b89..bc89319527a 100644 --- a/storage/connect/tabjmg.h +++ b/storage/connect/tabjmg.h @@ -1,5 +1,5 @@ /**************** tabjmg H Declares Source Code File (.H) **************/ -/* Name: tabjmg.h Version 1.2 */ +/* Name: tabjmg.h Version 1.3 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */ /* */ @@ -83,6 +83,7 @@ protected: PCSZ Coll_name; PCSZ Options; // The MongoDB options PCSZ Filter; // The filtering query + PCSZ Strfy; // The stringified column PSZ Wrapname; // Java wrapper name int Fpos; // The current row index int N; // The current Rownum diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index cad098e0f9b..b05e4ca2c01 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1,5 +1,5 @@ /************* tabjson C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabjson Version 1.8 */ +/* PROGRAM NAME: tabjson Version 1.9 */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2021 */ /* This program are the JSON class DB execution routines. */ /***********************************************************************/ @@ -191,13 +191,19 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) #endif // ZIP_SUPPORT tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL); - if (!tdp->Fn && topt->http) + if (!tdp->Fn && topt->http) { tdp->Fn = GetStringTableOption(g, topt, "Subtype", NULL); + topt->subtype = NULL; + } // endif fn if (!(tdp->Database = SetPath(g, db))) return 0; - tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); + if ((tdp->Objname = GetStringTableOption(g, topt, "Object", NULL))) { + if (*tdp->Objname == '$') tdp->Objname++; + if (*tdp->Objname == '.') tdp->Objname++; + } // endif Objname + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); tdp->Xcol = GetStringTableOption(g, topt, "Expand", NULL); @@ -632,7 +638,12 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { Schema = GetStringCatInfo(g, "DBname", Schema); Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); - Objname = GetStringCatInfo(g, "Object", NULL); + + if ((Objname = GetStringCatInfo(g, "Object", NULL))) { + if (*Objname == '$') Objname++; + if (*Objname == '.') Objname++; + } // endif Objname + Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); Limit = GetIntCatInfo("Limit", 50); @@ -950,23 +961,29 @@ int TDBJSN::EstimatedLength(void) /***********************************************************************/ PJSON TDBJSN::FindRow(PGLOBAL g) { - char *p, *objpath; + char *p, *objpath = PlugDup(g, Objname); + char *sep = (Sep == ':') ? ":[" : ".["; + bool bp = false, b = false; PJSON jsp = Row; PJVAL val = NULL; - for (objpath = PlugDup(g, Objname); jsp && objpath; objpath = p) { - if ((p = strchr(objpath, Sep))) + for (; jsp && objpath; objpath = p, bp = b) { + if ((p = strpbrk(objpath + 1, sep))) { + b = (*p == '['); *p++ = 0; + } // endif p - if (*objpath != '[' && !IsNum(objpath)) { // objpass is a key + if (!bp && *objpath != '[' && !IsNum(objpath)) { // objpass is a key val = (jsp->GetType() == TYPE_JOB) ? jsp->GetObject()->GetKeyValue(objpath) : NULL; } else { - if (*objpath == '[') { - if (objpath[strlen(objpath) - 1] == ']') - objpath++; - else + if (bp || *objpath == '[') { + if (objpath[strlen(objpath) - 1] != ']') { + sprintf(g->Message, "Invalid Table path %s", Objname); return NULL; + } else if (!bp) + objpath++; + } // endif [ val = (jsp->GetType() == TYPE_JAR) ? @@ -976,6 +993,18 @@ PJSON TDBJSN::FindRow(PGLOBAL g) jsp = (val) ? val->GetJson() : NULL; } // endfor objpath + if (jsp && jsp->GetType() != TYPE_JOB) { + if (jsp->GetType() == TYPE_JAR) { + jsp = jsp->GetArray()->GetArrayValue(B); + + if (jsp->GetType() != TYPE_JOB) + jsp = NULL; + + } else + jsp = NULL; + + } // endif Type + return jsp; } // end of FindRow @@ -1149,20 +1178,23 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) if (Objname) { if (!Val) { // Parse and allocate Objname item(s) - char *p; - char *objpath = PlugDup(g, Objname); + char *p, *objpath = PlugDup(g, Objname); + char *sep = (Sep == ':') ? ":[" : ".["; int i; + bool bp = false, b = false; PJOB objp; PJAR arp; PJVAL val = NULL; Top = NULL; - for (; objpath; objpath = p) { - if ((p = strchr(objpath, Sep))) + for (; objpath; objpath = p, bp = b) { + if ((p = strpbrk(objpath + 1, sep))) { + b = (*p == '['); *p++ = 0; + } // endif p - if (*objpath != '[' && !IsNum(objpath)) { + if (!bp && *objpath != '[' && !IsNum(objpath)) { objp = new(g) JOBJECT; if (!Top) @@ -1174,15 +1206,15 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) val = new(g) JVALUE; objp->SetKeyValue(g, val, objpath); } else { - if (*objpath == '[') { + if (bp || *objpath == '[') { // Old style if (objpath[strlen(objpath) - 1] != ']') { sprintf(g->Message, "Invalid Table path %s", Objname); - return RC_FX; - } else + return NULL; + } else if (!bp) objpath++; - } // endif objpath + } // endif bp arp = new(g) JARRAY; @@ -1537,6 +1569,10 @@ bool JSONCOL::ParseJpath(PGLOBAL g) // Analyse intermediate array processing if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) return true; + else if (Xpd && Tjp->Mode == MODE_DELETE) { + strcpy(g->Message, "Cannot delete expanded columns"); + return true; + } // endif Xpd } else if (*p == '*') { // Return JSON @@ -1752,10 +1788,16 @@ void JSONCOL::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL jvp) break; case TYPE_DATE: if (jvp->GetValType() == TYPE_STRG) { - if (!((DTVAL*)vp)->IsFormatted()) - ((DTVAL*)vp)->SetFormat(g, "YYYY-MM-DDThh:mm:ssZ", 20, 0); + PSZ dat = jvp->GetString(g); + + if (!IsNum(dat)) { + if (!((DTVAL*)vp)->IsFormatted()) + ((DTVAL*)vp)->SetFormat(g, "YYYY-MM-DDThh:mm:ssZ", 20, 0); + + vp->SetValue_psz(dat); + } else + vp->SetValue(atoi(dat)); - vp->SetValue_psz(jvp->GetString(g)); } else vp->SetValue(jvp->GetInteger()); diff --git a/storage/connect/tabrest.cpp b/storage/connect/tabrest.cpp index 3b89d5232b7..c66d8d76f3d 100644 --- a/storage/connect/tabrest.cpp +++ b/storage/connect/tabrest.cpp @@ -1,5 +1,5 @@ /************** tabrest C++ Program Source Code File (.CPP) ************/ -/* PROGRAM NAME: tabrest Version 2.0 */ +/* PROGRAM NAME: tabrest Version 2.1 */ /* (C) Copyright to the author Olivier BERTRAND 2018 - 2021 */ /* This program is the REST Web API support for MariaDB. */ /* The way Connect handles NOSQL data returned by REST queries is */ @@ -37,7 +37,7 @@ #include "tabrest.h" #if defined(connect_EXPORTS) -#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) +#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_NOTE, 0, M) #else #define PUSH_WARNING(M) htrc(M) #endif @@ -60,12 +60,12 @@ int Xcurl(PGLOBAL g, PCSZ Http, PCSZ Uri, PCSZ filename) if (Uri) { if (*Uri == '/' || Http[strlen(Http) - 1] == '/') - sprintf(buf, "%s%s", Http, Uri); + my_snprintf(buf, sizeof(buf)-1, "%s%s", Http, Uri); else - sprintf(buf, "%s/%s", Http, Uri); + my_snprintf(buf, sizeof(buf)-1, "%s/%s", Http, Uri); } else - strcpy(buf, Http); + my_snprintf(buf, sizeof(buf)-1, "%s", Http); #if defined(_WIN32) char cmd[1024]; diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 1366362dac0..8f2cb631feb 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -2643,9 +2643,9 @@ bool DTVAL::SetValue_pval(PVAL valp, bool chktype) } else if (valp->GetType() == TYPE_BIGINT && !(valp->GetBigintValue() % 1000)) { // Assuming that this timestamp is in milliseconds - Tval = (int)(valp->GetBigintValue() / 1000); + SetValue((int)(valp->GetBigintValue() / 1000)); } else - Tval = valp->GetIntValue(); + SetValue(valp->GetIntValue()); } else Reset(); @@ -2736,21 +2736,39 @@ void DTVAL::SetValue_pvblk(PVBLK blk, int n) } // end of SetValue +/***********************************************************************/ +/* DTVAL SetValue: get date as an integer. */ +/***********************************************************************/ +void DTVAL::SetValue(int n) +{ + Tval = n; + + if (Pdtp) { + size_t n = 0, slen = (size_t)Len + 1; + struct tm tm, *ptm= GetGmTime(&tm); + + if (ptm) + n = strftime(Sdate, slen, Pdtp->OutFmt, ptm); + + } // endif Pdtp + +} // end of SetValue + /***********************************************************************/ /* DTVAL GetCharString: get string representation of a date value. */ /***********************************************************************/ char *DTVAL::GetCharString(char *p) { if (Pdtp) { - size_t n = 0; + size_t n = 0, slen = (size_t)Len + 1; struct tm tm, *ptm= GetGmTime(&tm); if (ptm) - n = strftime(Sdate, Len + 1, Pdtp->OutFmt, ptm); + n = strftime(Sdate, slen, Pdtp->OutFmt, ptm); if (!n) { *Sdate = '\0'; - strncat(Sdate, "Error", Len + 1); + strncat(Sdate, "Error", slen); } // endif n return Sdate; diff --git a/storage/connect/value.h b/storage/connect/value.h index df6a55501b6..f709c7dbad0 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -418,7 +418,8 @@ class DllExport DTVAL : public TYPVAL { virtual bool SetValue_char(const char *p, int n); virtual void SetValue_psz(PCSZ s); virtual void SetValue_pvblk(PVBLK blk, int n); - virtual PSZ GetCharValue(void) { return Sdate; } + virtual void SetValue(int n); + virtual PSZ GetCharValue(void) { return Sdate; } virtual char *GetCharString(char *p); virtual int ShowValue(char *buf, int len); virtual bool FormatValue(PVAL vp, PCSZ fmt); From 330b32ebd95b25793c06e066c3f7829a22d0590f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Thu, 24 Jun 2021 23:56:13 +0200 Subject: [PATCH 10/98] Fix clang compile error --- storage/connect/value.h | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/connect/value.h b/storage/connect/value.h index f709c7dbad0..9b4b9164fa5 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -412,6 +412,7 @@ class DllExport DTVAL : public TYPVAL { // Constructors DTVAL(PGLOBAL g, int n, int p, PCSZ fmt); DTVAL(int n); + using TYPVAL::SetValue; // Implementation virtual bool SetValue_pval(PVAL valp, bool chktype); From 5c5d60b89781616f9f12fed7f0215de2ea279d0b Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 25 Jun 2021 01:15:51 +0200 Subject: [PATCH 11/98] Fix compile error in value.h and remove unused variables in ha_connect.cc --- storage/connect/ha_connect.cc | 5 +---- storage/connect/value.h | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index a9a6e6732e9..5493f3b6730 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -4377,7 +4377,6 @@ int ha_connect::info(uint flag) // tdbp must be available to get updated info if (xp->CheckQuery(valid_query_id) || !tdbp) { PDBUSER dup= PlgGetUser(g); - PCATLG cat= (dup) ? dup->Catalog : NULL; if (xmod == MODE_ANY || xmod == MODE_ALTER) { // Pure info, not a query @@ -5615,7 +5614,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, PCSZ nsp= NULL, cls= NULL; #endif // _WIN32 //int hdr, mxe; - int port= 0, mxr= 0, rc= 0, mul= 0, lrecl= 0; + int port= 0, mxr= 0, rc= 0, mul= 0; //PCSZ tabtyp= NULL; #if defined(ODBC_SUPPORT) POPARM sop= NULL; @@ -5638,8 +5637,6 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (!g) return HA_ERR_INTERNAL_ERROR; - PDBUSER dup= PlgGetUser(g); - PCATLG cat= (dup) ? dup->Catalog : NULL; PTOS topt= table_s->option_struct; char buf[1024]; String sql(buf, sizeof(buf), system_charset_info); diff --git a/storage/connect/value.h b/storage/connect/value.h index 9b4b9164fa5..a0d947347c3 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -412,7 +412,7 @@ class DllExport DTVAL : public TYPVAL { // Constructors DTVAL(PGLOBAL g, int n, int p, PCSZ fmt); DTVAL(int n); - using TYPVAL::SetValue; + using TYPVAL::SetValue; // Implementation virtual bool SetValue_pval(PVAL valp, bool chktype); From 6239e2a4ec4dc6ef6e99be73b8c5d7ad6e02cfc5 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 25 Jun 2021 11:38:16 +0200 Subject: [PATCH 12/98] Fix clang compile error in tabjson.cpp and tabbson.cpp --- storage/connect/tabbson.cpp | 2 +- storage/connect/tabjson.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index abffd0b64df..dd37357ac6a 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -608,7 +608,7 @@ void BSONDISC::AddColumn(PGLOBAL g) PBVAL BTUTIL::FindRow(PGLOBAL g) { char *p, *objpath = PlugDup(g, Tp->Objname); - char *sep = (Tp->Sep == ':') ? ":[" : ".["; + char *sep = (char*)(Tp->Sep == ':' ? ":[" : ".["); bool bp = false, b = false; PBVAL jsp = Tp->Row; PBVAL val = NULL; diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index b05e4ca2c01..09077ecdf93 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -962,7 +962,7 @@ int TDBJSN::EstimatedLength(void) PJSON TDBJSN::FindRow(PGLOBAL g) { char *p, *objpath = PlugDup(g, Objname); - char *sep = (Sep == ':') ? ":[" : ".["; + char *sep = (char*)(Sep == ':' ? ":[" : ".["); bool bp = false, b = false; PJSON jsp = Row; PJVAL val = NULL; From af7a0895ac6f57db0d4c83bede1a6115e9e11c1f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 25 Jun 2021 12:30:10 +0200 Subject: [PATCH 13/98] Fix clang compile error in tabjson.cpp and tabbson.cpp --- storage/connect/tabbson.cpp | 2 +- storage/connect/tabjson.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index dd37357ac6a..05c47014e5c 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -676,7 +676,7 @@ PBVAL BTUTIL::MakeTopTree(PGLOBAL g, int type) if (!Tp->Row) { // Parse and allocate Objpath item(s) char *p, *objpath = PlugDup(g, Tp->Objname); - char *sep = (Tp->Sep == ':') ? ":[" : ".["; + char *sep = (char*)(Tp->Sep == ':' ? ":[" : ".["); int i; bool bp = false, b = false; PBVAL objp = NULL; diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 09077ecdf93..de85344f869 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1179,7 +1179,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) if (!Val) { // Parse and allocate Objname item(s) char *p, *objpath = PlugDup(g, Objname); - char *sep = (Sep == ':') ? ":[" : ".["; + char *sep = (char*)(Sep == ':' ? ":[" : ".["); int i; bool bp = false, b = false; PJOB objp; From 7863554e429d008c88ceff9d48c00eb10ea7d133 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 25 Jun 2021 12:54:34 +0200 Subject: [PATCH 14/98] Fix clang compile error in tabjson and typo in tabbson.cpp --- storage/connect/tabbson.cpp | 2 +- storage/connect/tabjson.cpp | 6 +++--- storage/connect/tabjson.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index 05c47014e5c..7f5727a9713 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -1492,7 +1492,7 @@ int TDBBSN::EstimatedLength(void) } // end of Estimated Length /***********************************************************************/ -/* OpenDB: Data Base open routine for JSN access method. */ +/* OpenDB: Data Base open routine for BSN access method. */ /***********************************************************************/ bool TDBBSN::OpenDB(PGLOBAL g) { diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index de85344f869..2db42cc8cbf 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1173,7 +1173,7 @@ int TDBJSN::ReadDB(PGLOBAL g) { /***********************************************************************/ /* Make the top tree from the object path. */ /***********************************************************************/ -int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) +bool TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) { if (Objname) { if (!Val) { @@ -1210,7 +1210,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) // Old style if (objpath[strlen(objpath) - 1] != ']') { sprintf(g->Message, "Invalid Table path %s", Objname); - return NULL; + return true; } else if (!bp) objpath++; @@ -1239,7 +1239,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) } else Top = jsp; - return RC_OK; + return false; } // end of MakeTopTree /***********************************************************************/ diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 523015c66b2..623e5b6d509 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -170,7 +170,7 @@ public: protected: PJSON FindRow(PGLOBAL g); - int MakeTopTree(PGLOBAL g, PJSON jsp); + bool MakeTopTree(PGLOBAL g, PJSON jsp); // Members PGLOBAL G; // Support of parse memory From 1c4b917f0e82081950ca256fd7698dab8f4722e6 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 25 Jun 2021 18:35:26 +0200 Subject: [PATCH 15/98] Fix clang compile error in value.cpp --- storage/connect/value.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 8f2cb631feb..803bf9688be 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -2744,11 +2744,11 @@ void DTVAL::SetValue(int n) Tval = n; if (Pdtp) { - size_t n = 0, slen = (size_t)Len + 1; + size_t slen = (size_t)Len + 1; struct tm tm, *ptm= GetGmTime(&tm); if (ptm) - n = strftime(Sdate, slen, Pdtp->OutFmt, ptm); + strftime(Sdate, slen, Pdtp->OutFmt, ptm); } // endif Pdtp From 7c02e8717de59af16e0f24a2334d10b426909c3a Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 2 Jul 2021 15:13:37 +0200 Subject: [PATCH 16/98] MDEV-26081 set role crashes when a hostname cannot be resolved host can be NULL --- mysql-test/r/skip_name_resolve.result | 22 +++++++++++++++- .../suite/roles/set_default_role_for.result | 4 +-- .../roles/set_default_role_invalid.result | 6 ++--- .../suite/roles/set_role-recursive.result | 2 +- mysql-test/t/skip_name_resolve.test | 26 ++++++++++++++++++- sql/sql_acl.cc | 9 +++---- 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/mysql-test/r/skip_name_resolve.result b/mysql-test/r/skip_name_resolve.result index 1362e482717..7159a1509b8 100644 --- a/mysql-test/r/skip_name_resolve.result +++ b/mysql-test/r/skip_name_resolve.result @@ -39,4 +39,24 @@ SET @@LOCAL.skip_name_resolve=0; ERROR HY000: Variable 'skip_name_resolve' is a read only variable SET @@GLOBAL.skip_name_resolve=0; ERROR HY000: Variable 'skip_name_resolve' is a read only variable -End of 5.1 tests +# +# End of 5.1 tests +# +# +# MDEV-26081 set role crashes when a hostname cannot be resolved +# +create user u1@`%`; +create role r1; +create role r2; +grant r2 to r1; +grant r1 to u1@`%`; +connect u1,127.0.0.1,u1,,,$MASTER_MYPORT; +set role r2; +ERROR OP000: User `u1`@`%` has not been granted role `r2` +disconnect u1; +connection default; +drop user u1@`%`; +drop role r1, r2; +# +# End of 10.2 tests +# diff --git a/mysql-test/suite/roles/set_default_role_for.result b/mysql-test/suite/roles/set_default_role_for.result index 62c31373486..2f6ad0a9f7f 100644 --- a/mysql-test/suite/roles/set_default_role_for.result +++ b/mysql-test/suite/roles/set_default_role_for.result @@ -14,7 +14,7 @@ set default role role_a for user_a@localhost; set default role invalid_role for user_a@localhost; ERROR OP000: Invalid role specification `invalid_role` set default role role_b for user_a@localhost; -ERROR OP000: User `user_a@localhost` has not been granted role `role_b` +ERROR OP000: User `root`@`localhost` has not been granted role `role_b` set default role role_b for user_b@localhost; show grants; Grants for user_a@localhost @@ -37,7 +37,7 @@ user host default_role user_a localhost role_a user_b localhost role_b set default role role_b for current_user; -ERROR OP000: User `user_a@localhost` has not been granted role `role_b` +ERROR OP000: User `user_a`@`localhost` has not been granted role `role_b` show grants; Grants for user_b@localhost GRANT role_b TO 'user_b'@'localhost' diff --git a/mysql-test/suite/roles/set_default_role_invalid.result b/mysql-test/suite/roles/set_default_role_invalid.result index 53ee464e2c1..c98e6e7d2a9 100644 --- a/mysql-test/suite/roles/set_default_role_invalid.result +++ b/mysql-test/suite/roles/set_default_role_invalid.result @@ -48,7 +48,7 @@ CREATE USER b; CREATE ROLE r1; CREATE ROLE r2; SET DEFAULT ROLE r1 FOR a; -ERROR OP000: User `a@%` has not been granted role `r1` +ERROR OP000: User `root`@`localhost` has not been granted role `r1` GRANT r1 TO b; GRANT r2 TO b; SET DEFAULT ROLE r1 FOR b; @@ -100,7 +100,7 @@ GRANT USAGE ON *.* TO 'b'@'%' GRANT SELECT, UPDATE ON `mysql`.* TO 'b'@'%' SET DEFAULT ROLE r2 FOR 'b'@'%' SET DEFAULT ROLE r1 FOR a; -ERROR OP000: User `a@%` has not been granted role `r1` +ERROR OP000: User `b`@`%` has not been granted role `r1` SET DEFAULT ROLE invalid_role; ERROR OP000: Invalid role specification `invalid_role` SET DEFAULT ROLE invalid_role FOR a; @@ -117,7 +117,7 @@ SET DEFAULT ROLE None; # Change user b (session 3: role granted to user a) SET DEFAULT ROLE r1 FOR a; SET DEFAULT ROLE r2 FOR a; -ERROR OP000: User `a@%` has not been granted role `r2` +ERROR OP000: User `b`@`%` has not been granted role `r2` SET DEFAULT ROLE invalid_role; ERROR OP000: Invalid role specification `invalid_role` SET DEFAULT ROLE invalid_role FOR a; diff --git a/mysql-test/suite/roles/set_role-recursive.result b/mysql-test/suite/roles/set_role-recursive.result index b0d79377183..fc5322a692e 100644 --- a/mysql-test/suite/roles/set_role-recursive.result +++ b/mysql-test/suite/roles/set_role-recursive.result @@ -66,7 +66,7 @@ Grants for test_user@localhost GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT test_role1 TO 'test_user'@'localhost' set role test_role2; -ERROR OP000: User `test_user@localhost` has not been granted role `test_role2` +ERROR OP000: User `test_user`@`localhost` has not been granted role `test_role2` select current_user(), current_role(); current_user() current_role() test_user@localhost NULL diff --git a/mysql-test/t/skip_name_resolve.test b/mysql-test/t/skip_name_resolve.test index b0c5118f970..0ff19092b82 100644 --- a/mysql-test/t/skip_name_resolve.test +++ b/mysql-test/t/skip_name_resolve.test @@ -50,4 +50,28 @@ SET @@LOCAL.skip_name_resolve=0; --error ER_INCORRECT_GLOBAL_LOCAL_VAR SET @@GLOBAL.skip_name_resolve=0; ---echo End of 5.1 tests +--echo # +--echo # End of 5.1 tests +--echo # + +--echo # +--echo # MDEV-26081 set role crashes when a hostname cannot be resolved +--echo # + +create user u1@`%`; +create role r1; +create role r2; +grant r2 to r1; +grant r1 to u1@`%`; + +connect u1,127.0.0.1,u1,,,$MASTER_MYPORT; +error ER_INVALID_ROLE; +set role r2; +disconnect u1; +connection default; +drop user u1@`%`; +drop role r1, r2; + +--echo # +--echo # End of 10.2 tests +--echo # diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 2b59a82277e..2d91254435a 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2732,7 +2732,6 @@ end: my_error(ER_INVALID_ROLE, MYF(0), rolename); break; case 1: - StringBuffer<1024> c_usr; LEX_CSTRING role_lex; /* First, check if current user can see mysql database. */ bool read_access= !check_access(thd, SELECT_ACL, "mysql", NULL, NULL, 1, 1); @@ -2753,11 +2752,9 @@ end: NULL) == -1)) { /* Role is not granted but current user can see the role */ - c_usr.append(user, strlen(user)); - c_usr.append('@'); - c_usr.append(host, strlen(host)); - my_printf_error(ER_INVALID_ROLE, "User %`s has not been granted role %`s", - MYF(0), c_usr.c_ptr(), rolename); + my_printf_error(ER_INVALID_ROLE, "User %`s@%`s has not been granted role %`s", + MYF(0), thd->security_ctx->priv_user, + thd->security_ctx->priv_host, rolename); } else { From cdb29960d2ed4dd8c51c3ee1f95c1ab0ff953142 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 20 May 2021 18:03:35 +0300 Subject: [PATCH 17/98] MDEV-17783: AddressSanitizer: stack-buffer-overflow in table_cond_selectivity A less-intrusive fix: don't have table_cond_selectivity() assume that there are less than MAX_REF_PARTS hash-join KEYUSEs. If there are more than that, switch to using an array. Allocate the array on the heap: we can't allocate it on MEM_ROOT as table_cond_selectivity() is called many times during the optimization. (Variant 2, with review input addressed) --- mysql-test/r/selectivity_innodb.result | 29 ++++++++++++++++++++++ mysql-test/t/selectivity_innodb.test | 34 ++++++++++++++++++++++++++ sql/sql_select.cc | 31 +++++++++++++++++++++-- 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result index 5452919aa6d..23e0fcc9387 100644 --- a/mysql-test/r/selectivity_innodb.result +++ b/mysql-test/r/selectivity_innodb.result @@ -2103,6 +2103,35 @@ drop view v1; # # End of 10.1 tests # +# +# MDEV-17783: AddressSanitizer: stack-buffer-overflow in table_cond_selectivity +# +set +@tmp_jcl=@@join_cache_level, +@tmp_sel=@@optimizer_use_condition_selectivity; +set +join_cache_level=3, +optimizer_use_condition_selectivity=2; +CREATE TABLE t1 ( +c1 int, c2 int, c3 int, c4 int, c5 int, c6 int, c7 int, c8 int, c9 int, c10 int, +c11 int, c12 int, c13 int, c14 int, c15 int, c16 int, c17 int, c18 int, c19 int, +c20 int, c21 int, c22 int, c23 int, c24 int, c25 int, c26 int, c27 int, c28 int, +c29 int, c30 int, c31 int, c32 int, c33 int, c34 int +) ENGINE=InnoDB; +SELECT * FROM t1 +WHERE +(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, +c11, c12, c13, c14, c15, c16, c17, c18, c19, +c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, +c30, c31, c32, c33, c34) IN (SELECT * FROM t1) ; +c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32 c33 c34 +set +join_cache_level=@tmp_jcl, +optimizer_use_condition_selectivity=@tmp_sel; +drop table t1; +# +# End of 10.1 tests +# set use_stat_tables= @tmp_ust; set optimizer_use_condition_selectivity= @tmp_oucs; set @@global.histogram_size=@save_histogram_size; diff --git a/mysql-test/t/selectivity_innodb.test b/mysql-test/t/selectivity_innodb.test index 6c457e2848b..eb05091e43a 100644 --- a/mysql-test/t/selectivity_innodb.test +++ b/mysql-test/t/selectivity_innodb.test @@ -174,6 +174,40 @@ drop view v1; --echo # End of 10.1 tests --echo # +--echo # +--echo # MDEV-17783: AddressSanitizer: stack-buffer-overflow in table_cond_selectivity +--echo # + +set + @tmp_jcl=@@join_cache_level, + @tmp_sel=@@optimizer_use_condition_selectivity; +set + join_cache_level=3, + optimizer_use_condition_selectivity=2; + +CREATE TABLE t1 ( + c1 int, c2 int, c3 int, c4 int, c5 int, c6 int, c7 int, c8 int, c9 int, c10 int, + c11 int, c12 int, c13 int, c14 int, c15 int, c16 int, c17 int, c18 int, c19 int, + c20 int, c21 int, c22 int, c23 int, c24 int, c25 int, c26 int, c27 int, c28 int, + c29 int, c30 int, c31 int, c32 int, c33 int, c34 int +) ENGINE=InnoDB; + +SELECT * FROM t1 +WHERE + (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, + c11, c12, c13, c14, c15, c16, c17, c18, c19, + c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, + c30, c31, c32, c33, c34) IN (SELECT * FROM t1) ; + +set + join_cache_level=@tmp_jcl, + optimizer_use_condition_selectivity=@tmp_sel; +drop table t1; + +--echo # +--echo # End of 10.1 tests +--echo # + set use_stat_tables= @tmp_ust; set optimizer_use_condition_selectivity= @tmp_oucs; set @@global.histogram_size=@save_histogram_size; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index fcdb671941d..362adc9853f 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7943,7 +7943,9 @@ static double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, table_map rem_tables) { - uint16 ref_keyuse_steps[MAX_REF_PARTS - 1]; + uint16 ref_keyuse_steps_buf[MAX_REF_PARTS]; + uint ref_keyuse_size= MAX_REF_PARTS; + uint16 *ref_keyuse_steps= ref_keyuse_steps_buf; Field *field; TABLE *table= s->table; MY_BITMAP *read_set= table->read_set; @@ -8090,6 +8092,29 @@ double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, } if (keyparts > 1) { + /* + Prepare to set ref_keyuse_steps[keyparts-2]: resize the array + if it is not large enough + */ + if (keyparts - 2 >= ref_keyuse_size) + { + uint new_size= MY_MAX(ref_keyuse_size*2, keyparts); + void *new_buf; + if (!(new_buf= my_malloc(sizeof(*ref_keyuse_steps)*new_size, + MYF(0)))) + { + sel= 1.0; // As if no selectivity was computed + goto exit; + } + memcpy(new_buf, ref_keyuse_steps, + sizeof(*ref_keyuse_steps)*ref_keyuse_size); + if (ref_keyuse_steps != ref_keyuse_steps_buf) + my_free(ref_keyuse_steps); + + ref_keyuse_steps= (uint16*)new_buf; + ref_keyuse_size= new_size; + } + ref_keyuse_steps[keyparts-2]= (uint16)(keyuse - prev_ref_keyuse); prev_ref_keyuse= keyuse; } @@ -8144,7 +8169,9 @@ double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, sel*= table_multi_eq_cond_selectivity(join, idx, s, rem_tables, keyparts, ref_keyuse_steps); - +exit: + if (ref_keyuse_steps != ref_keyuse_steps_buf) + my_free(ref_keyuse_steps); return sel; } From d4177a7e090aa78b96b5a308a159236450877250 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 20 May 2021 18:16:55 +0300 Subject: [PATCH 18/98] MDEV-23937: SIGSEGV in looped best_extension_by_limited_search from greedy_search Add a testcase (fixed by fix for MDEV-17783) --- mysql-test/r/selectivity_no_engine.result | 20 ++++++++++++++++++++ mysql-test/t/selectivity_no_engine.test | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/mysql-test/r/selectivity_no_engine.result b/mysql-test/r/selectivity_no_engine.result index 7fc3c6e9909..74a52c9fed8 100644 --- a/mysql-test/r/selectivity_no_engine.result +++ b/mysql-test/r/selectivity_no_engine.result @@ -293,6 +293,26 @@ SELECT * FROM t1 WHERE t1.d = 0 AND t1.p = '1' AND t1.i != '-1' AND t1.n = 'some i n d p set optimizer_use_condition_selectivity= @tmp_mdev8779; DROP TABLE t1; +# +# MDEV-23937: SIGSEGV in looped best_extension_by_limited_search from greedy_search +# (Testcase only) +# +set +@tmp_jcl= @@join_cache_level, +@tmp_ucs= @@optimizer_use_condition_selectivity; +set +join_cache_level=3, +optimizer_use_condition_selectivity=2; +CREATE TABLE t1 AS SELECT * FROM mysql.user; +CREATE TABLE t3 (b VARCHAR (1)); +CREATE TABLE t2 (c2 INT); +INSERT INTO t2 VALUES (1); +EXPLAIN +SELECT * FROM t1 AS a NATURAL JOIN t1 AS b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE a ALL NULL NULL NULL NULL 4 +1 SIMPLE b hash_ALL NULL #hash#$hj 827 test.a.Host,test.a.User,test.a.Password,test.a.Select_priv,test.a.Insert_priv,test.a.Update_priv,test.a.Delete_priv,test.a.Create_priv,test.a.Drop_priv,test.a.Reload_priv,test.a.Shutdown_priv,test.a.Process_priv,test.a.File_priv,test.a.Grant_priv,test.a.References_priv,test.a.Index_priv,test.a.Alter_priv,test.a.Show_db_priv,test.a.Super_priv,test.a.Create_tmp_table_priv,test.a.Lock_tables_priv,test.a.Execute_priv,test.a.Repl_slave_priv,test.a.Repl_client_priv,test.a.Create_view_priv,test.a.Show_view_priv,test.a.Create_routine_priv,test.a.Alter_routine_priv,test.a.Create_user_priv,test.a.Event_priv,test.a.Trigger_priv,test.a.Create_tablespace_priv,test.a.ssl_type,test.a.ssl_cipher,test.a.x509_issuer,test.a.x509_subject,test.a.max_questions,test.a.max_updates,test.a.max_connections,test.a.max_user_connections,test.a.plugin,test.a.authentication_string,test.a.password_expired,test.a.is_role,test.a.default_role,test.a.max_statement_time 4 Using where; Using join buffer (flat, BNLH join) +DROP TABLE t1,t2,t3; # # End of the test file # diff --git a/mysql-test/t/selectivity_no_engine.test b/mysql-test/t/selectivity_no_engine.test index 345b7bd1e8a..b5f52dd167d 100644 --- a/mysql-test/t/selectivity_no_engine.test +++ b/mysql-test/t/selectivity_no_engine.test @@ -228,6 +228,27 @@ SELECT * FROM t1 WHERE t1.d = 0 AND t1.p = '1' AND t1.i != '-1' AND t1.n = 'some set optimizer_use_condition_selectivity= @tmp_mdev8779; DROP TABLE t1; +--echo # +--echo # MDEV-23937: SIGSEGV in looped best_extension_by_limited_search from greedy_search +--echo # (Testcase only) +--echo # +set + @tmp_jcl= @@join_cache_level, + @tmp_ucs= @@optimizer_use_condition_selectivity; +set + join_cache_level=3, + optimizer_use_condition_selectivity=2; + +CREATE TABLE t1 AS SELECT * FROM mysql.user; +CREATE TABLE t3 (b VARCHAR (1)); +CREATE TABLE t2 (c2 INT); +INSERT INTO t2 VALUES (1); + +EXPLAIN +SELECT * FROM t1 AS a NATURAL JOIN t1 AS b; + +DROP TABLE t1,t2,t3; + --echo # --echo # End of the test file --echo # From 99f700a820ef90b5b36ef765fb1532145ab3e907 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Sat, 3 Jul 2021 11:41:49 +0300 Subject: [PATCH 19/98] MDEV-25013: SIGSEGV in best_extension_by_limited_search | SIGSEGV in restore_prev_nj_state Add testcase --- mysql-test/r/selectivity_innodb.result | 22 ++++++++++++++++++++++ mysql-test/t/selectivity_innodb.test | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result index 23e0fcc9387..bf240af3c47 100644 --- a/mysql-test/r/selectivity_innodb.result +++ b/mysql-test/r/selectivity_innodb.result @@ -2129,6 +2129,28 @@ set join_cache_level=@tmp_jcl, optimizer_use_condition_selectivity=@tmp_sel; drop table t1; +# +# MDEV-25013: SIGSEGV in best_extension_by_limited_search | SIGSEGV in restore_prev_nj_state +# +SET join_cache_level=3; +CREATE TABLE t1 ( +TEXT1 TEXT, TEXT2 TEXT, TEXT3 TEXT, TEXT4 TEXT, TEXT5 TEXT, +TEXT6 TEXT, TEXT7 TEXT, TEXT8 TEXT, TEXT9 TEXT, TEXT10 TEXT, +TEXT11 TEXT, TEXT12 TEXT,TEXT13 TEXT,TEXT14 TEXT,TEXT15 TEXT, +TEXT16 TEXT,TEXT17 TEXT,TEXT18 TEXT,TEXT19 TEXT,TEXT20 TEXT, +TEXT21 TEXT,TEXT22 TEXT,TEXT23 TEXT,TEXT24 TEXT,TEXT25 TEXT, +TEXT26 TEXT,TEXT27 TEXT,TEXT28 TEXT,TEXT29 TEXT,TEXT30 TEXT, +TEXT31 TEXT,TEXT32 TEXT,TEXT33 TEXT,TEXT34 TEXT,TEXT35 TEXT, +TEXT36 TEXT,TEXT37 TEXT,TEXT38 TEXT,TEXT39 TEXT,TEXT40 TEXT, +TEXT41 TEXT,TEXT42 TEXT,TEXT43 TEXT,TEXT44 TEXT,TEXT45 TEXT, +TEXT46 TEXT,TEXT47 TEXT,TEXT48 TEXT,TEXT49 TEXT,TEXT50 TEXT +) ENGINE=InnoDB; +EXPLAIN SELECT 1 FROM t1 NATURAL JOIN t1 AS t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 1 Using where +1 SIMPLE t2 hash_ALL NULL #hash#$hj 150 test.t1.TEXT1,test.t1.TEXT2,test.t1.TEXT3,test.t1.TEXT4,test.t1.TEXT5,test.t1.TEXT6,test.t1.TEXT7,test.t1.TEXT8,test.t1.TEXT9,test.t1.TEXT10,test.t1.TEXT11,test.t1.TEXT12,test.t1.TEXT13,test.t1.TEXT14,test.t1.TEXT15,test.t1.TEXT16,test.t1.TEXT17,test.t1.TEXT18,test.t1.TEXT19,test.t1.TEXT20,test.t1.TEXT21,test.t1.TEXT22,test.t1.TEXT23,test.t1.TEXT24,test.t1.TEXT25,test.t1.TEXT26,test.t1.TEXT27,test.t1.TEXT28,test.t1.TEXT29,test.t1.TEXT30,test.t1.TEXT31,test.t1.TEXT32,test.t1.TEXT33,test.t1.TEXT34,test.t1.TEXT35,test.t1.TEXT36,test.t1.TEXT37,test.t1.TEXT38,test.t1.TEXT39,test.t1.TEXT40,test.t1.TEXT41,test.t1.TEXT42,test.t1.TEXT43,test.t1.TEXT44,test.t1.TEXT45,test.t1.TEXT46,test.t1.TEXT47,test.t1.TEXT48,test.t1.TEXT49,test.t1.TEXT50 1 Using where; Using join buffer (flat, BNLH join) +set join_cache_level=@tmp_jcl; +drop table t1; # # End of 10.1 tests # diff --git a/mysql-test/t/selectivity_innodb.test b/mysql-test/t/selectivity_innodb.test index eb05091e43a..057a36fcf62 100644 --- a/mysql-test/t/selectivity_innodb.test +++ b/mysql-test/t/selectivity_innodb.test @@ -204,6 +204,27 @@ set optimizer_use_condition_selectivity=@tmp_sel; drop table t1; +--echo # +--echo # MDEV-25013: SIGSEGV in best_extension_by_limited_search | SIGSEGV in restore_prev_nj_state +--echo # + +SET join_cache_level=3; +CREATE TABLE t1 ( + TEXT1 TEXT, TEXT2 TEXT, TEXT3 TEXT, TEXT4 TEXT, TEXT5 TEXT, + TEXT6 TEXT, TEXT7 TEXT, TEXT8 TEXT, TEXT9 TEXT, TEXT10 TEXT, + TEXT11 TEXT, TEXT12 TEXT,TEXT13 TEXT,TEXT14 TEXT,TEXT15 TEXT, + TEXT16 TEXT,TEXT17 TEXT,TEXT18 TEXT,TEXT19 TEXT,TEXT20 TEXT, + TEXT21 TEXT,TEXT22 TEXT,TEXT23 TEXT,TEXT24 TEXT,TEXT25 TEXT, + TEXT26 TEXT,TEXT27 TEXT,TEXT28 TEXT,TEXT29 TEXT,TEXT30 TEXT, + TEXT31 TEXT,TEXT32 TEXT,TEXT33 TEXT,TEXT34 TEXT,TEXT35 TEXT, + TEXT36 TEXT,TEXT37 TEXT,TEXT38 TEXT,TEXT39 TEXT,TEXT40 TEXT, + TEXT41 TEXT,TEXT42 TEXT,TEXT43 TEXT,TEXT44 TEXT,TEXT45 TEXT, + TEXT46 TEXT,TEXT47 TEXT,TEXT48 TEXT,TEXT49 TEXT,TEXT50 TEXT +) ENGINE=InnoDB; +EXPLAIN SELECT 1 FROM t1 NATURAL JOIN t1 AS t2; + +set join_cache_level=@tmp_jcl; +drop table t1; --echo # --echo # End of 10.1 tests --echo # From 22e4baaa5d073f46a3b139bbd40d2dba287eb84f Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Wed, 5 May 2021 20:14:27 +0300 Subject: [PATCH 20/98] MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log Do log_drop_table() in case of failed mysql_prepare_create_table(). --- mysql-test/extra/binlog_tests/binlog.test | 18 ++++++++++++++ .../suite/binlog/r/binlog_row_binlog.result | 23 ++++++++++++++++++ .../suite/binlog/r/binlog_stm_binlog.result | 24 +++++++++++++++++++ .../suite/rpl/r/create_or_replace_mix.result | 3 +++ .../suite/rpl/r/create_or_replace_row.result | 3 +++ .../rpl/r/create_or_replace_statement.result | 2 ++ sql/sql_insert.cc | 10 ++++++++ 7 files changed, 83 insertions(+) diff --git a/mysql-test/extra/binlog_tests/binlog.test b/mysql-test/extra/binlog_tests/binlog.test index 8fe710e2ac7..f982b87aae7 100644 --- a/mysql-test/extra/binlog_tests/binlog.test +++ b/mysql-test/extra/binlog_tests/binlog.test @@ -408,4 +408,22 @@ SHOW SESSION VARIABLES LIKE "unique_checks"; DROP TABLE t1; disconnect fresh; +connection default; +--echo # +--echo # MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log +--echo # +reset master; +--error ER_DUP_FIELDNAME +create table t as select 1 as b, 2 as b; +create table t (old_table_field int); +--error ER_DUP_FIELDNAME +create or replace table t as select 1 as b, 2 as b; +--error ER_DUP_FIELDNAME +create or replace temporary table t as select 1 as b, 2 as b; +create table t (new_table_field int); + +--source include/show_binlog_events.inc + +# cleanup +drop table t; diff --git a/mysql-test/suite/binlog/r/binlog_row_binlog.result b/mysql-test/suite/binlog/r/binlog_row_binlog.result index 4068a80771c..948ccee58ca 100644 --- a/mysql-test/suite/binlog/r/binlog_row_binlog.result +++ b/mysql-test/suite/binlog/r/binlog_row_binlog.result @@ -1073,3 +1073,26 @@ Variable_name Value unique_checks OFF DROP TABLE t1; disconnect fresh; +connection default; +# +# MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log +# +reset master; +create table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create table t (old_table_field int); +create or replace table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create or replace temporary table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create table t (new_table_field int); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t (old_table_field int) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */ +master-bin.000001 # Query # # ROLLBACK +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t (new_table_field int) +drop table t; diff --git a/mysql-test/suite/binlog/r/binlog_stm_binlog.result b/mysql-test/suite/binlog/r/binlog_stm_binlog.result index 872ba40e05f..5016ed70242 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_binlog.result +++ b/mysql-test/suite/binlog/r/binlog_stm_binlog.result @@ -673,3 +673,27 @@ Variable_name Value unique_checks OFF DROP TABLE t1; disconnect fresh; +connection default; +# +# MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log +# +reset master; +create table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create table t (old_table_field int); +create or replace table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create or replace temporary table t as select 1 as b, 2 as b; +ERROR 42S21: Duplicate column name 'b' +create table t (new_table_field int); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t (old_table_field int) +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # DROP TEMPORARY TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; create table t (new_table_field int) +drop table t; diff --git a/mysql-test/suite/rpl/r/create_or_replace_mix.result b/mysql-test/suite/rpl/r/create_or_replace_mix.result index 661278aa7ef..b44b2a5c10f 100644 --- a/mysql-test/suite/rpl/r/create_or_replace_mix.result +++ b/mysql-test/suite/rpl/r/create_or_replace_mix.result @@ -100,6 +100,9 @@ include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; create table t1 (a int) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */ +master-bin.000001 # Query # # ROLLBACK drop table if exists t1,t2; Warnings: Note 1051 Unknown table 'test.t1' diff --git a/mysql-test/suite/rpl/r/create_or_replace_row.result b/mysql-test/suite/rpl/r/create_or_replace_row.result index c45daefd671..16f92b5e4b6 100644 --- a/mysql-test/suite/rpl/r/create_or_replace_row.result +++ b/mysql-test/suite/rpl/r/create_or_replace_row.result @@ -128,6 +128,9 @@ include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; create table t1 (a int) +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */ +master-bin.000001 # Query # # ROLLBACK drop table if exists t1,t2; Warnings: Note 1051 Unknown table 'test.t1' diff --git a/mysql-test/suite/rpl/r/create_or_replace_statement.result b/mysql-test/suite/rpl/r/create_or_replace_statement.result index f95b451e5ec..4d6409b1710 100644 --- a/mysql-test/suite/rpl/r/create_or_replace_statement.result +++ b/mysql-test/suite/rpl/r/create_or_replace_statement.result @@ -103,6 +103,8 @@ include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; create table t1 (a int) +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */ drop table if exists t1,t2; Warnings: Note 1051 Unknown table 'test.t1' diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 90cf8782d48..51b2c84cfea 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -4386,8 +4386,18 @@ select_create::prepare(List &values, SELECT_LEX_UNIT *u) create_table, alter_info, &values, &extra_lock, hook_ptr))) + { + if (create_info->or_replace()) + { + /* Original table was deleted. We have to log it */ + log_drop_table(thd, create_table->db, create_table->db_length, + create_table->table_name, create_table->table_name_length, + thd->lex->tmp_table()); + } + /* abort() deletes table */ DBUG_RETURN(-1); + } if (create_info->tmp_table()) { From e09e304b78e50fcbdc84f5991229764b31346f9d Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 6 Jul 2021 01:02:09 +0300 Subject: [PATCH 21/98] MDEV-16857 system-invisible row_end is displayed in SHOW INDEX Skip system-invisible keypart in get_schema_stat_record(). --- mysql-test/suite/versioning/r/create.result | 19 +++++++++++++++++++ mysql-test/suite/versioning/t/create.test | 12 ++++++++++++ sql/sql_show.cc | 10 ++++++++++ 3 files changed, 41 insertions(+) diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result index 65fbfaefcbd..fe0e6c807c3 100644 --- a/mysql-test/suite/versioning/r/create.result +++ b/mysql-test/suite/versioning/r/create.result @@ -580,3 +580,22 @@ t2 CREATE TEMPORARY TABLE `t2` ( ) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 drop temporary table t2; drop table t1; +# +# MDEV-16857 system-invisible row_end is displayed in SHOW INDEX +# +create or replace table t1 (id int primary key, x int) with system versioning; +select table_schema, table_name, non_unique, index_schema, index_name, seq_in_index, column_name +from information_schema.statistics where table_name = 't1'; +table_schema table_name non_unique index_schema index_name seq_in_index column_name +test t1 0 test PRIMARY 1 id +show index from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +t1 0 PRIMARY 1 id # # # # # # +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL, + `x` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING +drop table t1; diff --git a/mysql-test/suite/versioning/t/create.test b/mysql-test/suite/versioning/t/create.test index 8d3131cff74..1d9f3a1b341 100644 --- a/mysql-test/suite/versioning/t/create.test +++ b/mysql-test/suite/versioning/t/create.test @@ -439,3 +439,15 @@ show create table t1; show create table t2; drop temporary table t2; drop table t1; + +--echo # +--echo # MDEV-16857 system-invisible row_end is displayed in SHOW INDEX +--echo # +create or replace table t1 (id int primary key, x int) with system versioning; +select table_schema, table_name, non_unique, index_schema, index_name, seq_in_index, column_name +from information_schema.statistics where table_name = 't1'; +--replace_column 6 # 7 # 8 # 9 # 10 # 11 # +show index from t1; +--replace_result $default_engine DEFAULT_ENGINE +show create table t1; +drop table t1; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0cb6c741ae2..094d7964801 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -6676,6 +6676,16 @@ static int get_schema_stat_record(THD *thd, TABLE_LIST *tables, LEX_CSTRING unknown= {STRING_WITH_LEN("?unknown field?") }; for (uint j=0 ; j < key_info->user_defined_key_parts ; j++,key_part++) { + if (key_part->field->invisible >= INVISIBLE_SYSTEM && + DBUG_EVALUATE_IF("test_completely_invisible", 0, 1)) + { + /* + NOTE: we will get SEQ_IN_INDEX gap inside the result if this key_part + is not last (currently not possible). Though nothing is wrong with + that probably. + */ + continue; + } restore_record(table, s->default_values); table->field[0]->store(STRING_WITH_LEN("def"), cs); table->field[1]->store(db_name->str, db_name->length, cs); From 07fade6d18148efbca3760fa5f7276443f318123 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 6 Jul 2021 01:02:10 +0300 Subject: [PATCH 22/98] MDEV-22247 History partition overflow leads to wrong SELECT result Historical query with AS OF point after the last history partition must include last history partition because it can be overflown (contain history rows out of right endpoint). Move left point back to hist_part->id in that case. --- .../suite/versioning/r/partition.result | 21 +++++++++++++++++++ mysql-test/suite/versioning/t/partition.test | 21 +++++++++++++++++++ sql/sql_partition.cc | 11 ++++++++++ 3 files changed, 53 insertions(+) diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index b152cbd89e9..d2cf32e5bd0 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -726,4 +726,25 @@ create or replace table t1 (a int) with system versioning; alter table t1 partition by system_time (partition pn current); ERROR HY000: Wrong partitions for `t1`: must have at least one HISTORY and exactly one last CURRENT drop table t1; +# +# MDEV-22247 History partition overflow leads to wrong SELECT result +# +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +create or replace table t1 (x int) with system versioning +partition by system_time interval 1 hour +(partition p0 history, partition p1 history, partition pn current); +insert into t1 values (0); +update t1 set x= x + 1; +set timestamp= unix_timestamp('2000-01-01 02:00:01'); +update t1 set x= x + 1; +select *, row_start, row_end from t1 for system_time as of '2000-01-01 02:00:00'; +x row_start row_end +1 2000-01-01 00:00:00.000000 2000-01-01 02:00:01.000000 +explain partitions select * from t1 for system_time as of '2000-01-01 02:00:00'; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p1,pn ALL NULL NULL NULL NULL # Using where +explain partitions select * from t1; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 pn # NULL NULL NULL NULL # # +drop table t1; # End of 10.3 tests diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index d131bcfcc21..c5f6b242b53 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -706,6 +706,27 @@ alter table t1 partition by system_time (partition pn current); # Cleanup drop table t1; +--echo # +--echo # MDEV-22247 History partition overflow leads to wrong SELECT result +--echo # +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +create or replace table t1 (x int) with system versioning +partition by system_time interval 1 hour +(partition p0 history, partition p1 history, partition pn current); + +insert into t1 values (0); +update t1 set x= x + 1; + +set timestamp= unix_timestamp('2000-01-01 02:00:01'); +update t1 set x= x + 1; + +select *, row_start, row_end from t1 for system_time as of '2000-01-01 02:00:00'; +--replace_column 10 # +explain partitions select * from t1 for system_time as of '2000-01-01 02:00:00'; +--replace_column 5 # 10 # 11 # +explain partitions select * from t1; +drop table t1; + --echo # End of 10.3 tests --source suite/versioning/common_finish.inc diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 972684df378..59d2ea60715 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -3737,6 +3737,17 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info, if (part_func_value >= part_end_val && (loc_part_id < max_partition || !part_info->defined_max_value)) loc_part_id++; + if (part_info->part_type == VERSIONING_PARTITION && + part_func_value < INT_MAX32 && + loc_part_id > part_info->vers_info->hist_part->id) + { + /* + Historical query with AS OF point after the last history partition must + include last history partition because it can be overflown (contain + history rows out of right endpoint). + */ + loc_part_id= part_info->vers_info->hist_part->id; + } } else { From 6a466db00ab5656bfc091f81abf363b00248d1f8 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 5 Jul 2021 22:02:23 +0200 Subject: [PATCH 23/98] MDEV-25857 MTR should report at least last test that was executed in case of shutdown and not-completed * return a success/failure value from mysqld_start() and don't error out / exit in mysqld_start(), the caller will do * pass the correct $mysqld object into check_expected_crash_and_restart() instead of searching for it inside. Search in the caller * so that when a failed restart changes $mysqld->{proc}, mtr would still detect it as a failed mysqld (by updating $proc to match) also: log the server command line into the server error log --- mysql-test/mysql-test-run.pl | 104 ++++++++++++++++------------------- 1 file changed, 47 insertions(+), 57 deletions(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 5e46cfe8eff..a91bdc0b751 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2820,7 +2820,9 @@ sub mysql_server_start($) { if (!$opt_embedded_server) { - mysqld_start($mysqld,$extra_opts); + mysqld_start($mysqld, $extra_opts) or + mtr_error("Failed to start mysqld ".$mysqld->name()." with command " + . $ENV{MYSQLD_LAST_CMD}); # Save this test case information, so next can examine it $mysqld->{'started_tinfo'}= $tinfo; @@ -4135,9 +4137,12 @@ sub run_testcase ($$) { # ---------------------------------------------------- # Check if it was an expected crash # ---------------------------------------------------- - my $check_crash = check_expected_crash_and_restart($wait_for_proc); + my @mysqld = grep($wait_for_proc eq $_->{proc}, mysqlds()); + goto SRVDIED unless @mysqld; + my $check_crash = check_expected_crash_and_restart($mysqld[0]); if ($check_crash == 0) # unexpected exit/crash of $wait_for_proc { + $proc= $mysqld[0]->{proc}; goto SRVDIED; } elsif ($check_crash == 1) # $wait_for_proc was started again by check_expected_crash_and_restart() @@ -4695,61 +4700,52 @@ sub check_warnings_post_shutdown { } # -# Loop through our list of processes and look for and entry -# with the provided pid, if found check for the file indicating -# expected crash and restart it. +# Check for the file indicating expected crash and restart it. # sub check_expected_crash_and_restart { - my ($proc)= @_; + my $mysqld = shift; - foreach my $mysqld ( mysqlds() ) + # Check if crash expected by looking at the .expect file + # in var/tmp + my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect"; + if ( -f $expect_file ) { - next unless ( $mysqld->{proc} and $mysqld->{proc} eq $proc ); + mtr_verbose("Crash was expected, file '$expect_file' exists"); - # Check if crash expected by looking at the .expect file - # in var/tmp - my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect"; - if ( -f $expect_file ) + for (my $waits = 0; $waits < 50; mtr_milli_sleep(100), $waits++) { - mtr_verbose("Crash was expected, file '$expect_file' exists"); - - for (my $waits = 0; $waits < 50; mtr_milli_sleep(100), $waits++) + # Race condition seen on Windows: try again until file not empty + next if -z $expect_file; + # If last line in expect file starts with "wait" + # sleep a little and try again, thus allowing the + # test script to control when the server should start + # up again. Keep trying for up to 5s at a time. + my $last_line= mtr_lastlinesfromfile($expect_file, 1); + if ($last_line =~ /^wait/ ) { - # Race condition seen on Windows: try again until file not empty - next if -z $expect_file; - # If last line in expect file starts with "wait" - # sleep a little and try again, thus allowing the - # test script to control when the server should start - # up again. Keep trying for up to 5s at a time. - my $last_line= mtr_lastlinesfromfile($expect_file, 1); - if ($last_line =~ /^wait/ ) - { - mtr_verbose("Test says wait before restart") if $waits == 0; - next; - } - - # Ignore any partial or unknown command - next unless $last_line =~ /^restart/; - # If last line begins "restart:", the rest of the line is read as - # extra command line options to add to the restarted mysqld. - # Anything other than 'wait' or 'restart:' (with a colon) will - # result in a restart with original mysqld options. - if ($last_line =~ /restart:(.+)/) { - my @rest_opt= split(' ', $1); - $mysqld->{'restart_opts'}= \@rest_opt; - } else { - delete $mysqld->{'restart_opts'}; - } - unlink($expect_file); - - # Start server with same settings as last time - mysqld_start($mysqld, $mysqld->{'started_opts'}); - - return 1; + mtr_verbose("Test says wait before restart") if $waits == 0; + next; } - # Loop ran through: we should keep waiting after a re-check - return 2; + + # Ignore any partial or unknown command + next unless $last_line =~ /^restart/; + # If last line begins "restart:", the rest of the line is read as + # extra command line options to add to the restarted mysqld. + # Anything other than 'wait' or 'restart:' (with a colon) will + # result in a restart with original mysqld options. + if ($last_line =~ /restart:(.+)/) { + my @rest_opt= split(' ', $1); + $mysqld->{'restart_opts'}= \@rest_opt; + } else { + delete $mysqld->{'restart_opts'}; + } + unlink($expect_file); + + # Start server with same settings as last time + return mysqld_start($mysqld, $mysqld->{'started_opts'}); } + # Loop ran through: we should keep waiting after a re-check + return 2; } # Not an expected crash @@ -5106,6 +5102,7 @@ sub mysqld_start ($$) { if ( defined $exe ) { + mtr_tofile($output, "\$ $exe @$args\n"); pre_write_errorlog($output); $mysqld->{'proc'}= My::SafeProcess->new ( @@ -5124,17 +5121,10 @@ sub mysqld_start ($$) { mtr_verbose("Started $mysqld->{proc}"); } - if (!sleep_until_file_created($mysqld->value('pid-file'), - $opt_start_timeout, $mysqld->{'proc'}, $warn_seconds)) - { - my $mname= $mysqld->name(); - mtr_error("Failed to start mysqld $mname with command $exe"); - } - - # Remember options used when starting $mysqld->{'started_opts'}= $extra_opts; - return; + return sleep_until_file_created($mysqld->value('pid-file'), + $opt_start_timeout, $mysqld->{'proc'}, $warn_seconds); } From 1223cfe1d3d72598e788582701989f9bb35695fb Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 5 Jul 2021 21:46:00 +0200 Subject: [PATCH 24/98] MDEV-25802 mtr: race condition if the test quickly restarts twice expect file is always removed before starting a server. So if it exists here, it means the server started successfully, mysqltest continued executing the test, created a new expect file, and shut down the server. All while we were waiting for the server to start. In other words, if the expect file exists, the server did actually start. Even if it isn't running now. This fixes occasional failures of innodb.log_corruption (in 10.6) --- mysql-test/lib/mtr_process.pl | 6 ++++-- mysql-test/mysql-test-run.pl | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl index cee9f2b6ed6..c568f8dc48c 100644 --- a/mysql-test/lib/mtr_process.pl +++ b/mysql-test/lib/mtr_process.pl @@ -40,7 +40,7 @@ BEGIN eval 'sub USE_NETPING { $use_netping }'; } -sub sleep_until_file_created ($$$$); +sub sleep_until_file_created ($$$$$); sub mtr_ping_port ($); sub mtr_ping_port ($) { @@ -102,8 +102,9 @@ sub mtr_ping_port ($) { # FIXME check that the pidfile contains the expected pid! -sub sleep_until_file_created ($$$$) { +sub sleep_until_file_created ($$$$$) { my $pidfile= shift; + my $expectfile = shift; my $timeout= shift; my $proc= shift; my $warn_seconds = shift; @@ -122,6 +123,7 @@ sub sleep_until_file_created ($$$$) { # Check if it died after the fork() was successful if ( defined $proc and ! $proc->wait_one(0) ) { + return 1 if -r $expectfile; mtr_warning("Process $proc died after mysql-test-run waited $seconds " . "seconds for $pidfile to be created."); return 0; diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index a91bdc0b751..29aaebd44b0 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2845,11 +2845,11 @@ sub mysql_server_start($) { sub mysql_server_wait { my ($mysqld, $tinfo) = @_; + my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect"; - if (!sleep_until_file_created($mysqld->value('pid-file'), - $opt_start_timeout, - $mysqld->{'proc'}, - $warn_seconds)) + if (!sleep_until_file_created($mysqld->value('pid-file'), $expect_file, + $opt_start_timeout, $mysqld->{'proc'}, + $warn_seconds)) { $tinfo->{comment}= "Failed to start ".$mysqld->name() . "\n"; return 1; @@ -5123,7 +5123,8 @@ sub mysqld_start ($$) { $mysqld->{'started_opts'}= $extra_opts; - return sleep_until_file_created($mysqld->value('pid-file'), + my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect"; + return sleep_until_file_created($mysqld->value('pid-file'), $expect_file, $opt_start_timeout, $mysqld->{'proc'}, $warn_seconds); } From 621fae3cbc79eb4d0277c40993328faa4019e95f Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 6 Jul 2021 11:36:59 +0200 Subject: [PATCH 25/98] MDEV-25802 mtr: race condition if the test quickly restarts twice part II need to tell SafeProcess not to collect the exited mysqld in sleep_until_file_created(), so that it would be found in the later wait_any_timeout() in run_testcase() Removed a strange condition in SafeProcess::wait_one() that treated return value of -1 from waitpid() as "process exists" instead of as "no such child process" (see `perldoc -f waitpid`) --- mysql-test/lib/My/SafeProcess.pm | 18 +++++++++--------- mysql-test/lib/mtr_process.pl | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm index 4f7464daf44..30c8fe54642 100644 --- a/mysql-test/lib/My/SafeProcess.pm +++ b/mysql-test/lib/My/SafeProcess.pm @@ -395,10 +395,10 @@ sub _collect { # 1 Still running # sub wait_one { - my ($self, $timeout)= @_; - croak "usage: \$safe_proc->wait_one([timeout])" unless ref $self; + my ($self, $timeout, $keep)= @_; + croak "usage: \$safe_proc->wait_one([timeout] [, keep])" unless ref $self; - _verbose("wait_one $self, $timeout"); + _verbose("wait_one $self, $timeout, $keep"); if ( ! defined($self->{SAFE_PID}) ) { # No pid => not running @@ -472,16 +472,16 @@ sub wait_one { return 1; } - if ( not $blocking and $retpid == -1 ) { - # still running - _verbose("still running"); - return 1; - } + #if ( not $blocking and $retpid == -1 ) { + # # still running + # _verbose("still running"); + # return 1; + #} #warn "wait_one: expected pid $pid but got $retpid" # unless( $retpid == $pid ); - $self->_collect($exit_code); + $self->_collect($exit_code) unless $keep; return 0; } diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl index c568f8dc48c..2ff78c0e10a 100644 --- a/mysql-test/lib/mtr_process.pl +++ b/mysql-test/lib/mtr_process.pl @@ -121,7 +121,7 @@ sub sleep_until_file_created ($$$$$) { my $seconds= ($loop * $sleeptime) / 1000; # Check if it died after the fork() was successful - if ( defined $proc and ! $proc->wait_one(0) ) + if ( defined $proc and ! $proc->wait_one(0, 1) ) { return 1 if -r $expectfile; mtr_warning("Process $proc died after mysql-test-run waited $seconds " . From 3fbe30024ff0b4e3f6e63027a988564a96b40bc6 Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Wed, 7 Jul 2021 10:58:25 +0200 Subject: [PATCH 26/98] MDEV-26080: SHOW GRANTS does not quote role names properly for DEFAULT ROLE - Proceed with commit fafb35ee517f309d9e507f6e3908caca5d8cd257 Reviewed by: serg@mariadb.com --- mysql-test/main/grant5.result | 21 +++++++++++++++++-- mysql-test/main/grant5.test | 14 +++++++++++++ mysql-test/main/mysql_upgrade.result | 2 +- .../suite/roles/set_default_role_clear.result | 2 +- .../suite/roles/set_default_role_for.result | 4 ++-- .../roles/set_default_role_invalid.result | 6 +++--- .../set_default_role_new_connection.result | 4 ++-- sql/sql_acl.cc | 13 ++++++------ 8 files changed, 48 insertions(+), 18 deletions(-) diff --git a/mysql-test/main/grant5.result b/mysql-test/main/grant5.result index abf17d736a7..83cd8677089 100644 --- a/mysql-test/main/grant5.result +++ b/mysql-test/main/grant5.result @@ -46,7 +46,7 @@ SHOW GRANTS FOR test_user; Grants for test_user@% GRANT `test_role` TO `test_user`@`%` GRANT USAGE ON *.* TO `test_user`@`%` -SET DEFAULT ROLE test_role FOR 'test_user'@'%' +SET DEFAULT ROLE `test_role` FOR `test_user`@`%` SET DEFAULT ROLE NONE for test_user; SHOW GRANTS FOR test_user; Grants for test_user@% @@ -60,7 +60,7 @@ GRANT `test_role` TO `root`@`localhost` WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO `test_role` -SET DEFAULT ROLE test_role FOR 'root'@'localhost' +SET DEFAULT ROLE `test_role` FOR `root`@`localhost` SET DEFAULT ROLE NONE; SHOW GRANTS; Grants for root@localhost @@ -164,4 +164,21 @@ drop user 'user1'@'localhost'; drop user 'fetch'@'localhost'; drop user 'user-1'@'localhost'; drop user 'O\'Brien'@'localhost'; +# +# MDEV-26080 SHOW GRANTS does not quote role names properly for DEFAULT ROLE +# +CREATE USER 'test-user'; +CREATE ROLE `r``o'l"e`; +select user from mysql.user where is_role='Y'; +user +r`o'l"e +GRANT `r``o'l"e` TO 'test-user'; +SET DEFAULT ROLE `r``o'l"e` FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +Grants for test-user@% +GRANT `r``o'l"e` TO `test-user`@`%` +GRANT USAGE ON *.* TO `test-user`@`%` +SET DEFAULT ROLE `r``o'l"e` FOR `test-user`@`%` +DROP ROLE `r``o'l"e`; +DROP USER 'test-user'; # End of 10.3 tests diff --git a/mysql-test/main/grant5.test b/mysql-test/main/grant5.test index 703d87f08cc..bd711640acb 100644 --- a/mysql-test/main/grant5.test +++ b/mysql-test/main/grant5.test @@ -121,4 +121,18 @@ drop user 'fetch'@'localhost'; drop user 'user-1'@'localhost'; drop user 'O\'Brien'@'localhost'; +--echo # +--echo # MDEV-26080 SHOW GRANTS does not quote role names properly for DEFAULT ROLE +--echo # + +CREATE USER 'test-user'; +CREATE ROLE `r``o'l"e`; +select user from mysql.user where is_role='Y'; +GRANT `r``o'l"e` TO 'test-user'; +SET DEFAULT ROLE `r``o'l"e` FOR 'test-user'; +# it is expected that quotes won't be shown correctly +SHOW GRANTS FOR 'test-user'; +DROP ROLE `r``o'l"e`; +DROP USER 'test-user'; + --echo # End of 10.3 tests diff --git a/mysql-test/main/mysql_upgrade.result b/mysql-test/main/mysql_upgrade.result index 51bd86ceccb..f4c51e17c04 100644 --- a/mysql-test/main/mysql_upgrade.result +++ b/mysql-test/main/mysql_upgrade.result @@ -858,7 +858,7 @@ GRANT `aRole` TO `root`@`localhost` WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO `aRole` -SET DEFAULT ROLE aRole FOR 'root'@'localhost' +SET DEFAULT ROLE `aRole` FOR `root`@`localhost` SET DEFAULT ROLE NONE; SHOW GRANTS; Grants for root@localhost diff --git a/mysql-test/suite/roles/set_default_role_clear.result b/mysql-test/suite/roles/set_default_role_clear.result index 05d52b6d58a..fbfb9369cae 100644 --- a/mysql-test/suite/roles/set_default_role_clear.result +++ b/mysql-test/suite/roles/set_default_role_clear.result @@ -17,7 +17,7 @@ Grants for test_user@localhost GRANT `test_role` TO `test_user`@`localhost` GRANT USAGE ON *.* TO `test_user`@`localhost` GRANT SELECT ON *.* TO `test_role` -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE `test_role` FOR `test_user`@`localhost` select user, host, default_role from mysql.user where user='test_user'; user host default_role test_user localhost test_role diff --git a/mysql-test/suite/roles/set_default_role_for.result b/mysql-test/suite/roles/set_default_role_for.result index b67b30ee075..9fde39ca6e4 100644 --- a/mysql-test/suite/roles/set_default_role_for.result +++ b/mysql-test/suite/roles/set_default_role_for.result @@ -21,7 +21,7 @@ Grants for user_a@localhost GRANT `role_a` TO `user_a`@`localhost` GRANT USAGE ON *.* TO `user_a`@`localhost` GRANT SELECT ON *.* TO `role_a` -SET DEFAULT ROLE role_a FOR 'user_a'@'localhost' +SET DEFAULT ROLE `role_a` FOR `user_a`@`localhost` select user, host, default_role from mysql.user where user like 'user_%'; user host default_role user_a localhost role_a @@ -43,7 +43,7 @@ Grants for user_b@localhost GRANT `role_b` TO `user_b`@`localhost` GRANT USAGE ON *.* TO `user_b`@`localhost` GRANT INSERT, UPDATE ON *.* TO `role_b` -SET DEFAULT ROLE role_b FOR 'user_b'@'localhost' +SET DEFAULT ROLE `role_b` FOR `user_b`@`localhost` select user, host, default_role from mysql.user where user like 'user_%'; ERROR 42000: SELECT command denied to user 'user_b'@'localhost' for table 'user' insert ignore into mysql.user (user, host) values ('someuser', 'somehost'); diff --git a/mysql-test/suite/roles/set_default_role_invalid.result b/mysql-test/suite/roles/set_default_role_invalid.result index 4417ef21f21..d6a48b67305 100644 --- a/mysql-test/suite/roles/set_default_role_invalid.result +++ b/mysql-test/suite/roles/set_default_role_invalid.result @@ -24,7 +24,7 @@ Grants for test_user@localhost GRANT `test_role` TO `test_user`@`localhost` GRANT USAGE ON *.* TO `test_user`@`localhost` GRANT SELECT ON *.* TO `test_role` -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE `test_role` FOR `test_user`@`localhost` select user, host, default_role from mysql.user where user='test_user'; user host default_role test_user localhost test_role @@ -72,7 +72,7 @@ GRANT `r1` TO `b`@`%` GRANT `r2` TO `b`@`%` GRANT USAGE ON *.* TO `b`@`%` GRANT SELECT ON `mysql`.* TO `b`@`%` -SET DEFAULT ROLE r2 FOR 'b'@'%' +SET DEFAULT ROLE `r2` FOR `b`@`%` SET DEFAULT ROLE r1 FOR a; ERROR 42000: Access denied for user 'b'@'%' to database 'mysql' SELECT CURRENT_ROLE; @@ -98,7 +98,7 @@ GRANT `r1` TO `b`@`%` GRANT `r2` TO `b`@`%` GRANT USAGE ON *.* TO `b`@`%` GRANT SELECT, UPDATE ON `mysql`.* TO `b`@`%` -SET DEFAULT ROLE r2 FOR 'b'@'%' +SET DEFAULT ROLE `r2` FOR `b`@`%` SET DEFAULT ROLE r1 FOR a; ERROR OP000: User `a@%` has not been granted role `r1` SET DEFAULT ROLE invalid_role; diff --git a/mysql-test/suite/roles/set_default_role_new_connection.result b/mysql-test/suite/roles/set_default_role_new_connection.result index eaa42193d6e..997ea46624c 100644 --- a/mysql-test/suite/roles/set_default_role_new_connection.result +++ b/mysql-test/suite/roles/set_default_role_new_connection.result @@ -23,7 +23,7 @@ Grants for test_user@localhost GRANT `test_role` TO `test_user`@`localhost` GRANT USAGE ON *.* TO `test_user`@`localhost` GRANT SELECT ON *.* TO `test_role` -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE `test_role` FOR `test_user`@`localhost` select user, host, default_role from mysql.user where user = 'test_user'; user host default_role test_user localhost test_role @@ -52,7 +52,7 @@ Grants for test_user@localhost GRANT `test_role` TO `test_user`@`localhost` GRANT USAGE ON *.* TO `test_user`@`localhost` GRANT SELECT ON *.* TO `test_role` -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE `test_role` FOR `test_user`@`localhost` select user, host, default_role from mysql.user where user = 'test_user'; user host default_role test_user localhost test_role diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 1327d2943b5..75959540c56 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -8847,14 +8847,13 @@ static bool show_default_role(THD *thd, ACL_USER *acl_entry, String def_str(buff, buffsize, system_charset_info); def_str.length(0); def_str.append(STRING_WITH_LEN("SET DEFAULT ROLE ")); - def_str.append(&def_rolename); - def_str.append(" FOR '"); - def_str.append(&acl_entry->user); + append_identifier(thd, &def_str, def_rolename.str, def_rolename.length); + def_str.append(" FOR "); + append_identifier(thd, &def_str, acl_entry->user.str, acl_entry->user.length); DBUG_ASSERT(!(acl_entry->flags & IS_ROLE)); - def_str.append(STRING_WITH_LEN("'@'")); - def_str.append(acl_entry->host.hostname, acl_entry->hostname_length, - system_charset_info); - def_str.append('\''); + def_str.append('@'); + append_identifier(thd, &def_str, acl_entry->host.hostname, + acl_entry->hostname_length); protocol->prepare_for_resend(); protocol->store(def_str.ptr(),def_str.length(),def_str.charset()); if (protocol->write()) From 83e442fc34e53f214a37f747e25656bf92785bd3 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 6 Jul 2021 14:38:32 -0700 Subject: [PATCH 27/98] MDEV-26095 Infinite recursion when processing embedded recursive CTE with missing RECURSIVE If a table reference r used inthe specification of a CTE whose definition is contained in the WITH clause where RECURSIVE is omitted then this table reference cannot be considered as a recursive table reference even if it is used in the query that specifies CTE whose name is r. It can be considered only as a reference to an embedding CTE or to a temporary table or to a base table/view. If there is no such object with name r then an error message must be reported. This patch fixes the code that actually in some cases resolved r as a reference to the CTE whose specification contained r if its name was r in spite of the fact that r was not considered as a recursive CTE. This happened in the cases when the definition of r was used in the specification of another CTE. Such wrong name resolution for r led to an infinite recursive invocations of the parser that ultimately crashed the server. This bug is a result of the fix for mdev-13780 that was not quite correct. Approved by Oleksandr Byelkin --- mysql-test/r/cte_nonrecursive.result | 25 +++++++++++++++++++++++++ mysql-test/t/cte_nonrecursive.test | 23 +++++++++++++++++++++++ sql/sql_cte.cc | 4 +++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result index c1d7fd0a615..5cc5a2503e3 100644 --- a/mysql-test/r/cte_nonrecursive.result +++ b/mysql-test/r/cte_nonrecursive.result @@ -2019,4 +2019,29 @@ drop procedure sp1; drop procedure sp2; drop procedure sp3; drop table t1; +# +# MDEV-26095: missing RECURSIVE for the recursive definition of CTE +# embedded into another CTE definition +# +create table t1 (a int); +insert into t1 values (5), (7); +with cte_e as ( +with recursive cte_r as ( +select a from t1 union select a+1 as a from cte_r r where a < 10 +) select * from cte_r +) select * from cte_e; +a +5 +7 +6 +8 +9 +10 +with cte_e as ( +with cte_r as ( +select a from t1 union select a+1 as a from cte_r r where a < 10 +) select * from cte_r +) select * from cte_e; +ERROR 42S02: Table 'test.cte_r' doesn't exist +drop table t1; # End of 10.2 tests diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test index cbe4f8b855d..68dbc0cac19 100644 --- a/mysql-test/t/cte_nonrecursive.test +++ b/mysql-test/t/cte_nonrecursive.test @@ -1492,4 +1492,27 @@ drop procedure sp3; drop table t1; +--echo # +--echo # MDEV-26095: missing RECURSIVE for the recursive definition of CTE +--echo # embedded into another CTE definition +--echo # + +create table t1 (a int); +insert into t1 values (5), (7); + +with cte_e as ( + with recursive cte_r as ( + select a from t1 union select a+1 as a from cte_r r where a < 10 + ) select * from cte_r +) select * from cte_e; + +--ERROR ER_NO_SUCH_TABLE +with cte_e as ( + with cte_r as ( + select a from t1 union select a+1 as a from cte_r r where a < 10 + ) select * from cte_r +) select * from cte_e; + +drop table t1; + --echo # End of 10.2 tests diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc index 9dad33d5b71..702db8f96d9 100644 --- a/sql/sql_cte.cc +++ b/sql/sql_cte.cc @@ -1256,6 +1256,7 @@ bool With_element::is_anchor(st_select_lex *sel) With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table) { With_element *found= NULL; + With_clause *containing_with_clause= NULL; st_select_lex_unit *master_unit; st_select_lex *outer_sl; for (st_select_lex *sl= this; sl; sl= outer_sl) @@ -1268,6 +1269,7 @@ With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table) */ With_clause *attached_with_clause= sl->get_with_clause(); if (attached_with_clause && + attached_with_clause != containing_with_clause && (found= attached_with_clause->find_table_def(table, NULL))) break; master_unit= sl->master_unit(); @@ -1275,7 +1277,7 @@ With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table) With_element *with_elem= sl->get_with_element(); if (with_elem) { - With_clause *containing_with_clause= with_elem->get_owner(); + containing_with_clause= with_elem->get_owner(); With_element *barrier= containing_with_clause->with_recursive ? NULL : with_elem; if ((found= containing_with_clause->find_table_def(table, barrier))) From d2dddbff4e6f04ececb2c192f2d8725f128f2ba8 Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Fri, 2 Jul 2021 15:11:25 +0200 Subject: [PATCH 28/98] MDEV-26080: SHOW GRANTS does not quote role names properly for DEFAULT ROLE - Used single quotes, back quotes are used with commit fafb35ee517f309d9e507f6e3908caca5d8cd257 in 10.3 and will be changed. Reviewed by: serg@mariadb.org --- mysql-test/r/grant5.result | 45 +++++-- mysql-test/r/mysql_upgrade.result | 6 +- mysql-test/r/mysqldump-system.result | 24 ++-- mysql-test/suite/roles/admin.result | 44 +++---- .../suite/roles/create_and_drop_role.result | 2 +- .../suite/roles/create_and_grant_role.result | 2 +- mysql-test/suite/roles/definer.result | 2 +- mysql-test/suite/roles/drop_routines.result | 14 +-- .../suite/roles/flush_roles-17898.result | 4 +- mysql-test/suite/roles/grant-5771.result | 4 +- mysql-test/suite/roles/grant_empty.result | 2 +- .../suite/roles/grant_revoke_current.result | 4 +- mysql-test/suite/roles/ip-6401.result | 2 +- .../suite/roles/prepare_stmt_with_role.result | 8 +- .../suite/roles/rebuild_role_grants.result | 6 +- mysql-test/suite/roles/recursive.result | 112 +++++++++--------- mysql-test/suite/roles/recursive_dbug.result | 112 +++++++++--------- mysql-test/suite/roles/revoke_all.result | 50 ++++---- .../roles/role_case_sensitive-10744.result | 6 +- mysql-test/suite/roles/rpl_definer.result | 12 +- mysql-test/suite/roles/set_and_drop.result | 2 +- .../suite/roles/set_default_role_clear.result | 6 +- .../suite/roles/set_default_role_for.result | 10 +- .../roles/set_default_role_invalid.result | 18 +-- .../set_default_role_new_connection.result | 12 +- mysql-test/suite/roles/set_role-13655.result | 6 +- mysql-test/suite/roles/set_role-9614.result | 6 +- .../roles/set_role-database-recursive.result | 10 +- .../suite/roles/set_role-multiple-role.result | 42 +++---- .../suite/roles/set_role-recursive.result | 28 ++--- .../roles/set_role-routine-simple.result | 18 +-- mysql-test/suite/roles/set_role-simple.result | 4 +- .../roles/set_role-table-column-priv.result | 10 +- .../suite/roles/set_role-table-simple.result | 10 +- mysql-test/suite/roles/show_grants.result | 44 +++---- .../suite/roles/show_grants_replicated.result | 2 +- mysql-test/t/grant5.test | 23 ++++ sql/sql_acl.cc | 8 +- 38 files changed, 387 insertions(+), 333 deletions(-) diff --git a/mysql-test/r/grant5.result b/mysql-test/r/grant5.result index a69070e8399..3b16d033f5e 100644 --- a/mysql-test/r/grant5.result +++ b/mysql-test/r/grant5.result @@ -8,7 +8,7 @@ connect conn_1, localhost, test,,; set role foo; show grants for test; Grants for test@% -GRANT foo TO 'test'@'%' +GRANT 'foo' TO 'test'@'%' GRANT USAGE ON *.* TO 'test'@'%' show grants for foo; Grants for foo @@ -45,29 +45,60 @@ GRANT test_role TO test_user; SET DEFAULT ROLE test_role FOR test_user; SHOW GRANTS FOR test_user; Grants for test_user@% -GRANT test_role TO 'test_user'@'%' +GRANT 'test_role' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' -SET DEFAULT ROLE test_role FOR 'test_user'@'%' +SET DEFAULT ROLE 'test_role' FOR 'test_user'@'%' SET DEFAULT ROLE NONE for test_user; SHOW GRANTS FOR test_user; Grants for test_user@% -GRANT test_role TO 'test_user'@'%' +GRANT 'test_role' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' SET ROLE test_role; SET DEFAULT ROLE test_role; SHOW GRANTS; Grants for root@localhost -GRANT test_role TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'test_role' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'test_role' -SET DEFAULT ROLE test_role FOR 'root'@'localhost' +SET DEFAULT ROLE 'test_role' FOR 'root'@'localhost' SET DEFAULT ROLE NONE; SHOW GRANTS; Grants for root@localhost -GRANT test_role TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'test_role' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'test_role' DROP USER test_user; DROP ROLE test_role; +CREATE ROLE 'test-role'; +CREATE USER 'test-user'; +GRANT 'test-role' TO 'test-user'; +SET DEFAULT ROLE 'test-role' FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +Grants for test-user@% +GRANT 'test-role' TO 'test-user'@'%' +GRANT USAGE ON *.* TO 'test-user'@'%' +SET DEFAULT ROLE 'test-role' FOR 'test-user'@'%' +DROP ROLE 'test-role'; +SHOW GRANTS FOR 'test-user'; +Grants for test-user@% +GRANT USAGE ON *.* TO 'test-user'@'%' +SET DEFAULT ROLE 'test-role' FOR 'test-user'@'%' +SET DEFAULT ROLE NONE FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +Grants for test-user@% +GRANT USAGE ON *.* TO 'test-user'@'%' +CREATE ROLE `r``o'l"e`; +select user from mysql.user where is_role='Y'; +user +r`o'l"e +GRANT `r``o'l"e` TO 'test-user'; +SET DEFAULT ROLE `r``o'l"e` FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +Grants for test-user@% +GRANT 'r`o'l"e' TO 'test-user'@'%' +GRANT USAGE ON *.* TO 'test-user'@'%' +SET DEFAULT ROLE 'r`o'l"e' FOR 'test-user'@'%' +DROP ROLE `r``o'l"e`; +DROP USER 'test-user'; diff --git a/mysql-test/r/mysql_upgrade.result b/mysql-test/r/mysql_upgrade.result index 3961c7e8c27..79c15984a12 100644 --- a/mysql-test/r/mysql_upgrade.result +++ b/mysql-test/r/mysql_upgrade.result @@ -840,15 +840,15 @@ CREATE ROLE `aRole`; SET DEFAULT ROLE aRole; SHOW GRANTS; Grants for root@localhost -GRANT aRole TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'aRole' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'aRole' -SET DEFAULT ROLE aRole FOR 'root'@'localhost' +SET DEFAULT ROLE 'aRole' FOR 'root'@'localhost' SET DEFAULT ROLE NONE; SHOW GRANTS; Grants for root@localhost -GRANT aRole TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'aRole' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'aRole' diff --git a/mysql-test/r/mysqldump-system.result b/mysql-test/r/mysqldump-system.result index 74cfc4e9882..7746417715f 100644 --- a/mysql-test/r/mysqldump-system.result +++ b/mysql-test/r/mysqldump-system.result @@ -61,17 +61,17 @@ SET ROLE mariadb_dump_import_role; /*!80001 CREATE ROLE 'role_2' */; /*M!100005 CREATE ROLE 'role_2' WITH ADMIN mariadb_dump_import_role */; /*M!100005 GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION */; -GRANT role_1 TO 'root'@'localhost' WITH ADMIN OPTION; +GRANT 'role_1' TO 'root'@'localhost' WITH ADMIN OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION; /*M!100005 SET DEFAULT ROLE NONE FOR 'root'@'localhost' */; /*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */; -GRANT role_1 TO 'USER'@'%'; -GRANT role_2 TO 'USER'@'%'; +GRANT 'role_1' TO 'USER'@'%'; +GRANT 'role_2' TO 'USER'@'%'; GRANT USAGE ON *.* TO 'USER'@'%' IDENTIFIED VIA unix_socket; /*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */; /*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */; -GRANT role_2 TO 'role_1' WITH ADMIN OPTION; +GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION; GRANT SHOW DATABASES ON *.* TO 'role_1'; GRANT USAGE ON *.* TO 'role_2'; GRANT USAGE ON *.* TO 'role_2'; @@ -196,17 +196,17 @@ SET ROLE mariadb_dump_import_role; /*!80001 CREATE ROLE 'role_2' */; /*M!100103 CREATE OR REPLACE ROLE 'role_2' WITH ADMIN mariadb_dump_import_role */; /*M!100005 GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION */; -GRANT role_1 TO 'root'@'localhost' WITH ADMIN OPTION; +GRANT 'role_1' TO 'root'@'localhost' WITH ADMIN OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION; /*M!100005 SET DEFAULT ROLE NONE FOR 'root'@'localhost' */; /*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */; -GRANT role_1 TO 'USER'@'%'; -GRANT role_2 TO 'USER'@'%'; +GRANT 'role_1' TO 'USER'@'%'; +GRANT 'role_2' TO 'USER'@'%'; GRANT USAGE ON *.* TO 'USER'@'%' IDENTIFIED VIA unix_socket; /*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */; /*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */; -GRANT role_2 TO 'role_1' WITH ADMIN OPTION; +GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION; GRANT SHOW DATABASES ON *.* TO 'role_1'; GRANT USAGE ON *.* TO 'role_2'; GRANT USAGE ON *.* TO 'role_2'; @@ -317,17 +317,17 @@ SET ROLE mariadb_dump_import_role; /*!80001 CREATE ROLE IF NOT EXISTS 'role_2' */; /*M!100005 CREATE ROLE IF NOT EXISTS 'role_2' WITH ADMIN mariadb_dump_import_role */; /*M!100005 GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION */; -GRANT role_1 TO 'root'@'localhost' WITH ADMIN OPTION; +GRANT 'role_1' TO 'root'@'localhost' WITH ADMIN OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION; /*M!100005 SET DEFAULT ROLE NONE FOR 'root'@'localhost' */; /*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */; -GRANT role_1 TO 'USER'@'%'; -GRANT role_2 TO 'USER'@'%'; +GRANT 'role_1' TO 'USER'@'%'; +GRANT 'role_2' TO 'USER'@'%'; GRANT USAGE ON *.* TO 'USER'@'%' IDENTIFIED VIA unix_socket; /*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */; /*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */; -GRANT role_2 TO 'role_1' WITH ADMIN OPTION; +GRANT 'role_2' TO 'role_1' WITH ADMIN OPTION; GRANT SHOW DATABASES ON *.* TO 'role_1'; GRANT USAGE ON *.* TO 'role_2'; GRANT USAGE ON *.* TO 'role_2'; diff --git a/mysql-test/suite/roles/admin.result b/mysql-test/suite/roles/admin.result index 87d2888b47c..d5e4e1370db 100644 --- a/mysql-test/suite/roles/admin.result +++ b/mysql-test/suite/roles/admin.result @@ -27,19 +27,19 @@ grant select on *.* to foo@localhost with admin option; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'admin option' at line 1 show grants for foo@localhost; Grants for foo@localhost +GRANT 'role1' TO 'foo'@'localhost' WITH ADMIN OPTION +GRANT 'role2' TO 'foo'@'localhost' +GRANT 'role5' TO 'foo'@'localhost' WITH ADMIN OPTION GRANT CREATE USER ON *.* TO 'foo'@'localhost' -GRANT role1 TO 'foo'@'localhost' WITH ADMIN OPTION -GRANT role2 TO 'foo'@'localhost' -GRANT role5 TO 'foo'@'localhost' WITH ADMIN OPTION show grants for role1; Grants for role1 +GRANT 'role2' TO 'role1' +GRANT 'role3' TO 'role1' WITH ADMIN OPTION +GRANT 'role4' TO 'role3' WITH ADMIN OPTION GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' GRANT USAGE ON *.* TO 'role3' GRANT USAGE ON *.* TO 'role4' -GRANT role2 TO 'role1' -GRANT role3 TO 'role1' WITH ADMIN OPTION -GRANT role4 TO 'role3' WITH ADMIN OPTION show grants for role4; Grants for role4 GRANT USAGE ON *.* TO 'role4' @@ -58,19 +58,19 @@ localhost root role4 Y flush privileges; show grants for foo@localhost; Grants for foo@localhost +GRANT 'role1' TO 'foo'@'localhost' WITH ADMIN OPTION +GRANT 'role2' TO 'foo'@'localhost' +GRANT 'role5' TO 'foo'@'localhost' WITH ADMIN OPTION GRANT CREATE USER ON *.* TO 'foo'@'localhost' -GRANT role1 TO 'foo'@'localhost' WITH ADMIN OPTION -GRANT role2 TO 'foo'@'localhost' -GRANT role5 TO 'foo'@'localhost' WITH ADMIN OPTION show grants for role1; Grants for role1 +GRANT 'role2' TO 'role1' +GRANT 'role3' TO 'role1' WITH ADMIN OPTION +GRANT 'role4' TO 'role3' WITH ADMIN OPTION GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' GRANT USAGE ON *.* TO 'role3' GRANT USAGE ON *.* TO 'role4' -GRANT role2 TO 'role1' -GRANT role3 TO 'role1' WITH ADMIN OPTION -GRANT role4 TO 'role3' WITH ADMIN OPTION show grants for role4; Grants for role4 GRANT USAGE ON *.* TO 'role4' @@ -89,18 +89,18 @@ revoke admin option for role2 from foo@localhost; revoke admin option for role1 from root@localhost; show grants for foo@localhost; Grants for foo@localhost +GRANT 'role2' TO 'foo'@'localhost' +GRANT 'role5' TO 'foo'@'localhost' WITH ADMIN OPTION GRANT CREATE USER ON *.* TO 'foo'@'localhost' -GRANT role2 TO 'foo'@'localhost' -GRANT role5 TO 'foo'@'localhost' WITH ADMIN OPTION show grants for role1; Grants for role1 +GRANT 'role2' TO 'role1' WITH ADMIN OPTION +GRANT 'role3' TO 'role1' WITH ADMIN OPTION +GRANT 'role4' TO 'role3' GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' GRANT USAGE ON *.* TO 'role3' GRANT USAGE ON *.* TO 'role4' -GRANT role2 TO 'role1' WITH ADMIN OPTION -GRANT role3 TO 'role1' WITH ADMIN OPTION -GRANT role4 TO 'role3' show grants for role4; Grants for role4 GRANT USAGE ON *.* TO 'role4' @@ -118,18 +118,18 @@ localhost root role4 Y flush privileges; show grants for foo@localhost; Grants for foo@localhost +GRANT 'role2' TO 'foo'@'localhost' +GRANT 'role5' TO 'foo'@'localhost' WITH ADMIN OPTION GRANT CREATE USER ON *.* TO 'foo'@'localhost' -GRANT role2 TO 'foo'@'localhost' -GRANT role5 TO 'foo'@'localhost' WITH ADMIN OPTION show grants for role1; Grants for role1 +GRANT 'role2' TO 'role1' WITH ADMIN OPTION +GRANT 'role3' TO 'role1' WITH ADMIN OPTION +GRANT 'role4' TO 'role3' GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' GRANT USAGE ON *.* TO 'role3' GRANT USAGE ON *.* TO 'role4' -GRANT role2 TO 'role1' WITH ADMIN OPTION -GRANT role3 TO 'role1' WITH ADMIN OPTION -GRANT role4 TO 'role3' show grants for role4; Grants for role4 GRANT USAGE ON *.* TO 'role4' diff --git a/mysql-test/suite/roles/create_and_drop_role.result b/mysql-test/suite/roles/create_and_drop_role.result index a163ee82f42..b13f6eb4cb8 100644 --- a/mysql-test/suite/roles/create_and_drop_role.result +++ b/mysql-test/suite/roles/create_and_drop_role.result @@ -66,7 +66,7 @@ localhost r1 r2 N localhost root r2 Y SHOW GRANTS FOR r1@localhost; Grants for r1@localhost -GRANT r2 TO 'r1'@'localhost' +GRANT 'r2' TO 'r1'@'localhost' GRANT USAGE ON *.* TO 'r1'@'localhost' DROP USER u1; DROP ROLE r2; diff --git a/mysql-test/suite/roles/create_and_grant_role.result b/mysql-test/suite/roles/create_and_grant_role.result index 883ae44397d..b298b2baeee 100644 --- a/mysql-test/suite/roles/create_and_grant_role.result +++ b/mysql-test/suite/roles/create_and_grant_role.result @@ -13,10 +13,10 @@ Host User Role Admin_option localhost root r1 Y show grants; Grants for root@localhost +GRANT 'r1' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'r1' -GRANT r1 TO 'root'@'localhost' WITH ADMIN OPTION drop role r1; select * from mysql.roles_mapping; Host User Role Admin_option diff --git a/mysql-test/suite/roles/definer.result b/mysql-test/suite/roles/definer.result index 0a83262add1..19d5a026e65 100644 --- a/mysql-test/suite/roles/definer.result +++ b/mysql-test/suite/roles/definer.result @@ -38,7 +38,7 @@ connect c1, localhost, foo,,mysqltest1; connection c1; show grants; Grants for foo@localhost -GRANT role4 TO 'foo'@'localhost' +GRANT 'role4' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT CREATE VIEW ON `mysqltest1`.* TO 'foo'@'localhost' select * from test.v1; diff --git a/mysql-test/suite/roles/drop_routines.result b/mysql-test/suite/roles/drop_routines.result index 11eda3a290f..8a5bb4f218c 100644 --- a/mysql-test/suite/roles/drop_routines.result +++ b/mysql-test/suite/roles/drop_routines.result @@ -7,15 +7,15 @@ grant r3 to r2; grant r1 to u1; show grants for u1; Grants for u1@% +GRANT 'r1' TO 'u1'@'%' GRANT USAGE ON *.* TO 'u1'@'%' -GRANT r1 TO 'u1'@'%' show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' grant SELECT on *.* to u1; grant INSERT on mysql.* to r1; grant DELETE on mysql.roles_mapping to r2; @@ -33,6 +33,8 @@ revoke execute on procedure mysql.test_proc from r2; ERROR 42000: There is no such grant defined for user 'r2' on host '' on routine 'test_proc' show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -41,17 +43,15 @@ GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' show grants for r2; Grants for r2 +GRANT 'r3' TO 'r2' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' -GRANT r3 TO 'r2' show grants for r3; Grants for r3 GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -64,11 +64,11 @@ returns CHAR(50) DETERMINISTIC return concat('Test string: ',s); show grants for r2; Grants for r2 +GRANT 'r3' TO 'r2' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' -GRANT r3 TO 'r2' connect u1,localhost,u1,,; select mysql.test_func("none"); ERROR 42000: execute command denied to user 'u1'@'%' for routine 'mysql.test_func' diff --git a/mysql-test/suite/roles/flush_roles-17898.result b/mysql-test/suite/roles/flush_roles-17898.result index ae8fb0a27d2..a1a8f1a5dde 100644 --- a/mysql-test/suite/roles/flush_roles-17898.result +++ b/mysql-test/suite/roles/flush_roles-17898.result @@ -24,11 +24,11 @@ grant select on m_.* to r2; grant r2 to r1; show grants for u1@localhost; Grants for u1@localhost -GRANT r1 TO 'u1'@'localhost' +GRANT 'r1' TO 'u1'@'localhost' GRANT USAGE ON *.* TO 'u1'@'localhost' show grants for r1; Grants for r1 -GRANT r2 TO 'r1' +GRANT 'r2' TO 'r1' GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT SELECT ON `test`.* TO 'r2' diff --git a/mysql-test/suite/roles/grant-5771.result b/mysql-test/suite/roles/grant-5771.result index 87797d8b9a4..5b4c98522f0 100644 --- a/mysql-test/suite/roles/grant-5771.result +++ b/mysql-test/suite/roles/grant-5771.result @@ -21,9 +21,9 @@ show tables in mysqltest2; Tables_in_mysqltest2 show grants; Grants for foo@localhost -GRANT r2 TO 'foo'@'localhost' +GRANT 'r2' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' -GRANT r1 TO 'r2' +GRANT 'r1' TO 'r2' GRANT USAGE ON *.* TO 'r2' GRANT ALL PRIVILEGES ON `mysqltest2`.* TO 'r2' GRANT USAGE ON *.* TO 'r1' diff --git a/mysql-test/suite/roles/grant_empty.result b/mysql-test/suite/roles/grant_empty.result index 3316c755b9f..7ed9c663128 100644 --- a/mysql-test/suite/roles/grant_empty.result +++ b/mysql-test/suite/roles/grant_empty.result @@ -9,7 +9,7 @@ current_user @localhost show grants; Grants for @localhost -GRANT r1 TO ''@'localhost' +GRANT 'r1' TO ''@'localhost' GRANT USAGE ON *.* TO ''@'localhost' connection default; drop role r1; diff --git a/mysql-test/suite/roles/grant_revoke_current.result b/mysql-test/suite/roles/grant_revoke_current.result index 436bec92a8f..c3774923cd3 100644 --- a/mysql-test/suite/roles/grant_revoke_current.result +++ b/mysql-test/suite/roles/grant_revoke_current.result @@ -27,14 +27,14 @@ GRANT USAGE ON *.* TO 'r1' set password=password('foobar'); show grants; Grants for root@localhost -GRANT r1 TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'r1' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*9B500343BC52E2911172EB52AE5CF4847604C6E5' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'r1' grant r1 to current_user() identified by 'barfoo'; show grants; Grants for root@localhost -GRANT r1 TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'r1' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*343915A8181B5728EADBDC73E1F7E6B0C3998483' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'r1' diff --git a/mysql-test/suite/roles/ip-6401.result b/mysql-test/suite/roles/ip-6401.result index 1afd649636e..1b27e82bce1 100644 --- a/mysql-test/suite/roles/ip-6401.result +++ b/mysql-test/suite/roles/ip-6401.result @@ -4,7 +4,7 @@ grant r1 to foo@'127.0.0.1'; connect con1,127.0.0.1,foo,,; show grants; Grants for foo@127.0.0.1 -GRANT r1 TO 'foo'@'127.0.0.1' +GRANT 'r1' TO 'foo'@'127.0.0.1' GRANT USAGE ON *.* TO 'foo'@'127.0.0.1' set role r1; select * from information_schema.enabled_roles; diff --git a/mysql-test/suite/roles/prepare_stmt_with_role.result b/mysql-test/suite/roles/prepare_stmt_with_role.result index 0352502c35c..b2af23c8fbb 100644 --- a/mysql-test/suite/roles/prepare_stmt_with_role.result +++ b/mysql-test/suite/roles/prepare_stmt_with_role.result @@ -17,7 +17,7 @@ user host is_role developers Y SHOW GRANTS; Grants for root@localhost -GRANT developers TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'developers' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION # Test reexecution. @@ -40,7 +40,7 @@ Host User Role Admin_option localhost root developers Y SHOW GRANTS FOR test_user; Grants for test_user@% -GRANT developers TO 'test_user'@'%' +GRANT 'developers' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' # # Test revoking a role. @@ -56,7 +56,7 @@ GRANT USAGE ON *.* TO 'test_user'@'%' EXECUTE stmtGrantRole; SHOW GRANTS FOR test_user; Grants for test_user@% -GRANT developers TO 'test_user'@'%' +GRANT 'developers' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' EXECUTE stmtRevokeRole; SHOW GRANTS FOR test_user; @@ -96,7 +96,7 @@ Host User Role Admin_option localhost root developers Y SHOW GRANTS; Grants for root@localhost -GRANT developers TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'developers' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION SHOW GRANTS FOR test_user; diff --git a/mysql-test/suite/roles/rebuild_role_grants.result b/mysql-test/suite/roles/rebuild_role_grants.result index 1068be9bc01..72eabe38b93 100644 --- a/mysql-test/suite/roles/rebuild_role_grants.result +++ b/mysql-test/suite/roles/rebuild_role_grants.result @@ -3,13 +3,13 @@ create user u1; grant r1 to u1; show grants for u1; Grants for u1@% +GRANT 'r1' TO 'u1'@'%' GRANT USAGE ON *.* TO 'u1'@'%' -GRANT r1 TO 'u1'@'%' create user u2; show grants for u1; Grants for u1@% +GRANT 'r1' TO 'u1'@'%' GRANT USAGE ON *.* TO 'u1'@'%' -GRANT r1 TO 'u1'@'%' show grants for u2; Grants for u2@% GRANT USAGE ON *.* TO 'u2'@'%' @@ -30,8 +30,8 @@ grant r1 to u1; grant r1 to u1; show grants for u1; Grants for u1@% +GRANT 'r1' TO 'u1'@'%' GRANT USAGE ON *.* TO 'u1'@'%' -GRANT r1 TO 'u1'@'%' select * from mysql.roles_mapping; Host User Role Admin_option % u1 r1 N diff --git a/mysql-test/suite/roles/recursive.result b/mysql-test/suite/roles/recursive.result index 897577ba2ff..18fb573ecc0 100644 --- a/mysql-test/suite/roles/recursive.result +++ b/mysql-test/suite/roles/recursive.result @@ -26,8 +26,8 @@ ERROR HY000: Cannot grant role 'role10' to: 'role2' connect foo, localhost, foo; show grants; Grants for foo@localhost +GRANT 'role10' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' -GRANT role10 TO 'foo'@'localhost' select * from information_schema.applicable_roles; GRANTEE ROLE_NAME IS_GRANTABLE IS_DEFAULT foo@localhost role10 NO NO @@ -56,6 +56,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON *.* TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role10' @@ -66,17 +77,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' select * from information_schema.enabled_roles; ROLE_NAME role1 @@ -114,6 +114,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON `mysql`.* TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -125,17 +136,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select on mysql.* from role1; show status like 'debug%'; @@ -157,6 +157,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -168,17 +179,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select on mysql.roles_mapping from role1; show status like 'debug%'; @@ -202,6 +202,17 @@ count(concat(User)) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT (User) ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -213,17 +224,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; grant select(Host) on mysql.roles_mapping to role3; show status like 'debug%'; @@ -236,6 +236,17 @@ count(concat(User,Host)) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT (Host) ON `mysql`.`roles_mapping` TO 'role3' GRANT SELECT (User) ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' @@ -248,17 +259,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select(User) on mysql.roles_mapping from role1; show status like 'debug%'; diff --git a/mysql-test/suite/roles/recursive_dbug.result b/mysql-test/suite/roles/recursive_dbug.result index cec461be4a2..a5772a6354c 100644 --- a/mysql-test/suite/roles/recursive_dbug.result +++ b/mysql-test/suite/roles/recursive_dbug.result @@ -30,8 +30,8 @@ ERROR HY000: Cannot grant role 'role10' to: 'role2' connect foo, localhost, foo; show grants; Grants for foo@localhost +GRANT 'role10' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' -GRANT role10 TO 'foo'@'localhost' select * from information_schema.applicable_roles; GRANTEE ROLE_NAME IS_GRANTABLE IS_DEFAULT foo@localhost role10 NO NO @@ -70,6 +70,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON *.* TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role10' @@ -80,17 +91,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' select * from information_schema.enabled_roles; ROLE_NAME role1 @@ -138,6 +138,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON `mysql`.* TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -149,17 +160,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select on mysql.* from role1; show status like 'debug%'; @@ -191,6 +191,17 @@ count(*) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -202,17 +213,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select on mysql.roles_mapping from role1; show status like 'debug%'; @@ -246,6 +246,17 @@ count(concat(User)) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT (User) ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' @@ -257,17 +268,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; grant select(Host) on mysql.roles_mapping to role3; show status like 'debug%'; @@ -285,6 +285,17 @@ count(concat(User,Host)) 22 show grants; Grants for foo@localhost +GRANT 'role1' TO 'role2' +GRANT 'role10' TO 'foo'@'localhost' +GRANT 'role2' TO 'role4' +GRANT 'role2' TO 'role5' +GRANT 'role3' TO 'role5' +GRANT 'role4' TO 'role6' +GRANT 'role5' TO 'role6' +GRANT 'role5' TO 'role7' +GRANT 'role6' TO 'role9' +GRANT 'role7' TO 'role9' +GRANT 'role9' TO 'role10' GRANT SELECT (Host) ON `mysql`.`roles_mapping` TO 'role3' GRANT SELECT (User) ON `mysql`.`roles_mapping` TO 'role1' GRANT USAGE ON *.* TO 'foo'@'localhost' @@ -297,17 +308,6 @@ GRANT USAGE ON *.* TO 'role5' GRANT USAGE ON *.* TO 'role6' GRANT USAGE ON *.* TO 'role7' GRANT USAGE ON *.* TO 'role9' -GRANT role1 TO 'role2' -GRANT role10 TO 'foo'@'localhost' -GRANT role2 TO 'role4' -GRANT role2 TO 'role5' -GRANT role3 TO 'role5' -GRANT role4 TO 'role6' -GRANT role5 TO 'role6' -GRANT role5 TO 'role7' -GRANT role6 TO 'role9' -GRANT role7 TO 'role9' -GRANT role9 TO 'role10' connection default; revoke select(User) on mysql.roles_mapping from role1; show status like 'debug%'; diff --git a/mysql-test/suite/roles/revoke_all.result b/mysql-test/suite/roles/revoke_all.result index 7e72b5bc766..b2457e6b5f5 100644 --- a/mysql-test/suite/roles/revoke_all.result +++ b/mysql-test/suite/roles/revoke_all.result @@ -10,18 +10,18 @@ grant r1 to u1; grant r4 to r1; show grants for u1; Grants for u1@% +GRANT 'r1' TO 'u1'@'%' GRANT USAGE ON *.* TO 'u1'@'%' -GRANT r1 TO 'u1'@'%' show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r1' +GRANT 'r4' TO 'r3' GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' -GRANT r4 TO 'r1' -GRANT r4 TO 'r3' grant SELECT on *.* to u1; grant INSERT on mysql.* to r1; grant DELETE on mysql.roles_mapping to r2; @@ -38,6 +38,10 @@ grant execute on procedure mysql.test_proc to r3; grant execute on mysql.* to r4; show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r1' +GRANT 'r4' TO 'r3' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -48,12 +52,10 @@ GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' -GRANT r4 TO 'r1' -GRANT r4 TO 'r3' show grants for r2; Grants for r2 +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r3' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -62,16 +64,14 @@ GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r3 TO 'r2' -GRANT r4 TO 'r3' show grants for r3; Grants for r3 +GRANT 'r4' TO 'r3' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' GRANT EXECUTE ON `mysql`.* TO 'r4' GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r4 TO 'r3' show grants for r4; Grants for r4 GRANT EXECUTE ON `mysql`.* TO 'r4' @@ -79,6 +79,10 @@ GRANT USAGE ON *.* TO 'r4' revoke all privileges, grant option from r4; show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r1' +GRANT 'r4' TO 'r3' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -88,12 +92,10 @@ GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' -GRANT r4 TO 'r1' -GRANT r4 TO 'r3' show grants for r2; Grants for r2 +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r3' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' @@ -101,21 +103,22 @@ GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r3 TO 'r2' -GRANT r4 TO 'r3' show grants for r3; Grants for r3 +GRANT 'r4' TO 'r3' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'r3' GRANT UPDATE ON `mysql`.`user` TO 'r3' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r4 TO 'r3' show grants for r4; Grants for r4 GRANT USAGE ON *.* TO 'r4' revoke all privileges, grant option from r3; show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r3' TO 'r2' +GRANT 'r4' TO 'r1' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT INSERT ON `mysql`.* TO 'r1' @@ -123,16 +126,13 @@ GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' GRANT USAGE ON *.* TO 'r4' -GRANT r2 TO 'r1' -GRANT r3 TO 'r2' -GRANT r4 TO 'r1' show grants for r2; Grants for r2 +GRANT 'r3' TO 'r2' GRANT DELETE ON `mysql`.`roles_mapping` TO 'r2' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'r2' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r3' -GRANT r3 TO 'r2' show grants for r3; Grants for r3 GRANT USAGE ON *.* TO 'r3' @@ -142,12 +142,12 @@ GRANT USAGE ON *.* TO 'r4' revoke all privileges, grant option from r2; show grants for r1; Grants for r1 +GRANT 'r2' TO 'r1' +GRANT 'r4' TO 'r1' GRANT INSERT ON `mysql`.* TO 'r1' GRANT USAGE ON *.* TO 'r1' GRANT USAGE ON *.* TO 'r2' GRANT USAGE ON *.* TO 'r4' -GRANT r2 TO 'r1' -GRANT r4 TO 'r1' show grants for r2; Grants for r2 GRANT USAGE ON *.* TO 'r2' diff --git a/mysql-test/suite/roles/role_case_sensitive-10744.result b/mysql-test/suite/roles/role_case_sensitive-10744.result index b898310e83c..4870300eefc 100644 --- a/mysql-test/suite/roles/role_case_sensitive-10744.result +++ b/mysql-test/suite/roles/role_case_sensitive-10744.result @@ -21,7 +21,7 @@ grant select on secret_db.* to test_role; grant test_role to test_user; show grants for test_user; Grants for test_user@% -GRANT test_role TO 'test_user'@'%' +GRANT 'test_role' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' # # Now test the UPPER case role. @@ -30,8 +30,8 @@ grant test_ROLE to test_user; grant insert on secret_db.t1 to test_ROLE; show grants for test_user; Grants for test_user@% -GRANT test_role TO 'test_user'@'%' -GRANT test_ROLE TO 'test_user'@'%' +GRANT 'test_role' TO 'test_user'@'%' +GRANT 'test_ROLE' TO 'test_user'@'%' GRANT USAGE ON *.* TO 'test_user'@'%' connect test_user,localhost,test_user; # diff --git a/mysql-test/suite/roles/rpl_definer.result b/mysql-test/suite/roles/rpl_definer.result index 2d10dc6cd7a..44f0d883ba3 100644 --- a/mysql-test/suite/roles/rpl_definer.result +++ b/mysql-test/suite/roles/rpl_definer.result @@ -7,14 +7,14 @@ grant role2 to role1; set role role1; show grants; Grants for root@localhost +GRANT 'role1' TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'role2' TO 'role1' +GRANT 'role2' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT EXECUTE ON `test`.* TO 'role2' GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' -GRANT role1 TO 'root'@'localhost' WITH ADMIN OPTION -GRANT role2 TO 'role1' -GRANT role2 TO 'root'@'localhost' WITH ADMIN OPTION create definer=current_user procedure pcu() select current_user; create definer=root@localhost procedure pu() select "root@localhost"; create definer=current_role procedure pcr() select current_role; @@ -39,14 +39,14 @@ connection slave; set role role1; show grants; Grants for root@localhost +GRANT 'role1' TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'role2' TO 'role1' +GRANT 'role2' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT EXECUTE ON `test`.* TO 'role2' GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'role1' GRANT USAGE ON *.* TO 'role2' -GRANT role1 TO 'root'@'localhost' WITH ADMIN OPTION -GRANT role2 TO 'role1' -GRANT role2 TO 'root'@'localhost' WITH ADMIN OPTION show create procedure pcu; Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation pcu STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `pcu`() diff --git a/mysql-test/suite/roles/set_and_drop.result b/mysql-test/suite/roles/set_and_drop.result index 2d3e675ebd0..69e2128c170 100644 --- a/mysql-test/suite/roles/set_and_drop.result +++ b/mysql-test/suite/roles/set_and_drop.result @@ -56,7 +56,7 @@ drop role role2; connection foo; show grants; Grants for foo@localhost -GRANT role1 TO 'foo'@'localhost' +GRANT 'role1' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'role1' select * from information_schema.enabled_roles; diff --git a/mysql-test/suite/roles/set_default_role_clear.result b/mysql-test/suite/roles/set_default_role_clear.result index 3cb13f55b4b..3e322a2df9f 100644 --- a/mysql-test/suite/roles/set_default_role_clear.result +++ b/mysql-test/suite/roles/set_default_role_clear.result @@ -4,7 +4,7 @@ grant select on *.* to test_role; grant test_role to test_user@localhost; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' set default role test_role; select user, host, default_role from mysql.user; @@ -14,10 +14,10 @@ user host default_role test_user localhost test_role show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'test_role' -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE 'test_role' FOR 'test_user'@'localhost' select user, host, default_role from mysql.user where user='test_user'; user host default_role test_user localhost test_role diff --git a/mysql-test/suite/roles/set_default_role_for.result b/mysql-test/suite/roles/set_default_role_for.result index 2f6ad0a9f7f..1f0812caeb9 100644 --- a/mysql-test/suite/roles/set_default_role_for.result +++ b/mysql-test/suite/roles/set_default_role_for.result @@ -18,10 +18,10 @@ ERROR OP000: User `root`@`localhost` has not been granted role `role_b` set default role role_b for user_b@localhost; show grants; Grants for user_a@localhost -GRANT role_a TO 'user_a'@'localhost' +GRANT 'role_a' TO 'user_a'@'localhost' GRANT USAGE ON *.* TO 'user_a'@'localhost' GRANT SELECT ON *.* TO 'role_a' -SET DEFAULT ROLE role_a FOR 'user_a'@'localhost' +SET DEFAULT ROLE 'role_a' FOR 'user_a'@'localhost' select user, host, default_role from mysql.user where user like 'user_%'; user host default_role user_a localhost role_a @@ -40,10 +40,10 @@ set default role role_b for current_user; ERROR OP000: User `user_a`@`localhost` has not been granted role `role_b` show grants; Grants for user_b@localhost -GRANT role_b TO 'user_b'@'localhost' +GRANT 'role_b' TO 'user_b'@'localhost' GRANT USAGE ON *.* TO 'user_b'@'localhost' GRANT INSERT, UPDATE ON *.* TO 'role_b' -SET DEFAULT ROLE role_b FOR 'user_b'@'localhost' +SET DEFAULT ROLE 'role_b' FOR 'user_b'@'localhost' select user, host, default_role from mysql.user where user like 'user_%'; ERROR 42000: SELECT command denied to user 'user_b'@'localhost' for table 'user' insert ignore into mysql.user (user, host) values ('someuser', 'somehost'); @@ -55,7 +55,7 @@ Warning 1364 Field 'authentication_string' doesn't have a default value set default role NONE for user_a@localhost; show grants; Grants for user_a@localhost -GRANT role_a TO 'user_a'@'localhost' +GRANT 'role_a' TO 'user_a'@'localhost' GRANT USAGE ON *.* TO 'user_a'@'localhost' GRANT INSERT, UPDATE ON *.* TO 'role_b' select user, host, default_role from mysql.user where user like 'user_%'; diff --git a/mysql-test/suite/roles/set_default_role_invalid.result b/mysql-test/suite/roles/set_default_role_invalid.result index c98e6e7d2a9..b18f0154c91 100644 --- a/mysql-test/suite/roles/set_default_role_invalid.result +++ b/mysql-test/suite/roles/set_default_role_invalid.result @@ -5,7 +5,7 @@ grant select on *.* to test_role; grant test_role to test_user@localhost; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' select user, host, default_role from mysql.user; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'user' @@ -21,10 +21,10 @@ user host default_role test_user localhost test_role show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'test_role' -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE 'test_role' FOR 'test_user'@'localhost' select user, host, default_role from mysql.user where user='test_user'; user host default_role test_user localhost test_role @@ -68,11 +68,11 @@ GRANT SELECT ON mysql.* TO b; # Change user b (session 1: select_priv) SHOW GRANTS FOR b; Grants for b@% -GRANT r1 TO 'b'@'%' -GRANT r2 TO 'b'@'%' +GRANT 'r1' TO 'b'@'%' +GRANT 'r2' TO 'b'@'%' GRANT USAGE ON *.* TO 'b'@'%' GRANT SELECT ON `mysql`.* TO 'b'@'%' -SET DEFAULT ROLE r2 FOR 'b'@'%' +SET DEFAULT ROLE 'r2' FOR 'b'@'%' SET DEFAULT ROLE r1 FOR a; ERROR 42000: Access denied for user 'b'@'%' to database 'mysql' SELECT CURRENT_ROLE; @@ -94,11 +94,11 @@ GRANT UPDATE ON mysql.* TO b; # Change user b SHOW GRANTS FOR b; Grants for b@% -GRANT r1 TO 'b'@'%' -GRANT r2 TO 'b'@'%' +GRANT 'r1' TO 'b'@'%' +GRANT 'r2' TO 'b'@'%' GRANT USAGE ON *.* TO 'b'@'%' GRANT SELECT, UPDATE ON `mysql`.* TO 'b'@'%' -SET DEFAULT ROLE r2 FOR 'b'@'%' +SET DEFAULT ROLE 'r2' FOR 'b'@'%' SET DEFAULT ROLE r1 FOR a; ERROR OP000: User `b`@`%` has not been granted role `r1` SET DEFAULT ROLE invalid_role; diff --git a/mysql-test/suite/roles/set_default_role_new_connection.result b/mysql-test/suite/roles/set_default_role_new_connection.result index 75e4075ff9e..79ce800ed43 100644 --- a/mysql-test/suite/roles/set_default_role_new_connection.result +++ b/mysql-test/suite/roles/set_default_role_new_connection.result @@ -5,7 +5,7 @@ grant test_role to test_user@localhost; connect c1, localhost, test_user,,; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' select user, host, default_role from mysql.user where user = 'test_user'; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'user' @@ -20,10 +20,10 @@ test_user localhost test_role connect c1, localhost, test_user,,; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'test_role' -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE 'test_role' FOR 'test_user'@'localhost' select user, host, default_role from mysql.user where user = 'test_user'; user host default_role test_user localhost test_role @@ -36,7 +36,7 @@ test_user localhost connect c1, localhost, test_user,,; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' select user, host, default_role from mysql.user where user = 'test_user'; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'user' @@ -49,10 +49,10 @@ set default role test_role for test_user@localhost; connect c1, localhost, test_user,,; show grants; Grants for test_user@localhost -GRANT test_role TO 'test_user'@'localhost' +GRANT 'test_role' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'test_role' -SET DEFAULT ROLE test_role FOR 'test_user'@'localhost' +SET DEFAULT ROLE 'test_role' FOR 'test_user'@'localhost' select user, host, default_role from mysql.user where user = 'test_user'; user host default_role test_user localhost test_role diff --git a/mysql-test/suite/roles/set_role-13655.result b/mysql-test/suite/roles/set_role-13655.result index c30e4115953..9d7008ad921 100644 --- a/mysql-test/suite/roles/set_role-13655.result +++ b/mysql-test/suite/roles/set_role-13655.result @@ -18,7 +18,7 @@ create role admin; grant simple to admin; show grants for admin; Grants for admin -GRANT simple TO 'admin' +GRANT 'simple' TO 'admin' GRANT USAGE ON *.* TO 'admin' GRANT USAGE ON *.* TO 'simple' GRANT SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, EXECUTE ON `t`.* TO 'simple' @@ -37,9 +37,9 @@ ERROR 42000: Access denied for user 'foo'@'%' to database 't' set role admin; show grants; Grants for foo@% -GRANT admin TO 'foo'@'%' +GRANT 'admin' TO 'foo'@'%' GRANT USAGE ON *.* TO 'foo'@'%' -GRANT simple TO 'admin' +GRANT 'simple' TO 'admin' GRANT USAGE ON *.* TO 'admin' GRANT ALL PRIVILEGES ON `t`.* TO 'admin' GRANT USAGE ON *.* TO 'simple' diff --git a/mysql-test/suite/roles/set_role-9614.result b/mysql-test/suite/roles/set_role-9614.result index 37f6db070c0..60986c2c133 100644 --- a/mysql-test/suite/roles/set_role-9614.result +++ b/mysql-test/suite/roles/set_role-9614.result @@ -35,11 +35,11 @@ GRANT `client` TO `usertestjohn`@`%`; # SHOW GRANTS FOR `john`@`%`; Grants for john@% -GRANT client TO 'john'@'%' +GRANT 'client' TO 'john'@'%' GRANT USAGE ON *.* TO 'john'@'%' SHOW GRANTS FOR `usertestjohn`@`%`; Grants for usertestjohn@% -GRANT client TO 'usertestjohn'@'%' +GRANT 'client' TO 'usertestjohn'@'%' GRANT USAGE ON *.* TO 'usertestjohn'@'%' SHOW GRANTS FOR `client`; Grants for client @@ -84,7 +84,7 @@ information_schema test show grants; Grants for usertestjohn@% -GRANT client TO 'usertestjohn'@'%' +GRANT 'client' TO 'usertestjohn'@'%' GRANT USAGE ON *.* TO 'usertestjohn'@'%' GRANT USAGE ON *.* TO 'client' GRANT SELECT ON `bug_db`.`t0` TO 'client' diff --git a/mysql-test/suite/roles/set_role-database-recursive.result b/mysql-test/suite/roles/set_role-database-recursive.result index 479e553c3d1..64cf2a2f9af 100644 --- a/mysql-test/suite/roles/set_role-database-recursive.result +++ b/mysql-test/suite/roles/set_role-database-recursive.result @@ -67,6 +67,11 @@ set role test_role1; delete from mysql.user where user='no such user'; show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' +GRANT 'test_role2' TO 'test_user'@'localhost' +GRANT 'test_role3' TO 'test_role2' +GRANT 'test_role4' TO 'test_role3' GRANT DELETE ON `mysql`.* TO 'test_role4' GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' @@ -74,10 +79,5 @@ GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role3' GRANT USAGE ON *.* TO 'test_role4' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' -GRANT test_role2 TO 'test_user'@'localhost' -GRANT test_role3 TO 'test_role2' -GRANT test_role4 TO 'test_role3' drop user test_user@localhost; drop role test_role1, test_role2, test_role3, test_role4; diff --git a/mysql-test/suite/roles/set_role-multiple-role.result b/mysql-test/suite/roles/set_role-multiple-role.result index fca53b4d645..eb359e85f52 100644 --- a/mysql-test/suite/roles/set_role-multiple-role.result +++ b/mysql-test/suite/roles/set_role-multiple-role.result @@ -25,14 +25,14 @@ select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'r_crt' TO 'test_user'@'localhost' +GRANT 'r_del' TO 'test_user'@'localhost' +GRANT 'r_drp' TO 'test_user'@'localhost' +GRANT 'r_ins' TO 'test_user'@'localhost' +GRANT 'r_rld' TO 'test_user'@'localhost' +GRANT 'r_sel' TO 'test_user'@'localhost' +GRANT 'r_upd' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT r_crt TO 'test_user'@'localhost' -GRANT r_del TO 'test_user'@'localhost' -GRANT r_drp TO 'test_user'@'localhost' -GRANT r_ins TO 'test_user'@'localhost' -GRANT r_rld TO 'test_user'@'localhost' -GRANT r_sel TO 'test_user'@'localhost' -GRANT r_upd TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -42,15 +42,15 @@ current_user() current_role() test_user@localhost r_sel show grants; Grants for test_user@localhost +GRANT 'r_crt' TO 'test_user'@'localhost' +GRANT 'r_del' TO 'test_user'@'localhost' +GRANT 'r_drp' TO 'test_user'@'localhost' +GRANT 'r_ins' TO 'test_user'@'localhost' +GRANT 'r_rld' TO 'test_user'@'localhost' +GRANT 'r_sel' TO 'test_user'@'localhost' +GRANT 'r_upd' TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'r_sel' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT r_crt TO 'test_user'@'localhost' -GRANT r_del TO 'test_user'@'localhost' -GRANT r_drp TO 'test_user'@'localhost' -GRANT r_ins TO 'test_user'@'localhost' -GRANT r_rld TO 'test_user'@'localhost' -GRANT r_sel TO 'test_user'@'localhost' -GRANT r_upd TO 'test_user'@'localhost' select * from mysql.roles_mapping; Host User Role Admin_option localhost root r_crt Y @@ -73,15 +73,15 @@ current_user() current_role() test_user@localhost r_ins show grants; Grants for test_user@localhost +GRANT 'r_crt' TO 'test_user'@'localhost' +GRANT 'r_del' TO 'test_user'@'localhost' +GRANT 'r_drp' TO 'test_user'@'localhost' +GRANT 'r_ins' TO 'test_user'@'localhost' +GRANT 'r_rld' TO 'test_user'@'localhost' +GRANT 'r_sel' TO 'test_user'@'localhost' +GRANT 'r_upd' TO 'test_user'@'localhost' GRANT INSERT ON *.* TO 'r_ins' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT r_crt TO 'test_user'@'localhost' -GRANT r_del TO 'test_user'@'localhost' -GRANT r_drp TO 'test_user'@'localhost' -GRANT r_ins TO 'test_user'@'localhost' -GRANT r_rld TO 'test_user'@'localhost' -GRANT r_sel TO 'test_user'@'localhost' -GRANT r_upd TO 'test_user'@'localhost' select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' insert into mysql.roles_mapping values ('', 'r_sel', 'r_rld', 'N'); diff --git a/mysql-test/suite/roles/set_role-recursive.result b/mysql-test/suite/roles/set_role-recursive.result index fc5322a692e..fb62019c2e4 100644 --- a/mysql-test/suite/roles/set_role-recursive.result +++ b/mysql-test/suite/roles/set_role-recursive.result @@ -25,8 +25,8 @@ select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -36,35 +36,35 @@ current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' select * from mysql.roles_mapping where Host=''; Host User Role Admin_option test_role1 test_role2 N show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' set role none; select current_user(), current_role(); current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' set role test_role2; ERROR OP000: User `test_user`@`localhost` has not been granted role `test_role2` select current_user(), current_role(); @@ -72,43 +72,43 @@ current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' set role test_role1; select current_user(), current_role(); current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' select * from mysql.roles_mapping where Host=''; Host User Role Admin_option test_role1 test_role2 N show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' set role none; select current_user(), current_role(); current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' delete from mysql.user where user='test_role1'; diff --git a/mysql-test/suite/roles/set_role-routine-simple.result b/mysql-test/suite/roles/set_role-routine-simple.result index 3e17a78ad77..b25926af209 100644 --- a/mysql-test/suite/roles/set_role-routine-simple.result +++ b/mysql-test/suite/roles/set_role-routine-simple.result @@ -31,9 +31,9 @@ grant execute on procedure mysql.test_proc to test_role2; grant execute on mysql.* to test_role3; show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role3' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role3 TO 'test_user'@'localhost' use mysql; ERROR 42000: Access denied for user 'test_user'@'localhost' to database 'mysql' select current_user(), current_role(); @@ -53,23 +53,23 @@ test_func('AABBCCDD') Test string: AABBCCDD show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' +GRANT 'test_role3' TO 'test_user'@'localhost' GRANT EXECUTE ON FUNCTION `mysql`.`test_func` TO 'test_role2' GRANT EXECUTE ON PROCEDURE `mysql`.`test_proc` TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' -GRANT test_role3 TO 'test_user'@'localhost' set role none; select current_user(), current_role(); current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role3' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role3 TO 'test_user'@'localhost' call test_proc(@a); ERROR 42000: execute command denied to user 'test_user'@'localhost' for routine 'mysql.test_proc' SELECT test_func('AABBCCDD'); @@ -80,11 +80,11 @@ current_user() current_role() test_user@localhost test_role3 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role3' TO 'test_user'@'localhost' GRANT EXECUTE ON `mysql`.* TO 'test_role3' GRANT USAGE ON *.* TO 'test_role3' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role3 TO 'test_user'@'localhost' call test_proc(@a); SELECT @a; @a diff --git a/mysql-test/suite/roles/set_role-simple.result b/mysql-test/suite/roles/set_role-simple.result index 29b176776e7..0eeba8f6c64 100644 --- a/mysql-test/suite/roles/set_role-simple.result +++ b/mysql-test/suite/roles/set_role-simple.result @@ -17,8 +17,8 @@ select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -28,9 +28,9 @@ current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT SELECT ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select * from mysql.roles_mapping; Host User Role Admin_option localhost root test_role1 Y diff --git a/mysql-test/suite/roles/set_role-table-column-priv.result b/mysql-test/suite/roles/set_role-table-column-priv.result index 721bd3039a3..ca1cbd8004f 100644 --- a/mysql-test/suite/roles/set_role-table-column-priv.result +++ b/mysql-test/suite/roles/set_role-table-column-priv.result @@ -19,8 +19,8 @@ select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -30,12 +30,12 @@ current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT (Role) ON `mysql`.`roles_mapping` TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for column 'Host' in table 'roles_mapping' select Role from mysql.roles_mapping; @@ -46,12 +46,12 @@ test_role2 test_role2 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT (Role) ON `mysql`.`roles_mapping` TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' use mysql; set role none; select current_user(), current_role(); diff --git a/mysql-test/suite/roles/set_role-table-simple.result b/mysql-test/suite/roles/set_role-table-simple.result index f5688dbe62e..57fcb78ea09 100644 --- a/mysql-test/suite/roles/set_role-table-simple.result +++ b/mysql-test/suite/roles/set_role-table-simple.result @@ -19,8 +19,8 @@ select * from mysql.roles_mapping; ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'roles_mapping' show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -30,12 +30,12 @@ current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON `mysql`.`roles_mapping` TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' select * from mysql.roles_mapping; Host User Role Admin_option test_role1 test_role2 N @@ -44,12 +44,12 @@ localhost root test_role2 Y localhost test_user test_role1 N show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON `mysql`.`roles_mapping` TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' use mysql; set role none; select current_user(), current_role(); diff --git a/mysql-test/suite/roles/show_grants.result b/mysql-test/suite/roles/show_grants.result index b523211420b..7732daa6d93 100644 --- a/mysql-test/suite/roles/show_grants.result +++ b/mysql-test/suite/roles/show_grants.result @@ -34,9 +34,9 @@ test_user@localhost test_role1 NO NO test_user@localhost test_role2 NO NO show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' select current_user(), current_role(); current_user() current_role() test_user@localhost NULL @@ -50,13 +50,13 @@ current_user() current_role() test_user@localhost test_role1 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_role1' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_role1' -GRANT test_role2 TO 'test_user'@'localhost' set role none; select * from information_schema.enabled_roles; ROLE_NAME @@ -66,28 +66,28 @@ current_user() current_role() test_user@localhost NULL show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for test_user@localhost; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for test_role1; ERROR 42000: Access denied for user 'test_user'@'localhost' to database 'mysql' show grants for test_role2; ERROR 42000: Access denied for user 'test_user'@'localhost' to database 'mysql' show grants for CURRENT_USER; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_USER(); Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_ROLE; ERROR 42000: There is no such grant defined for user 'test_user' on host 'localhost' show grants for CURRENT_ROLE(); @@ -101,36 +101,36 @@ current_user() current_role() test_user@localhost test_role2 show grants; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for test_user@localhost; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for test_role1; Grants for test_role1 +GRANT 'test_role2' TO 'test_role1' GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role1' GRANT USAGE ON *.* TO 'test_role2' -GRANT test_role2 TO 'test_role1' show grants for test_role2; Grants for test_role2 GRANT SELECT ON `mysql`.* TO 'test_role2' GRANT USAGE ON *.* TO 'test_role2' show grants for CURRENT_USER; Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_USER(); Grants for test_user@localhost +GRANT 'test_role1' TO 'test_user'@'localhost' +GRANT 'test_role2' TO 'test_user'@'localhost' GRANT USAGE ON *.* TO 'test_user'@'localhost' -GRANT test_role1 TO 'test_user'@'localhost' -GRANT test_role2 TO 'test_user'@'localhost' show grants for CURRENT_ROLE; Grants for test_role2 GRANT SELECT ON `mysql`.* TO 'test_role2' diff --git a/mysql-test/suite/roles/show_grants_replicated.result b/mysql-test/suite/roles/show_grants_replicated.result index cb9df65dbbd..f26a22c8ee6 100644 --- a/mysql-test/suite/roles/show_grants_replicated.result +++ b/mysql-test/suite/roles/show_grants_replicated.result @@ -44,7 +44,7 @@ GRANT USAGE ON *.* TO 'r1' set role r1; show grants; Grants for root@localhost -GRANT r1 TO 'root'@'localhost' WITH ADMIN OPTION +GRANT 'r1' TO 'root'@'localhost' WITH ADMIN OPTION GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION GRANT USAGE ON *.* TO 'r1' diff --git a/mysql-test/t/grant5.test b/mysql-test/t/grant5.test index 944918e63ec..d8c62691a84 100644 --- a/mysql-test/t/grant5.test +++ b/mysql-test/t/grant5.test @@ -70,6 +70,29 @@ SHOW GRANTS; DROP USER test_user; DROP ROLE test_role; +# +# MDEV-26080 SHOW GRANTS does not quote role names properly for DEFAULT ROLE +# + +CREATE ROLE 'test-role'; +CREATE USER 'test-user'; +GRANT 'test-role' TO 'test-user'; +SET DEFAULT ROLE 'test-role' FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +DROP ROLE 'test-role'; +SHOW GRANTS FOR 'test-user'; +SET DEFAULT ROLE NONE FOR 'test-user'; +SHOW GRANTS FOR 'test-user'; +CREATE ROLE `r``o'l"e`; +select user from mysql.user where is_role='Y'; +GRANT `r``o'l"e` TO 'test-user'; +SET DEFAULT ROLE `r``o'l"e` FOR 'test-user'; +# it is expected that quotes won't be shown correctly +SHOW GRANTS FOR 'test-user'; +DROP ROLE `r``o'l"e`; +DROP USER 'test-user'; + + # # End of 10.1 tests # diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 2d91254435a..89fecc92e9b 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -8847,9 +8847,9 @@ static bool show_default_role(THD *thd, ACL_USER *acl_entry, { String def_str(buff, buffsize, system_charset_info); def_str.length(0); - def_str.append(STRING_WITH_LEN("SET DEFAULT ROLE ")); + def_str.append(STRING_WITH_LEN("SET DEFAULT ROLE '")); def_str.append(&def_rolename); - def_str.append(" FOR '"); + def_str.append("' FOR '"); def_str.append(&acl_entry->user); DBUG_ASSERT(!(acl_entry->flags & IS_ROLE)); def_str.append(STRING_WITH_LEN("'@'")); @@ -8878,12 +8878,12 @@ static bool show_role_grants(THD *thd, const char *hostname, for (counter= 0; counter < acl_entry->role_grants.elements; counter++) { grant.length(0); - grant.append(STRING_WITH_LEN("GRANT ")); + grant.append(STRING_WITH_LEN("GRANT '")); ACL_ROLE *acl_role= *(dynamic_element(&acl_entry->role_grants, counter, ACL_ROLE**)); grant.append(acl_role->user.str, acl_role->user.length, system_charset_info); - grant.append(STRING_WITH_LEN(" TO '")); + grant.append(STRING_WITH_LEN("' TO '")); grant.append(acl_entry->user.str, acl_entry->user.length, system_charset_info); if (!(acl_entry->flags & IS_ROLE)) From 85063aebda7e4b691c04a90b0c38a6df3873a84e Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Wed, 28 Oct 2020 19:45:54 +0100 Subject: [PATCH 29/98] Update description of mariadb-common package - Commit https://github.com/mariadb/server/commit/438ed0408c69 introduced `mariadb-common` package and added description. Example in description is confusing since files referred to are not installed and not related/owned by the `mariadb-common` package. - Patch is updating real file/directory description section pointing to the real examples owned by the package. - Example: ``` mariadb-client-10.3 install mariadb-client-core-10.3 install mariadb-common install mariadb-server install mariadb-server-10.3 install mariadb-server-core-10.3 install /. /etc /etc/mysql /etc/mysql/mariadb.cnf /etc/mysql/mariadb.conf.d /usr /usr/share /usr/share/doc /usr/share/doc/mariadb-common /usr/share/doc/mariadb-common/changelog.Debian.gz /usr/share/doc/mariadb-common/copyright ``` Closes PR #1690 Reviewed by: otto@kekalainen.net --- debian/control | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index c906c1bd505..372abafe205 100644 --- a/debian/control +++ b/debian/control @@ -164,14 +164,14 @@ Description: MariaDB database common files (e.g. /etc/mysql/my.cnf) Package: mariadb-common Architecture: all Depends: mysql-common, ${misc:Depends}, ${shlibs:Depends} -Description: MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf) +Description: MariaDB database common files (e.g. /etc/mysql/mariadb.conf.d/) MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and ease of use. . This package includes files needed by all versions of the client library - (e.g. /etc/mysql/conf.d/mariadb.cnf). + (e.g. /etc/mysql/mariadb.conf.d/ or /etc/mysql/mariadb.cnf). Package: mariadb-client-core-10.2 Architecture: any From fb0b28932ce82903f2fcfb690a71bff52355507f Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 8 Jul 2021 17:47:24 +0530 Subject: [PATCH 30/98] MDEV-25998 encryption.innodb_encryption_filekeys failure in buildbot - Set the innodb_encrypt_tables variable before timeout happens. It will add the pending tablespace to default encrypt list and does the encryption/decryption based on innodb_encrypt_tables. --- .../t/innodb_encryption_filekeys.test | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test index 03447bbcfa6..cd5724638b1 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test +++ b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test @@ -48,6 +48,12 @@ while ($cnt) { real_sleep 1; dec $cnt; + if ($cnt == 200) + { + --disable_query_log + set global innodb_encrypt_tables = on; + --enable_query_log + } } } if (!$success) @@ -78,6 +84,12 @@ while ($cnt) { real_sleep 1; dec $cnt; + if ($cnt == 200) + { + --disable_query_log + set global innodb_encrypt_tables = off; + --enable_query_log + } } } if (!$success) @@ -107,6 +119,12 @@ while ($cnt) { real_sleep 1; dec $cnt; + if ($cnt == 200) + { + --disable_query_log + set global innodb_encrypt_tables=on; + --enable_query_log + } } } if (!$success) From b082716892071fdc3c961e9afaa011e0f6beb102 Mon Sep 17 00:00:00 2001 From: Robert Bindar Date: Fri, 2 Jul 2021 09:34:25 +0300 Subject: [PATCH 31/98] MDEV-21206 Can't link zlib library during DBD::mysql installation mysql_config should never return -lzlib as linking flag. Clients trying to link against mariadb that use the output of mysql_config experience linking error because we return -lzlib when we don't ship any libzlib.a in our binary tarballs, bundled zlib static library is already linked. --- cmake/for_clients.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/for_clients.cmake b/cmake/for_clients.cmake index e5916c56ddc..e52e3b34f21 100644 --- a/cmake/for_clients.cmake +++ b/cmake/for_clients.cmake @@ -24,7 +24,7 @@ MACRO(EXTRACT_LINK_LIBRARIES target var) FOREACH(lib ${${target}_LIB_DEPENDS}) # Filter out "general", it is not a library, just CMake hint # Also, remove duplicates - IF(NOT lib STREQUAL "general" AND NOT ${var} MATCHES "-l${lib} ") + IF(NOT lib STREQUAL "general" AND NOT ${var} MATCHES "-l${lib} " AND NOT lib STREQUAL "zlib") IF (lib MATCHES "^\\-") SET(${var} "${${var}} ${lib} ") ELSEIF(lib MATCHES "^/") From 0e9ba176bf2ad4d44e62b8f6e4e1916b39c5bf33 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Mon, 21 Jun 2021 04:00:16 +0300 Subject: [PATCH 32/98] MDEV-17890 Server crash on DELETE with YEAR field with truncated expr The failing reason was inconsistent truncation rules: the value of virtual column could have been evaluated to '2000' sometimes instead of '0000' for value 'a'. The reason why `c YEAR AS ('aaaa')` was not evaluated same is that len=4 is a special case insidew Field_year::store. The correct fix is: always evaluate a bad value to 0000 instead 2000. The truncated values should be evaluated as usual. $support_virtual_index is finally changed to 1 in gcol.gcol_ins_upd_innodb, which is also enough for testing. The test from original bug report is also added. --- mysql-test/suite/gcol/inc/gcol_ins_upd.inc | 22 +++ mysql-test/suite/gcol/inc/gcol_keys.inc | 2 +- .../suite/gcol/r/gcol_ins_upd_innodb.result | 171 ++++++++++++++++++ .../suite/gcol/r/gcol_ins_upd_myisam.result | 21 ++- .../suite/gcol/r/gcol_keys_innodb.result | 2 +- .../suite/gcol/r/gcol_keys_myisam.result | 2 +- .../suite/gcol/t/gcol_ins_upd_innodb.test | 2 +- sql/field.cc | 10 +- 8 files changed, 225 insertions(+), 7 deletions(-) diff --git a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc index 7fde9c2e852..6bd7974f2af 100644 --- a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc +++ b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc @@ -607,4 +607,26 @@ DELETE FROM t1; DROP TEMPORARY TABLE t1; +--echo # +--echo # Original test case from MDEV-17890 +--echo # + +CREATE TABLE t1 ( + pk BIGINT AUTO_INCREMENT, + b BIT(15), + v BIT(10) AS (b) VIRTUAL, + PRIMARY KEY(pk), + UNIQUE(v) +); + +INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +SELECT pk, b FROM t1 INTO OUTFILE 'load.data'; +--error ER_DATA_TOO_LONG +LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); + +# Cleanup +DROP TABLE t1; +--let $datadir= `SELECT @@datadir` +--remove_file $datadir/test/load.data + } diff --git a/mysql-test/suite/gcol/inc/gcol_keys.inc b/mysql-test/suite/gcol/inc/gcol_keys.inc index e5f7f976120..cf0612b0d0c 100644 --- a/mysql-test/suite/gcol/inc/gcol_keys.inc +++ b/mysql-test/suite/gcol/inc/gcol_keys.inc @@ -812,7 +812,7 @@ DROP TABLE t1; --echo # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' --echo # failed in ha_myisam::setup_vcols_for_repair -CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; +CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL); ALTER TABLE t1 ADD KEY (a); DROP TABLE t1; diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result index 3024b58da54..99e47c2d168 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result @@ -435,6 +435,26 @@ UPDATE t1 SET col1 = 2; UPDATE t1 SET col7 = DEFAULT; UPDATE t1 SET col8 = DEFAULT; DROP TABLE t1; +Bug#20797344: WL#8149: ALLOCATED SPACE FOR INDEXED BLOB VGC CAN BE +OVERWRITTEN FOR UPDATE +# +CREATE TABLE t (a varchar(100), b blob, +c blob GENERATED ALWAYS AS (concat(a,b)) VIRTUAL, +d blob GENERATED ALWAYS AS (b) VIRTUAL, +e int(11) GENERATED ALWAYS AS (10) VIRTUAL, +h int(11) NOT NULL, PRIMARY KEY (h), key(c(20))); +INSERT INTO t(a,b,h) VALUES('aaaaaaa','1111111', 11); +INSERT INTO t(a,b,h) VALUES('bbbbbbb','2222222', 22); +SELECT c FROM t; +c +aaaaaaa1111111 +bbbbbbb2222222 +UPDATE t SET a='ccccccc'; +SELECT c FROM t; +c +ccccccc1111111 +ccccccc2222222 +DROP TABLE t; # Bug#21081742: ASSERTION !TABLE || (!TABLE->WRITE_SET || # BITMAP_IS_SET(TABLE->WRITE_SET # @@ -491,6 +511,21 @@ SELECT * FROM t; x y gc 2 1 3 DROP TABLE t; +CREATE TABLE t ( +x INT, y INT, gc INT GENERATED ALWAYS AS (x+1), KEY (x,gc) +); +INSERT INTO t VALUES (); +UPDATE t t1, t t2 SET t1.x = 1, t2.y = 2; +SELECT * FROM t; +x y gc +1 2 2 +SELECT gc FROM t; +gc +2 +CHECK TABLE t; +Table Op Msg_type Msg_text +test.t check status OK +DROP TABLE t; # stored CREATE TABLE C ( col_varchar_nokey VARCHAR(1), @@ -552,6 +587,99 @@ SELECT * from C; col_varchar_nokey col_varchar_key a aa DROP TABLE C; +# virtual, indexed +CREATE TABLE C ( +col_varchar_nokey VARCHAR(1), +col_varchar_key VARCHAR(2) GENERATED ALWAYS AS +(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL, +KEY (col_varchar_key, col_varchar_nokey) +); +INSERT INTO C (col_varchar_nokey) VALUES ('c'); +EXPLAIN UPDATE C AS OUTR1, C AS OUTR2 +SET OUTR1.`col_varchar_nokey` = 'f', +OUTR2.`col_varchar_nokey` = "a"; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE OUTR1 ALL NULL NULL NULL NULL 1 +1 SIMPLE OUTR2 ALL NULL NULL NULL NULL 1 +UPDATE C AS OUTR1, C AS OUTR2 +SET OUTR1.`col_varchar_nokey` = 'f', +OUTR2.`col_varchar_nokey` = "a"; +SELECT * from C; +col_varchar_nokey col_varchar_key +a aa +DROP TABLE C; +# +# Bug #21530366 CRASH/ASSERTION, CORRUPTION WITH INDEXES + +# VIRTUAL COLUMNS, BLOB +# +CREATE TABLE t ( +a INTEGER, +b BLOB GENERATED ALWAYS AS (a) VIRTUAL, +INDEX (b(57)) +); +INSERT INTO t (a) VALUES (9); +UPDATE t SET a = 10; +DELETE FROM t WHERE a = 10; +DROP TABLE t; +# Bug#21807818: Generated columns not updated with empty insert list +CREATE TABLE t ( +a BLOB GENERATED ALWAYS AS ('') VIRTUAL, +b TIMESTAMP(4) GENERATED ALWAYS AS ('') VIRTUAL, +KEY (a(183),b) +); +INSERT IGNORE INTO t VALUES(), (), (); +Warnings: +Warning 1265 Data truncated for column 'b' at row 1 +Warning 1265 Data truncated for column 'b' at row 2 +Warning 1265 Data truncated for column 'b' at row 3 +DELETE IGNORE FROM t; +DROP TABLE t; +# +# Bug#22195458:GCOLS: ASSERTION 0 AND CORRUPTION... +# +CREATE TABLE t ( +a INT, +b YEAR GENERATED ALWAYS AS ('a') VIRTUAL, +c YEAR GENERATED ALWAYS AS ('aaaa') VIRTUAL, +b1 YEAR GENERATED ALWAYS AS ('a') STORED, +c1 YEAR GENERATED ALWAYS AS ('aaaa') STORED, +UNIQUE(b), +UNIQUE(b1) +); +INSERT IGNORE INTO t VALUES(); +SELECT b from t; +b +0000 +SELECT b1 from t; +b1 +0000 +SELECT * from t; +a b c b1 c1 +NULL 0000 0000 0000 0000 +DELETE FROM t; +CHECK TABLE t EXTENDED; +Table Op Msg_type Msg_text +test.t check status OK +DROP TABLE t; +# Bug#22195364:GCOLS: FAILING ASSERTION: +# DFIELD_IS_NULL(DFIELD2) || DFIELD2->DATA +CREATE TABLE t ( +a INT, +c BLOB GENERATED ALWAYS AS ('') VIRTUAL, +UNIQUE KEY(c(1),a) +); +INSERT INTO t(a) VALUES(1) ON DUPLICATE KEY UPDATE a=2; +SELECT * FROM t; +a c +1 +INSERT INTO t(a) VALUES(1) ON DUPLICATE KEY UPDATE a=2; +SELECT * FROM t; +a c +2 +SELECT GROUP_CONCAT(c ORDER BY c) FROM t; +GROUP_CONCAT(c ORDER BY c) + +DROP TABLE t; #Bug#21929967:GCOLS:GCOL VALUE CHANGES WHEN SESSION CHANGES SQL_MODE CREATE TABLE t(c1 INT GENERATED ALWAYS AS (1) VIRTUAL, c2 INT GENERATED ALWAYS AS(2) STORED); @@ -593,6 +721,49 @@ i1 i2 5 10 5 10 DROP TABLE t1,t2; +# +# Bug#22070021 GCOL:ASSERTION `!TABLE || (!TABLE->WRITE_SET || +# BITMAP_IS_SET(TABLE->WRITE_SET, +# +CREATE TABLE t1( +c1 INT, +c2 INT GENERATED ALWAYS AS (c1 + c1) VIRTUAL, +KEY(c2) +); +INSERT INTO t1(c1) VALUES(0); +DELETE O1.* FROM t1 AS O1, t1 AS O2; +SELECT * FROM t1; +c1 c2 +DROP TABLE t1; +# +# Bug#21944199 SIMPLE DELETE QUERY CAUSES INNODB: FAILING ASSERTION: 0 +# & DATA CORRUPTION +# +CREATE TEMPORARY TABLE t1 ( +a INTEGER NOT NULL, +b INTEGER GENERATED ALWAYS AS (a+1) VIRTUAL +); +INSERT INTO t1 (a) VALUES (0), (0), (0); +ALTER TABLE t1 ADD INDEX idx (b); +DELETE FROM t1; +DROP TEMPORARY TABLE t1; +# +# Original test case from MDEV-17890 +# +CREATE TABLE t1 ( +pk BIGINT AUTO_INCREMENT, +b BIT(15), +v BIT(10) AS (b) VIRTUAL, +PRIMARY KEY(pk), +UNIQUE(v) +); +INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +Warnings: +Warning 1264 Out of range value for column 'v' at row 1 +SELECT pk, b FROM t1 INTO OUTFILE 'load.data'; +LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); +ERROR 22001: Data too long for column 'v' at row 1 +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result index c7e5cab4f8c..ce57fc08ac2 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result @@ -571,13 +571,13 @@ UNIQUE(b1) INSERT IGNORE INTO t VALUES(); SELECT b from t; b -2000 +0000 SELECT b1 from t; b1 0000 SELECT * from t; a b c b1 c1 -NULL 2000 0000 0000 0000 +NULL 0000 0000 0000 0000 DELETE FROM t; CHECK TABLE t EXTENDED; Table Op Msg_type Msg_text @@ -669,6 +669,23 @@ INSERT INTO t1 (a) VALUES (0), (0), (0); ALTER TABLE t1 ADD INDEX idx (b); DELETE FROM t1; DROP TEMPORARY TABLE t1; +# +# Original test case from MDEV-17890 +# +CREATE TABLE t1 ( +pk BIGINT AUTO_INCREMENT, +b BIT(15), +v BIT(10) AS (b) VIRTUAL, +PRIMARY KEY(pk), +UNIQUE(v) +); +INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +Warnings: +Warning 1264 Out of range value for column 'v' at row 1 +SELECT pk, b FROM t1 INTO OUTFILE 'load.data'; +LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); +ERROR 22001: Data too long for column 'v' at row 1 +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_keys_innodb.result b/mysql-test/suite/gcol/r/gcol_keys_innodb.result index 37b350c0c32..2d8b81a0ea1 100644 --- a/mysql-test/suite/gcol/r/gcol_keys_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_keys_innodb.result @@ -879,7 +879,7 @@ ERROR 22003: Out of range value for column 'vi' at row 1 DROP TABLE t1; # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' # failed in ha_myisam::setup_vcols_for_repair -CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; +CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL); ALTER TABLE t1 ADD KEY (a); DROP TABLE t1; # diff --git a/mysql-test/suite/gcol/r/gcol_keys_myisam.result b/mysql-test/suite/gcol/r/gcol_keys_myisam.result index 643c4a304a3..17b15826813 100644 --- a/mysql-test/suite/gcol/r/gcol_keys_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_keys_myisam.result @@ -879,7 +879,7 @@ ERROR 22003: Out of range value for column 'vi' at row 1 DROP TABLE t1; # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' # failed in ha_myisam::setup_vcols_for_repair -CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; +CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL); ALTER TABLE t1 ADD KEY (a); DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; diff --git a/mysql-test/suite/gcol/t/gcol_ins_upd_innodb.test b/mysql-test/suite/gcol/t/gcol_ins_upd_innodb.test index 23d97a797e0..15a0db29615 100644 --- a/mysql-test/suite/gcol/t/gcol_ins_upd_innodb.test +++ b/mysql-test/suite/gcol/t/gcol_ins_upd_innodb.test @@ -36,7 +36,7 @@ eval SET @@session.default_storage_engine = 'InnoDB'; #------------------------------------------------------------------------------# # Execute the tests to be applied to all storage engines -let $support_virtual_index= 0; +let $support_virtual_index= 1; --source suite/gcol/inc/gcol_ins_upd.inc #------------------------------------------------------------------------------# diff --git a/sql/field.cc b/sql/field.cc index 652228beceb..074de35e0cf 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -6373,6 +6373,7 @@ bool Field_timef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) int Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; + THD *thd= get_thd(); char *end; int error; longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error); @@ -6384,7 +6385,14 @@ int Field_year::store(const char *from, uint len,CHARSET_INFO *cs) set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } - if (get_thd()->count_cuted_fields && + + if (!thd->count_cuted_fields && error == MY_ERRNO_EDOM) + { + *ptr= 0; + return 1; + } + + if (thd->count_cuted_fields && (error= check_int(cs, from, len, end, error))) { if (error == 1) /* empty or incorrect string */ From 7d9ba57da4843c05a4d11e63159a961c4eb79a04 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Mon, 21 Jun 2021 17:48:45 +0300 Subject: [PATCH 33/98] [1/2] MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols This is a 10.2+ part of a jira task The two bugs regarding virtual column marking have been fixed: 1. UPDATE of a partitioned table, where the optimizer has chosen a secondary index to make a filesort; 2. INSERT into a table with a nonblob field generated from a blob, with binlog enabled and binlog_row_image=noblob. 3. DELETE from a view on a table with virtual column. Generally the assertion happens from update_virtual_fields() call These bugs are root-caused by missing field marking for dependant fields of a virtual column. Therefore a fix is: mark all the fields involved in the vcol expression by calling field->register_field_in_read_map() instead just setting a single bit. 3 was reproducible only on 10.4+, however the problem might has just been invisible in the earlier versions. The fix is applicable to 10.2-10.3 as well. --- mysql-test/suite/gcol/inc/gcol_partition.inc | 16 ++++++++++ mysql-test/suite/gcol/inc/gcol_view.inc | 29 +++++++++++++++++++ .../suite/gcol/r/gcol_partition_innodb.result | 15 ++++++++++ .../suite/gcol/r/gcol_partition_myisam.result | 15 ++++++++++ .../suite/gcol/r/gcol_view_innodb.result | 20 +++++++++++++ .../suite/gcol/r/gcol_view_myisam.result | 20 +++++++++++++ mysql-test/suite/vcol/r/binlog.result | 14 +++++++++ mysql-test/suite/vcol/t/binlog.test | 14 +++++++++ sql/ha_partition.cc | 3 +- sql/sql_base.cc | 2 +- sql/table.cc | 2 +- 11 files changed, 146 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/gcol/inc/gcol_partition.inc b/mysql-test/suite/gcol/inc/gcol_partition.inc index df199e86c68..4e4af4f0023 100644 --- a/mysql-test/suite/gcol/inc/gcol_partition.inc +++ b/mysql-test/suite/gcol/inc/gcol_partition.inc @@ -153,3 +153,19 @@ CHECK TABLE t EXTENDED; FLUSH TABLES; CHECK TABLE t EXTENDED; DROP TABLE t; + +--echo # +--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +--echo # +CREATE TABLE t1 ( + a INT, + b INT, + c BIT(4) NOT NULL DEFAULT b'0', + pk INTEGER AUTO_INCREMENT, + d BIT(4) AS (c) VIRTUAL, + PRIMARY KEY(pk), + KEY (b,d) +) PARTITION BY HASH(pk); +INSERT INTO t1 () VALUES (),(); +UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk; +DROP TABLE t1; diff --git a/mysql-test/suite/gcol/inc/gcol_view.inc b/mysql-test/suite/gcol/inc/gcol_view.inc index 51cb9b5d725..5e5afcb5ab1 100644 --- a/mysql-test/suite/gcol/inc/gcol_view.inc +++ b/mysql-test/suite/gcol/inc/gcol_view.inc @@ -221,3 +221,32 @@ select * from t1; drop view v1; drop table t1; + +--echo # +--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +--echo # + +CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; + +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'), + ('1985-12-24 10:15:08.456'); +DELETE FROM v1 ORDER BY v LIMIT 4; + +# Cleanup +DROP VIEW v1; +DROP TABLE t1; + +--echo # +--echo # [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in +--echo # Field_blob::val_str with virtual columns and views +--echo # + +CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (a) VALUES ('foo'),('bar'); +DELETE FROM v1 ORDER BY b LIMIT 2; + +# Cleanup +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/suite/gcol/r/gcol_partition_innodb.result b/mysql-test/suite/gcol/r/gcol_partition_innodb.result index e5a68cdb177..d3f211c9b9a 100644 --- a/mysql-test/suite/gcol/r/gcol_partition_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_partition_innodb.result @@ -89,6 +89,21 @@ Table Op Msg_type Msg_text test.t check status OK DROP TABLE t; # +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 ( +a INT, +b INT, +c BIT(4) NOT NULL DEFAULT b'0', +pk INTEGER AUTO_INCREMENT, +d BIT(4) AS (c) VIRTUAL, +PRIMARY KEY(pk), +KEY (b,d) +) PARTITION BY HASH(pk); +INSERT INTO t1 () VALUES (),(); +UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk; +DROP TABLE t1; +# # MDEV-16980 Wrongly set tablename len while opening the # table for purge thread # diff --git a/mysql-test/suite/gcol/r/gcol_partition_myisam.result b/mysql-test/suite/gcol/r/gcol_partition_myisam.result index 81324da6fcd..75e216f903b 100644 --- a/mysql-test/suite/gcol/r/gcol_partition_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_partition_myisam.result @@ -86,6 +86,21 @@ CHECK TABLE t EXTENDED; Table Op Msg_type Msg_text test.t check status OK DROP TABLE t; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 ( +a INT, +b INT, +c BIT(4) NOT NULL DEFAULT b'0', +pk INTEGER AUTO_INCREMENT, +d BIT(4) AS (c) VIRTUAL, +PRIMARY KEY(pk), +KEY (b,d) +) PARTITION BY HASH(pk); +INSERT INTO t1 () VALUES (),(); +UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk; +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_view_innodb.result b/mysql-test/suite/gcol/r/gcol_view_innodb.result index ec82c792493..2690c60f634 100644 --- a/mysql-test/suite/gcol/r/gcol_view_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_view_innodb.result @@ -271,6 +271,26 @@ a b c 1 -1 -1 drop view v1; drop table t1; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'), +('1985-12-24 10:15:08.456'); +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP VIEW v1; +DROP TABLE t1; +# +# [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in +# Field_blob::val_str with virtual columns and views +# +CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (a) VALUES ('foo'),('bar'); +DELETE FROM v1 ORDER BY b LIMIT 2; +DROP VIEW v1; +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_view_myisam.result b/mysql-test/suite/gcol/r/gcol_view_myisam.result index 13cb74ebcb5..b2856e36d13 100644 --- a/mysql-test/suite/gcol/r/gcol_view_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_view_myisam.result @@ -271,6 +271,26 @@ a b c 1 -1 -1 drop view v1; drop table t1; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'), +('1985-12-24 10:15:08.456'); +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP VIEW v1; +DROP TABLE t1; +# +# [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in +# Field_blob::val_str with virtual columns and views +# +CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (a) VALUES ('foo'),('bar'); +DELETE FROM v1 ORDER BY b LIMIT 2; +DROP VIEW v1; +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/vcol/r/binlog.result b/mysql-test/suite/vcol/r/binlog.result index d4893b7ed3c..463928b97b8 100644 --- a/mysql-test/suite/vcol/r/binlog.result +++ b/mysql-test/suite/vcol/r/binlog.result @@ -80,4 +80,18 @@ Warnings: Warning 1265 Data truncated for column 'b' at row 1 Warning 1265 Data truncated for column 'b' at row 2 DROP TABLE t1; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +SET SESSION binlog_row_image= noblob; +CREATE TEMPORARY TABLE t1 SELECT UUID(); +show create table t1; +Table Create Table +t1 CREATE TEMPORARY TABLE `t1` ( + `UUID()` varchar(36) CHARACTER SET utf8 DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +CREATE TABLE t2 (a INT PRIMARY KEY, b TEXT, c INT GENERATED ALWAYS AS(b)); +INSERT INTO t2 (a,b) VALUES (1,1); +SET SESSION binlog_row_image= default; +DROP TABLE t2; include/rpl_end.inc diff --git a/mysql-test/suite/vcol/t/binlog.test b/mysql-test/suite/vcol/t/binlog.test index aa939086f12..edf0a8957b9 100644 --- a/mysql-test/suite/vcol/t/binlog.test +++ b/mysql-test/suite/vcol/t/binlog.test @@ -66,4 +66,18 @@ UPDATE IGNORE t1 SET a = NULL; DROP TABLE t1; +--echo # +--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +--echo # + +SET SESSION binlog_row_image= noblob; +CREATE TEMPORARY TABLE t1 SELECT UUID(); +show create table t1; +CREATE TABLE t2 (a INT PRIMARY KEY, b TEXT, c INT GENERATED ALWAYS AS(b)); +INSERT INTO t2 (a,b) VALUES (1,1); + +SET SESSION binlog_row_image= default; +DROP TABLE t2; + + --source include/rpl_end.inc diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index ad020acf5c4..6f50d078dff 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -5255,8 +5255,7 @@ int ha_partition::index_init(uint inx, bool sorted) do { for (i= 0; i < (*key_info)->user_defined_key_parts; i++) - bitmap_set_bit(table->read_set, - (*key_info)->key_part[i].field->field_index); + (*key_info)->key_part[i].field->register_field_in_read_map(); } while (*(++key_info)); } for (i= bitmap_get_first_set(&m_part_info->read_partitions); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 11f4cb9890b..3471297ac7d 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -5839,7 +5839,7 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list, { TABLE *table= field_to_set->table; if (thd->mark_used_columns == MARK_COLUMNS_READ) - bitmap_set_bit(table->read_set, field_to_set->field_index); + field_to_set->register_field_in_read_map(); else bitmap_set_bit(table->write_set, field_to_set->field_index); } diff --git a/sql/table.cc b/sql/table.cc index 1004f583448..2666523f092 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6717,7 +6717,7 @@ void TABLE::mark_columns_per_binlog_row_image() if ((my_field->flags & PRI_KEY_FLAG) || (my_field->type() != MYSQL_TYPE_BLOB)) { - bitmap_set_bit(read_set, my_field->field_index); + my_field->register_field_in_read_map(); bitmap_set_bit(rpl_write_set, my_field->field_index); } } From 0f6a5b4390efeac19ff3ad6fd3a8dd32241b343c Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Tue, 22 Jun 2021 18:30:53 +0300 Subject: [PATCH 34/98] [2/2] MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols Several different test cases were failing under the same reason: the fields in a vcol expression were not marked during marking columns of a key contatining virtual column for read. Fix: make marking columns of a key for read a special case where register_field_in_read_map() is done instead of plain bitmap_set_bit(). Some test cases are only reproducible in 10.4+, but the fix is applicable to 10.2+ --- mysql-test/suite/gcol/inc/gcol_ins_upd.inc | 30 ++++++++++++++ mysql-test/suite/gcol/inc/gcol_view.inc | 17 ++++++++ .../suite/gcol/r/gcol_ins_upd_innodb.result | 27 +++++++++++++ .../suite/gcol/r/gcol_ins_upd_myisam.result | 27 +++++++++++++ .../suite/gcol/r/gcol_view_innodb.result | 12 ++++++ .../suite/gcol/r/gcol_view_myisam.result | 12 ++++++ sql/table.cc | 39 ++++++++++++------- sql/table.h | 1 + 8 files changed, 152 insertions(+), 13 deletions(-) diff --git a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc index 6bd7974f2af..4cfcf371fd7 100644 --- a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc +++ b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc @@ -629,4 +629,34 @@ DROP TABLE t1; --let $datadir= `SELECT @@datadir` --remove_file $datadir/test/load.data + +--echo # +--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +--echo # + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT, + f ENUM('a','b','c'), + v ENUM('a','b','c') AS (f), + KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; + +# Cleanup +DROP TABLE t1; + + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT, + f ENUM('a','b','c'), + v ENUM('a','b','c') AS (f), + KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; + +# Cleanup +DROP TABLE t1; + } diff --git a/mysql-test/suite/gcol/inc/gcol_view.inc b/mysql-test/suite/gcol/inc/gcol_view.inc index 5e5afcb5ab1..4aabd2429cd 100644 --- a/mysql-test/suite/gcol/inc/gcol_view.inc +++ b/mysql-test/suite/gcol/inc/gcol_view.inc @@ -250,3 +250,20 @@ DELETE FROM v1 ORDER BY b LIMIT 2; # Cleanup DROP VIEW v1; DROP TABLE t1; +CREATE TABLE t1 (d INT, v TINYINT AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004'),('1985') ; +DELETE FROM v1 ORDER BY v LIMIT 4; + +DROP VIEW v1; +DROP TABLE t1; + + +CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ; +DELETE FROM v1 ORDER BY v LIMIT 4; + +DROP TABLE t1; +DROP VIEW v1; + diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result index 99e47c2d168..1d85fc837dc 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result @@ -764,6 +764,33 @@ SELECT pk, b FROM t1 INTO OUTFILE 'load.data'; LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); ERROR 22001: Data too long for column 'v' at row 1 DROP TABLE t1; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT, +f ENUM('a','b','c'), +v ENUM('a','b','c') AS (f), +KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; +Warnings: +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +DROP TABLE t1; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT, +f ENUM('a','b','c'), +v ENUM('a','b','c') AS (f), +KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; +Warnings: +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result index ce57fc08ac2..e10b83cabf5 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result @@ -686,6 +686,33 @@ SELECT pk, b FROM t1 INTO OUTFILE 'load.data'; LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); ERROR 22001: Data too long for column 'v' at row 1 DROP TABLE t1; +# +# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols +# +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT, +f ENUM('a','b','c'), +v ENUM('a','b','c') AS (f), +KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; +Warnings: +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +DROP TABLE t1; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT, +f ENUM('a','b','c'), +v ENUM('a','b','c') AS (f), +KEY(v,id) +) ENGINE=MyISAM; +INSERT INTO t1 (f) VALUES ('a'),('b'); +INSERT IGNORE INTO t1 SELECT * FROM t1; +Warnings: +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored +DROP TABLE t1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_view_innodb.result b/mysql-test/suite/gcol/r/gcol_view_innodb.result index 2690c60f634..59e299f9d8c 100644 --- a/mysql-test/suite/gcol/r/gcol_view_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_view_innodb.result @@ -291,6 +291,18 @@ INSERT INTO t1 (a) VALUES ('foo'),('bar'); DELETE FROM v1 ORDER BY b LIMIT 2; DROP VIEW v1; DROP TABLE t1; +CREATE TABLE t1 (d INT, v TINYINT AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004'),('1985') ; +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ; +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP TABLE t1; +DROP VIEW v1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_view_myisam.result b/mysql-test/suite/gcol/r/gcol_view_myisam.result index b2856e36d13..17cc2135439 100644 --- a/mysql-test/suite/gcol/r/gcol_view_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_view_myisam.result @@ -291,6 +291,18 @@ INSERT INTO t1 (a) VALUES ('foo'),('bar'); DELETE FROM v1 ORDER BY b LIMIT 2; DROP VIEW v1; DROP TABLE t1; +CREATE TABLE t1 (d INT, v TINYINT AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004'),('1985') ; +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP VIEW v1; +DROP TABLE t1; +CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d)); +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ; +DELETE FROM v1 ORDER BY v LIMIT 4; +DROP TABLE t1; +DROP VIEW v1; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/sql/table.cc b/sql/table.cc index 2666523f092..4afd2488ea1 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6329,7 +6329,7 @@ void TABLE::prepare_for_position() if ((file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) && s->primary_key < MAX_KEY) { - mark_columns_used_by_index_no_reset(s->primary_key, read_set); + mark_columns_used_by_index_for_read_no_reset(s->primary_key); /* signal change */ file->column_bitmaps_signal(); } @@ -6385,23 +6385,36 @@ void TABLE::restore_column_maps_after_keyread(MY_BITMAP *backup) DBUG_VOID_RETURN; } +static void mark_index_columns(TABLE *table, uint index, + MY_BITMAP *bitmap, bool read) +{ + KEY_PART_INFO *key_part= table->key_info[index].key_part; + uint key_parts= table->key_info[index].user_defined_key_parts; + for (uint k= 0; k < key_parts; k++) + if (read) + key_part[k].field->register_field_in_read_map(); + else + bitmap_set_bit(bitmap, key_part[k].fieldnr-1); + if (table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX && + table->s->primary_key != MAX_KEY && table->s->primary_key != index) + mark_index_columns(table, table->s->primary_key, bitmap, read); +} /* mark columns used by key, but don't reset other fields */ -void TABLE::mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *bitmap) +inline void TABLE::mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *bitmap) { - KEY_PART_INFO *key_part= key_info[index].key_part; - KEY_PART_INFO *key_part_end= (key_part + key_info[index].user_defined_key_parts); - for (;key_part != key_part_end; key_part++) - bitmap_set_bit(bitmap, key_part->fieldnr-1); - if (file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX && - s->primary_key != MAX_KEY && s->primary_key != index) - mark_columns_used_by_index_no_reset(s->primary_key, bitmap); + mark_index_columns(this, index, bitmap, false); } +inline void TABLE::mark_columns_used_by_index_for_read_no_reset(uint index) +{ + mark_index_columns(this, index, read_set, true); +} + /* Mark auto-increment fields as used fields in both read and write maps @@ -6420,7 +6433,7 @@ void TABLE::mark_auto_increment_column() bitmap_set_bit(read_set, found_next_number_field->field_index); bitmap_set_bit(write_set, found_next_number_field->field_index); if (s->next_number_keypart) - mark_columns_used_by_index_no_reset(s->next_number_index, read_set); + mark_columns_used_by_index_for_read_no_reset(s->next_number_index); file->column_bitmaps_signal(); } @@ -6476,7 +6489,7 @@ void TABLE::mark_columns_needed_for_delete() file->use_hidden_primary_key(); else { - mark_columns_used_by_index_no_reset(s->primary_key, read_set); + mark_columns_used_by_index_for_read_no_reset(s->primary_key); need_signal= true; } } @@ -6566,7 +6579,7 @@ void TABLE::mark_columns_needed_for_update() file->use_hidden_primary_key(); else { - mark_columns_used_by_index_no_reset(s->primary_key, read_set); + mark_columns_used_by_index_for_read_no_reset(s->primary_key); need_signal= true; } } @@ -6729,7 +6742,7 @@ void TABLE::mark_columns_per_binlog_row_image() We don't need to mark the primary key in the rpl_write_set as the binary log will include all columns read anyway. */ - mark_columns_used_by_index_no_reset(s->primary_key, read_set); + mark_columns_used_by_index_for_read_no_reset(s->primary_key); /* Only write columns that have changed */ rpl_write_set= write_set; break; diff --git a/sql/table.h b/sql/table.h index 69bd14b2834..7a5f4c6fe86 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1423,6 +1423,7 @@ public: { return prepare_for_keyread(index, &tmp_set); } void mark_columns_used_by_index(uint index, MY_BITMAP *map); void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map); + void mark_columns_used_by_index_for_read_no_reset(uint index); void restore_column_maps_after_keyread(MY_BITMAP *backup); void mark_auto_increment_column(void); void mark_columns_needed_for_update(void); From f64a4f672ab9c5338a700a05650df394a732aac9 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Mon, 28 Jun 2021 21:31:14 +0300 Subject: [PATCH 35/98] follow-up MDEV-18166: rename marking functions Reformulate mark_columns_used_by_index* function family in a more laconic way: mark_columns_used_by_index -> mark_index_columns mark_columns_used_by_index_for_read_no_reset -> mark_index_columns_for_read mark_columns_used_by_index_no_reset -> mark_index_columns_no_reset static mark_index_columns -> do_mark_index_columns --- sql/key.cc | 2 +- sql/sql_class.cc | 4 ++-- sql/sql_select.cc | 2 +- sql/sql_update.cc | 2 +- sql/table.cc | 32 ++++++++++++++++---------------- sql/table.h | 6 +++--- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/sql/key.cc b/sql/key.cc index 689b1e9c886..d0da75ae61b 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -465,7 +465,7 @@ void key_unpack(String *to, TABLE *table, KEY *key) bool is_key_used(TABLE *table, uint idx, const MY_BITMAP *fields) { - table->mark_columns_used_by_index(idx, &table->tmp_set); + table->mark_index_columns(idx, &table->tmp_set); return bitmap_is_overlapping(&table->tmp_set, fields); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 80ff0aa077c..5ada018e540 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -6681,8 +6681,8 @@ void THD::binlog_prepare_row_images(TABLE *table) { case BINLOG_ROW_IMAGE_MINIMAL: /* MINIMAL: Mark only PK */ - table->mark_columns_used_by_index(table->s->primary_key, - &table->tmp_set); + table->mark_index_columns(table->s->primary_key, + &table->tmp_set); break; case BINLOG_ROW_IMAGE_NOBLOB: /** diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 362adc9853f..e89d06115fc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1179,7 +1179,7 @@ int JOIN::init_join_caches() if (table->file->keyread_enabled()) { if (!(table->file->index_flags(table->file->keyread, 0, 1) & HA_CLUSTERED_INDEX)) - table->mark_columns_used_by_index(table->file->keyread, table->read_set); + table->mark_index_columns(table->file->keyread, table->read_set); } else if ((tab->read_first_record == join_read_first || tab->read_first_record == join_read_last) && diff --git a/sql/sql_update.cc b/sql/sql_update.cc index b7ef7c2a0db..8af6c8f80a2 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -195,7 +195,7 @@ static void prepare_record_for_error_message(int error, TABLE *table) /* Create unique_map with all fields used by that index. */ my_bitmap_init(&unique_map, unique_map_buf, table->s->fields, FALSE); - table->mark_columns_used_by_index(keynr, &unique_map); + table->mark_index_columns(keynr, &unique_map); /* Subtract read_set and write_set. */ bitmap_subtract(&unique_map, table->read_set); diff --git a/sql/table.cc b/sql/table.cc index 4afd2488ea1..b7cf1274400 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6329,7 +6329,7 @@ void TABLE::prepare_for_position() if ((file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) && s->primary_key < MAX_KEY) { - mark_columns_used_by_index_for_read_no_reset(s->primary_key); + mark_index_columns_for_read(s->primary_key); /* signal change */ file->column_bitmaps_signal(); } @@ -6345,7 +6345,7 @@ MY_BITMAP *TABLE::prepare_for_keyread(uint index, MY_BITMAP *map) file->ha_start_keyread(index); if (map != read_set || !(file->index_flags(index, 0, 1) & HA_CLUSTERED_INDEX)) { - mark_columns_used_by_index(index, map); + mark_index_columns(index, map); column_bitmaps_set(map); } DBUG_RETURN(backup); @@ -6356,12 +6356,12 @@ MY_BITMAP *TABLE::prepare_for_keyread(uint index, MY_BITMAP *map) Mark that only fields from one key is used. Useful before keyread. */ -void TABLE::mark_columns_used_by_index(uint index, MY_BITMAP *bitmap) +void TABLE::mark_index_columns(uint index, MY_BITMAP *bitmap) { - DBUG_ENTER("TABLE::mark_columns_used_by_index"); + DBUG_ENTER("TABLE::mark_index_columns"); bitmap_clear_all(bitmap); - mark_columns_used_by_index_no_reset(index, bitmap); + mark_index_columns_no_reset(index, bitmap); DBUG_VOID_RETURN; } @@ -6385,8 +6385,8 @@ void TABLE::restore_column_maps_after_keyread(MY_BITMAP *backup) DBUG_VOID_RETURN; } -static void mark_index_columns(TABLE *table, uint index, - MY_BITMAP *bitmap, bool read) +static void do_mark_index_columns(TABLE *table, uint index, + MY_BITMAP *bitmap, bool read) { KEY_PART_INFO *key_part= table->key_info[index].key_part; uint key_parts= table->key_info[index].user_defined_key_parts; @@ -6397,22 +6397,22 @@ static void mark_index_columns(TABLE *table, uint index, bitmap_set_bit(bitmap, key_part[k].fieldnr-1); if (table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX && table->s->primary_key != MAX_KEY && table->s->primary_key != index) - mark_index_columns(table, table->s->primary_key, bitmap, read); + do_mark_index_columns(table, table->s->primary_key, bitmap, read); } /* mark columns used by key, but don't reset other fields */ -inline void TABLE::mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *bitmap) +inline void TABLE::mark_index_columns_no_reset(uint index, MY_BITMAP *bitmap) { - mark_index_columns(this, index, bitmap, false); + do_mark_index_columns(this, index, bitmap, false); } -inline void TABLE::mark_columns_used_by_index_for_read_no_reset(uint index) +inline void TABLE::mark_index_columns_for_read(uint index) { - mark_index_columns(this, index, read_set, true); + do_mark_index_columns(this, index, read_set, true); } /* @@ -6433,7 +6433,7 @@ void TABLE::mark_auto_increment_column() bitmap_set_bit(read_set, found_next_number_field->field_index); bitmap_set_bit(write_set, found_next_number_field->field_index); if (s->next_number_keypart) - mark_columns_used_by_index_for_read_no_reset(s->next_number_index); + mark_index_columns_for_read(s->next_number_index); file->column_bitmaps_signal(); } @@ -6489,7 +6489,7 @@ void TABLE::mark_columns_needed_for_delete() file->use_hidden_primary_key(); else { - mark_columns_used_by_index_for_read_no_reset(s->primary_key); + mark_index_columns_for_read(s->primary_key); need_signal= true; } } @@ -6579,7 +6579,7 @@ void TABLE::mark_columns_needed_for_update() file->use_hidden_primary_key(); else { - mark_columns_used_by_index_for_read_no_reset(s->primary_key); + mark_index_columns_for_read(s->primary_key); need_signal= true; } } @@ -6742,7 +6742,7 @@ void TABLE::mark_columns_per_binlog_row_image() We don't need to mark the primary key in the rpl_write_set as the binary log will include all columns read anyway. */ - mark_columns_used_by_index_for_read_no_reset(s->primary_key); + mark_index_columns_for_read(s->primary_key); /* Only write columns that have changed */ rpl_write_set= write_set; break; diff --git a/sql/table.h b/sql/table.h index 7a5f4c6fe86..38b63d285c6 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1421,9 +1421,9 @@ public: MY_BITMAP *prepare_for_keyread(uint index, MY_BITMAP *map); MY_BITMAP *prepare_for_keyread(uint index) { return prepare_for_keyread(index, &tmp_set); } - void mark_columns_used_by_index(uint index, MY_BITMAP *map); - void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map); - void mark_columns_used_by_index_for_read_no_reset(uint index); + void mark_index_columns(uint index, MY_BITMAP *bitmap); + void mark_index_columns_no_reset(uint index, MY_BITMAP *bitmap); + void mark_index_columns_for_read(uint index); void restore_column_maps_after_keyread(MY_BITMAP *backup); void mark_auto_increment_column(void); void mark_columns_needed_for_update(void); From 191cae2d0ddeb475152c475a2227d1c385eaac83 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Fri, 25 Jun 2021 04:23:27 +0300 Subject: [PATCH 36/98] MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE The problem is the same as in MDEV-18166: columns in virtual field expression are not marked for read, while the field itself does. field->register_field_in_read_map() should be called for read-marking all fields. The test is reproduced only in 10.4+, however the fix is applicable to 10.2+. --- mysql-test/suite/gcol/inc/gcol_view.inc | 9 +++++++++ mysql-test/suite/gcol/r/gcol_view_innodb.result | 9 +++++++++ mysql-test/suite/gcol/r/gcol_view_myisam.result | 9 +++++++++ sql/sql_admin.cc | 4 ++-- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/gcol/inc/gcol_view.inc b/mysql-test/suite/gcol/inc/gcol_view.inc index 4aabd2429cd..6f9ce673199 100644 --- a/mysql-test/suite/gcol/inc/gcol_view.inc +++ b/mysql-test/suite/gcol/inc/gcol_view.inc @@ -267,3 +267,12 @@ DELETE FROM v1 ORDER BY v LIMIT 4; DROP TABLE t1; DROP VIEW v1; + +--echo # +--echo # MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE +--echo # + +create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual); +insert into t1 (c) values ('a'),('b'); +analyze table t1 persistent for columns (v) indexes (); + diff --git a/mysql-test/suite/gcol/r/gcol_view_innodb.result b/mysql-test/suite/gcol/r/gcol_view_innodb.result index 59e299f9d8c..03c4a15620a 100644 --- a/mysql-test/suite/gcol/r/gcol_view_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_view_innodb.result @@ -303,6 +303,15 @@ INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456' DELETE FROM v1 ORDER BY v LIMIT 4; DROP TABLE t1; DROP VIEW v1; +# +# MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE +# +create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual); +insert into t1 (c) values ('a'),('b'); +analyze table t1 persistent for columns (v) indexes (); +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_view_myisam.result b/mysql-test/suite/gcol/r/gcol_view_myisam.result index 17cc2135439..a030c73401c 100644 --- a/mysql-test/suite/gcol/r/gcol_view_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_view_myisam.result @@ -303,6 +303,15 @@ INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456' DELETE FROM v1 ORDER BY v LIMIT 4; DROP TABLE t1; DROP VIEW v1; +# +# MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE +# +create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual); +insert into t1 (c) values ('a'),('b'); +analyze table t1 persistent for columns (v) indexes (); +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 41af1e22de6..7942587cf02 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -838,7 +838,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, enum enum_field_types type= (*field_ptr)->type(); if (type < MYSQL_TYPE_MEDIUM_BLOB || type > MYSQL_TYPE_BLOB) - bitmap_set_bit(tab->read_set, fields); + tab->field[fields]->register_field_in_read_map(); else push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_NO_EIS_FOR_FIELD, @@ -866,7 +866,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, enum enum_field_types type= tab->field[pos]->type(); if (type < MYSQL_TYPE_MEDIUM_BLOB || type > MYSQL_TYPE_BLOB) - bitmap_set_bit(tab->read_set, pos); + tab->field[pos]->register_field_in_read_map(); else push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_NO_EIS_FOR_FIELD, From 165a6dc97a900e922cb90a1fb5b16e8f9d254ec3 Mon Sep 17 00:00:00 2001 From: Alexey Bychko Date: Tue, 13 Jul 2021 14:30:40 +0700 Subject: [PATCH 37/98] MDEV-26119 RPM packages on RHEL-8 require the latest minor changed rpm db query to output only version for libsepol and not release/buildnumber --- support-files/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt index 038e7163901..810e0127202 100644 --- a/support-files/CMakeLists.txt +++ b/support-files/CMakeLists.txt @@ -88,7 +88,7 @@ IF(UNIX) INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT SupportFiles) ENDFOREACH() IF(RPM) - EXECUTE_PROCESS(COMMAND rpm -q --qf "%{VERSION}-%{RELEASE}" libsepol + EXECUTE_PROCESS(COMMAND rpm -q --qf "%{VERSION}" libsepol OUTPUT_VARIABLE LIBSEPOL_VERSION RESULT_VARIABLE err) IF (NOT err) SET(CPACK_RPM_server_PACKAGE_REQUIRES From 0f6e170c34700a2964556839c676c1b7768f3ffb Mon Sep 17 00:00:00 2001 From: Nayuta Yanagisawa Date: Thu, 8 Jul 2021 04:24:38 +0000 Subject: [PATCH 38/98] MDEV-25985 Spider handle ">=" as ">" in some cases The function spider_db_append_key_where_internal() converts HA_READ_AFTER_KEY to '>'. The conversion seems to be correct for single-column indexes because HA_READ_AFTER_KEY means "read the key after the provided value." However, how about multi-column indexes? Assume that there is a multi-column index on c1 and c2 and we search with the condition 'c1 >= 100 AND c2 > 200'. The key_range.flag corresponds to the search condition could be HA_READ_AFTER_KEY. In such a case, we could not simply convert HA_READ_AFTER_KEY to '>'. The correct conversion is to convert HA_READ_AFTER_KEY to '>' only for the last column in key_part_map and to convert HA_READ_AFTER_KEY to '>=' for the other column. The similar discussion also applies to the conversion from key_range.flag to a sign of inequality. --- .../spider/include/init_master_1.inc | 5 +++ .../spider/r/spider_fixes_part.result | 34 +++++++++++++++ .../spider/t/spider_fixes_part.test | 35 ++++++++++++++++ storage/spider/spd_db_conn.cc | 42 +++++++++++++++---- 4 files changed, 107 insertions(+), 9 deletions(-) diff --git a/storage/spider/mysql-test/spider/include/init_master_1.inc b/storage/spider/mysql-test/spider/include/init_master_1.inc index 2c45d0bd65d..460142b9c7d 100644 --- a/storage/spider/mysql-test/spider/include/init_master_1.inc +++ b/storage/spider/mysql-test/spider/include/init_master_1.inc @@ -152,6 +152,11 @@ let $MASTER_1_COMMENT_TEXT_PK1_1= COMMENT 'tbl "t1", srv "s_2_1"'; let $MASTER_1_COMMENT_TEXT_KEY1_1= COMMENT 'tbl "t1", srv "s_2_1"'; +let $MASTER_1_COMMENT_MDEV_25985= + COMMENT='table "t1"' + PARTITION BY LIST COLUMNS(`a`) ( + PARTITION `pt1` DEFAULT COMMENT = 'srv "s_2_1"' + ); let $MASTER_1_CHECK_DIRECT_UPDATE_STATUS= SHOW STATUS LIKE 'Spider_direct_update'; let $MASTER_1_CHECK_DIRECT_DELETE_STATUS= diff --git a/storage/spider/mysql-test/spider/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/r/spider_fixes_part.result index d2367af9bbd..ad8a87db727 100644 --- a/storage/spider/mysql-test/spider/r/spider_fixes_part.result +++ b/storage/spider/mysql-test/spider/r/spider_fixes_part.result @@ -262,6 +262,40 @@ a b c d e f 56B68DA68D6D4A04A08B453D09AD7B70 821E71E6ABB4404EBAA349BB681089F8 51041110620310 2018-08-02 13:48:28 510411 0 51ECF2C0CD3C48D99C91792E99D3C1A0 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:29 510411 0 093B37A93A534DF883787AF5F6799674 996C7F14989D480589A553717D735E3E 51041110620302 2018-08-02 13:48:30 510411 0 +# +# MDEV-25985 Spider handle ">=" as ">" in some cases +# +connection child2_1; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +a int, +b int, +c int, +PRIMARY KEY (a), +KEY (b,c) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 1); +connection master_1; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +a int, +b int, +c int, +PRIMARY KEY (a), +KEY (b,c) +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "t1"' + PARTITION BY LIST COLUMNS(`a`) ( +PARTITION `pt1` DEFAULT COMMENT = 'srv "s_2_1"' + ); +connection master_1; +SELECT * FROM t1 WHERE c > 0 AND b >= 1 AND b <= 2; +a b c +1 1 1 +2 2 1 +SELECT * FROM t1 WHERE c < 3 AND b <= 2; +a b c +1 1 1 +2 2 1 deinit connection master_1; diff --git a/storage/spider/mysql-test/spider/t/spider_fixes_part.test b/storage/spider/mysql-test/spider/t/spider_fixes_part.test index 868e684f959..68594458434 100644 --- a/storage/spider/mysql-test/spider/t/spider_fixes_part.test +++ b/storage/spider/mysql-test/spider/t/spider_fixes_part.test @@ -726,6 +726,41 @@ if ($HAVE_PARTITION) } } + +--echo # +--echo # MDEV-25985 Spider handle ">=" as ">" in some cases +--echo # + +--connection child2_1 +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +eval CREATE TABLE t1 ( + a int, + b int, + c int, + PRIMARY KEY (a), + KEY (b,c) +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 1); + +--connection master_1 +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +eval CREATE TABLE t1 ( + a int, + b int, + c int, + PRIMARY KEY (a), + KEY (b,c) +) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_MDEV_25985; + +--connection master_1 +SELECT * FROM t1 WHERE c > 0 AND b >= 1 AND b <= 2; +SELECT * FROM t1 WHERE c < 3 AND b <= 2; + --echo --echo deinit --disable_warnings diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 8d4e9acda07..df6c0ceb5f5 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -1867,12 +1867,20 @@ int spider_db_append_key_where_internal( case HA_READ_AFTER_KEY: if (sql_kind == SPIDER_SQL_KIND_SQL) { + const char* op_str; + uint32 op_len; + if (start_key_part_map == 1) { + op_str = SPIDER_SQL_GT_STR; + op_len = SPIDER_SQL_GT_LEN; + } else { + op_str = SPIDER_SQL_GTEQUAL_STR; + op_len = SPIDER_SQL_GTEQUAL_LEN; + } if (str->reserve(store_length + key_name_length + - /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + - SPIDER_SQL_GT_LEN)) + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); dbton_share->append_column_name(str, field->field_index); - str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN); + str->q_append(op_str, op_len); if (spider_dbton[dbton_id].db_util-> append_column_value(spider, str, field, ptr, share->access_charset)) @@ -1927,12 +1935,20 @@ int spider_db_append_key_where_internal( result_list->desc_flg = TRUE; if (sql_kind == SPIDER_SQL_KIND_SQL) { + const char* op_str; + uint32 op_len; + if (start_key_part_map == 1) { + op_str = SPIDER_SQL_LT_STR; + op_len = SPIDER_SQL_LT_LEN; + } else { + op_str = SPIDER_SQL_LTEQUAL_STR; + op_len = SPIDER_SQL_LTEQUAL_LEN; + } if (str->reserve(store_length + key_name_length + - /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + - SPIDER_SQL_LT_LEN)) + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); dbton_share->append_column_name(str, field->field_index); - str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN); + str->q_append(op_str, op_len); if (spider_dbton[dbton_id].db_util-> append_column_value(spider, str, field, ptr, share->access_charset)) @@ -2297,12 +2313,20 @@ int spider_db_append_key_where_internal( case HA_READ_BEFORE_KEY: if (sql_kind == SPIDER_SQL_KIND_SQL) { + const char* op_str; + uint32 op_len; + if (end_key_part_map == 1) { + op_str = SPIDER_SQL_LT_STR; + op_len = SPIDER_SQL_LT_LEN; + } else { + op_str = SPIDER_SQL_LTEQUAL_STR; + op_len = SPIDER_SQL_LTEQUAL_LEN; + } if (str->reserve(store_length + key_name_length + - /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + - SPIDER_SQL_LT_LEN)) + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); dbton_share->append_column_name(str, field->field_index); - str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN); + str->q_append(op_str, op_len); if (spider_dbton[dbton_id].db_util-> append_column_value(spider, str, field, ptr, share->access_charset)) From da495b1b697d7cde0af8c7900dc9762cc3f7455b Mon Sep 17 00:00:00 2001 From: Oli Sennhauser Date: Thu, 14 Jan 2021 14:35:45 +0100 Subject: [PATCH 39/98] Typo fix in extrabackup.cc and innobackupex.cc Thanks to @shinguz for helping with this. This a backport commit from 10.7 --- extra/mariabackup/innobackupex.cc | 2 +- extra/mariabackup/xtrabackup.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/mariabackup/innobackupex.cc b/extra/mariabackup/innobackupex.cc index c4c8ec7f17b..4bbdeead0d6 100644 --- a/extra/mariabackup/innobackupex.cc +++ b/extra/mariabackup/innobackupex.cc @@ -307,7 +307,7 @@ static struct my_option ibx_long_options[] = {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " "option, when specified, makes --copy-back or --move-back transfer " "files to non-empty directories. Note that no existing files will be " - "overwritten. If --copy-back or --nove-back has to copy a file from " + "overwritten. If --copy-back or --move-back has to copy a file from " "the backup directory which already exists in the destination " "directory, it will still fail with an error.", (uchar *) &opt_ibx_force_non_empty_dirs, diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index dc6227b6b7b..6f4ad7d9e17 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -1281,7 +1281,7 @@ struct my_option xb_client_options[]= { "This " "option, when specified, makes --copy-back or --move-back transfer " "files to non-empty directories. Note that no existing files will be " - "overwritten. If --copy-back or --nove-back has to copy a file from " + "overwritten. If --copy-back or --move-back has to copy a file from " "the backup directory which already exists in the destination " "directory, it will still fail with an error.", (uchar *) &opt_force_non_empty_dirs, (uchar *) &opt_force_non_empty_dirs, From de85e2943606257871f8806de9466d4e5d4e7b89 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 15 Jul 2021 17:43:13 +0200 Subject: [PATCH 40/98] MDEV-25326 mysql_install_db help text incomplete fix it again, in 10.3, after a bad merge in 98e6159892ae --- scripts/mysql_install_db.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index 57b836a81aa..67a6eba59d5 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -572,12 +572,8 @@ then echo echo echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !" - echo "To do so, start the server, then issue the following commands:" + echo "To do so, start the server, then issue the following command:" echo - echo "'$bindir/mysqladmin' -u root password 'new-password'" - echo "'$bindir/mysqladmin' -u root -h $hostname password 'new-password'" - echo - echo "Alternatively you can run:" echo "'$bindir/mysql_secure_installation'" echo echo "which will also give you the option of removing the test" From 6a89f346dea852b267994e6f32e1c163e7688b34 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 10 Jun 2021 23:54:14 +0300 Subject: [PATCH 41/98] MDEV-25858: Query results are incorrect when indexes are added If test_if_skip_sort_order() decides to use an index to produce required ordering, it should disable "Range Checked for each record" optimization. This is because Range-Checked-for-each-record may decide to use an index (or an index_merge) which will not produce the required ordering. --- mysql-test/r/order_by_innodb.result | 52 +++++++++++++++++++++++++++++ mysql-test/t/order_by_innodb.test | 51 ++++++++++++++++++++++++++++ sql/sql_select.cc | 12 +++++++ 3 files changed, 115 insertions(+) diff --git a/mysql-test/r/order_by_innodb.result b/mysql-test/r/order_by_innodb.result index 9cdf9800cee..14b9b861a14 100644 --- a/mysql-test/r/order_by_innodb.result +++ b/mysql-test/r/order_by_innodb.result @@ -147,4 +147,56 @@ i n 656 eight set optimizer_switch= @save_optimizer_switch; DROP TABLE t1,t2,t3; +# +# MDEV-25858: Query results are incorrect when indexes are added +# +CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb; +insert into t1 values (1),(2),(3); +CREATE TABLE t2 ( +id int NOT NULL PRIMARY KEY, +id2 int NOT NULL, +d1 datetime, +d2 timestamp NOT NULL, +KEY id2 (id2) +) engine=innodb; +insert into t2 values +(1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'), +(2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'), +(3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00'); +select +t1.id,t2.id +from +t1 left join +t2 on t2.id2 = t1.id and +t2.id = (select dd.id +from t2 dd +where +dd.id2 = t1.id and +d1 > '2019-02-06 00:00:00' + order by +dd.d1 desc, dd.d2 desc, dd.id desc limit 1 +); +id id +1 NULL +2 1 +3 3 +create index for_latest_sort on t2 (d1 desc, d2 desc, id desc); +select +t1.id,t2.id +from +t1 left join +t2 on t2.id2 = t1.id and +t2.id = (select dd.id +from t2 dd +where +dd.id2 = t1.id and +d1 > '2019-02-06 00:00:00' + order by +dd.d1 desc, dd.d2 desc, dd.id desc limit 1 +); +id id +1 NULL +2 1 +3 3 +drop table t1,t2; # End of 10.2 tests diff --git a/mysql-test/t/order_by_innodb.test b/mysql-test/t/order_by_innodb.test index f4c738263ae..97c043b8dbc 100644 --- a/mysql-test/t/order_by_innodb.test +++ b/mysql-test/t/order_by_innodb.test @@ -135,4 +135,55 @@ set optimizer_switch= @save_optimizer_switch; DROP TABLE t1,t2,t3; +--echo # +--echo # MDEV-25858: Query results are incorrect when indexes are added +--echo # + +CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb; +insert into t1 values (1),(2),(3); + +CREATE TABLE t2 ( + id int NOT NULL PRIMARY KEY, + id2 int NOT NULL, + d1 datetime, + d2 timestamp NOT NULL, + KEY id2 (id2) +) engine=innodb; + +insert into t2 values + (1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'), + (2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'), + (3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00'); + +select + t1.id,t2.id +from + t1 left join + t2 on t2.id2 = t1.id and + t2.id = (select dd.id + from t2 dd + where + dd.id2 = t1.id and + d1 > '2019-02-06 00:00:00' + order by + dd.d1 desc, dd.d2 desc, dd.id desc limit 1 + ); + +create index for_latest_sort on t2 (d1 desc, d2 desc, id desc); + +select + t1.id,t2.id +from + t1 left join + t2 on t2.id2 = t1.id and + t2.id = (select dd.id + from t2 dd + where + dd.id2 = t1.id and + d1 > '2019-02-06 00:00:00' + order by + dd.d1 desc, dd.d2 desc, dd.id desc limit 1 + ); +drop table t1,t2; + --echo # End of 10.2 tests diff --git a/sql/sql_select.cc b/sql/sql_select.cc index e89d06115fc..2bb01ee0d0a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -21938,6 +21938,12 @@ check_reverse_order: if (select->quick == save_quick) save_quick= 0; // make_reverse() consumed it select->set_quick(tmp); + /* Cancel "Range checked for each record" */ + if (tab->use_quick == 2) + { + tab->use_quick= 1; + tab->read_first_record= join_init_read_record; + } } else if (tab->type != JT_NEXT && tab->type != JT_REF_OR_NULL && tab->ref.key >= 0 && tab->ref.key_parts <= used_key_parts) @@ -21950,6 +21956,12 @@ check_reverse_order: */ tab->read_first_record= join_read_last_key; tab->read_record.read_record= join_read_prev_same; + /* Cancel "Range checked for each record" */ + if (tab->use_quick == 2) + { + tab->use_quick= 1; + tab->read_first_record= join_init_read_record; + } /* Cancel Pushed Index Condition, as it doesn't work for reverse scans. */ From c47e4aab62c65e1a1d431f9888ba1bc6b9841687 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Sat, 26 Jun 2021 20:11:56 +0300 Subject: [PATCH 42/98] MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT The columns that are part of DEFAULT expression were not read-marked in statements like UPDATE...SET b=DEFAULT. The problem is `F(DEFAULT)` expression depends of the left-hand side of an assignment. However, setup_fields accepts only right-hand side value. Neither Item::fix_fields does. Suchwise, b=DEFAULT(b) works fine, because Item_default_field has information on what field it is default of: if (thd->mark_used_columns != MARK_COLUMNS_NONE) def_field->default_value->expr->update_used_tables(); in Item_default_value::fix_fields(). It is not reasonable to pass a left-hand side to Item:fix_fields, because the case is rare, so the rewrite b= F(DEFAULT) -> b= F(DEFAULT(b)) is made instead. Both UPDATE and multi-UPDATE are affected, however any form of INSERT is not: it marks all the fields in DEFAULT expressions for read in TABLE::mark_default_fields_for_write(). --- mysql-test/r/default.result | 4 ++-- mysql-test/suite/gcol/inc/gcol_ins_upd.inc | 22 +++++++++++++++++++ .../suite/gcol/r/gcol_ins_upd_innodb.result | 22 +++++++++++++++++++ .../suite/gcol/r/gcol_ins_upd_myisam.result | 22 +++++++++++++++++++ mysql-test/t/default.test | 2 +- sql/item.cc | 6 +++++ sql/item.h | 22 ++++++++++++++----- sql/sql_base.cc | 12 ++++++++++ sql/sql_base.h | 1 + sql/sql_update.cc | 4 ++++ sql/sql_yacc.yy | 4 ++-- 11 files changed, 111 insertions(+), 10 deletions(-) diff --git a/mysql-test/r/default.result b/mysql-test/r/default.result index 8335b553a8e..369734ae92a 100644 --- a/mysql-test/r/default.result +++ b/mysql-test/r/default.result @@ -3089,8 +3089,8 @@ DROP TABLE t1; # # Collations # -CREATE TABLE t1 (a VARCHAR(20) CHARACTER SET latin1 DEFAULT CONCAT('ö')) CHARACTER SET koi8r COLLATE koi8r_bin; -ERROR 22007: Encountered illegal value 'ö' when converting to koi8r +CREATE TABLE t1 (a VARCHAR(20) CHARACTER SET latin1 DEFAULT CONCAT('�')) CHARACTER SET koi8r COLLATE koi8r_bin; +ERROR 22007: Encountered illegal value '�' when converting to koi8r CREATE OR REPLACE TABLE t1 (a char(2) default concat('A') COLLATE utf8mb4_unicode_ci); SHOW CREATE TABLE t1; Table Create Table diff --git a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc index 4cfcf371fd7..e02a3828ea2 100644 --- a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc +++ b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc @@ -660,3 +660,25 @@ INSERT IGNORE INTO t1 SELECT * FROM t1; DROP TABLE t1; } + +--echo # +--echo # MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT +--echo # + +CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int); +INSERT INTO t1 VALUES (1,1,1); +UPDATE t1 SET b=DEFAULT; +SELECT * from t1; + +REPLACE t1 VALUES(1,1,1); +INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT; +SELECT * from t1; + +REPLACE t1 VALUES(1,1,1); +CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int); +INSERT INTO t2 VALUES (5,5,5); +UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT; +SELECT * from t1, t2; + +DROP TABLE t1, t2; + diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result index 1d85fc837dc..143e1b725c4 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_innodb.result @@ -791,6 +791,28 @@ Warnings: Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored DROP TABLE t1; +# +# MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT +# +CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int); +INSERT INTO t1 VALUES (1,1,1); +UPDATE t1 SET b=DEFAULT; +SELECT * from t1; +a b c +1 2 1 +REPLACE t1 VALUES(1,1,1); +INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT; +SELECT * from t1; +a b c +1 2 1 +REPLACE t1 VALUES(1,1,1); +CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int); +INSERT INTO t2 VALUES (5,5,5); +UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT; +SELECT * from t1, t2; +a b c a b c +1 2 1 5 6 5 +DROP TABLE t1, t2; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result index e10b83cabf5..2c883b2de35 100644 --- a/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result @@ -713,6 +713,28 @@ Warnings: Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored DROP TABLE t1; +# +# MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT +# +CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int); +INSERT INTO t1 VALUES (1,1,1); +UPDATE t1 SET b=DEFAULT; +SELECT * from t1; +a b c +1 2 1 +REPLACE t1 VALUES(1,1,1); +INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT; +SELECT * from t1; +a b c +1 2 1 +REPLACE t1 VALUES(1,1,1); +CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int); +INSERT INTO t2 VALUES (5,5,5); +UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT; +SELECT * from t1, t2; +a b c a b c +1 2 1 5 6 5 +DROP TABLE t1, t2; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff --git a/mysql-test/t/default.test b/mysql-test/t/default.test index 31cf589c487..aec518d94a6 100644 --- a/mysql-test/t/default.test +++ b/mysql-test/t/default.test @@ -1855,7 +1855,7 @@ DROP TABLE t1; --echo # --error ER_BAD_DATA -CREATE TABLE t1 (a VARCHAR(20) CHARACTER SET latin1 DEFAULT CONCAT('ö')) CHARACTER SET koi8r COLLATE koi8r_bin; +CREATE TABLE t1 (a VARCHAR(20) CHARACTER SET latin1 DEFAULT CONCAT('�')) CHARACTER SET koi8r COLLATE koi8r_bin; CREATE OR REPLACE TABLE t1 (a char(2) default concat('A') COLLATE utf8mb4_unicode_ci); SHOW CREATE TABLE t1; DROP TABLE t1; diff --git a/sql/item.cc b/sql/item.cc index d7a3659a2ce..96e118e6365 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -9003,6 +9003,12 @@ error: return TRUE; } +bool Item_default_value::enchant_default_with_arg_processor(void *proc_arg) +{ + if (!arg) arg= (Item *)proc_arg; + return 0; +} + void Item_default_value::cleanup() { delete cached_field; // Free cached blob data diff --git a/sql/item.h b/sql/item.h index cc1914a7ad4..8be9a7fe417 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1713,6 +1713,7 @@ public: virtual bool limit_index_condition_pushdown_processor(void *arg) { return 0; } virtual bool exists2in_processor(void *arg) { return 0; } virtual bool find_selective_predicates_list_processor(void *arg) { return 0; } + virtual bool enchant_default_with_arg_processor(void *arg) { return 0; } bool cleanup_is_expensive_cache_processor(void *arg) { is_expensive_cache= (int8)(-1); @@ -5449,6 +5450,11 @@ public: class Item_default_value : public Item_field { void calculate(); +protected: + Item_default_value(THD *thd, Name_resolution_context *context_arg, Item *a) + :Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL, + (const char *)NULL), + arg(a), cached_field(NULL) {} public: Item *arg; Field *cached_field; @@ -5456,16 +5462,12 @@ public: :Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL, (const char *)NULL), arg(NULL), cached_field(NULL) {} - Item_default_value(THD *thd, Name_resolution_context *context_arg, Item *a) - :Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL, - (const char *)NULL), - arg(a), cached_field(NULL) {} Item_default_value(THD *thd, Name_resolution_context *context_arg, Field *a) :Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL, (const char *)NULL), arg(NULL),cached_field(NULL) {} enum Type type() const { return DEFAULT_VALUE_ITEM; } - bool vcol_assignment_allowed_value() const { return arg == NULL; } + bool vcol_assignment_allowed_value() const { return true; } bool eq(const Item *item, bool binary_cmp) const; bool fix_fields(THD *, Item **); void cleanup(); @@ -5495,6 +5497,7 @@ public: Item_field *field_for_view_update() { return 0; } bool update_vcol_processor(void *arg) { return 0; } bool check_func_default_processor(void *arg) { return true; } + bool enchant_default_with_arg_processor(void *arg); bool walk(Item_processor processor, bool walk_subquery, void *args) { @@ -5505,6 +5508,15 @@ public: Item *transform(THD *thd, Item_transformer transformer, uchar *args); }; +class Item_default_value_arg: public Item_default_value +{ +public: + Item_default_value_arg(THD *thd, Name_resolution_context *context, Item *a) + :Item_default_value(thd, context, a) {} + + bool vcol_assignment_allowed_value() const { return arg == NULL; } +}; + /** This class is used as bulk parameter INGNORE representation. diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 3471297ac7d..9a66b27a454 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7193,6 +7193,18 @@ int setup_wild(THD *thd, TABLE_LIST *tables, List &fields, DBUG_RETURN(0); } +/** Transforms b= F(DEFAULT) -> b= F(DEFAULT(b)) */ +void setup_defaults(THD *thd, List &fields, List &values) +{ + List_iterator fit(fields); + List_iterator vit(values); + + for (Item *value= vit++, *f_item= fit++; value; value= vit++, f_item= fit++) + { + value->walk(&Item::enchant_default_with_arg_processor, false, f_item); + } +} + /**************************************************************************** ** Check that all given fields exists and fill struct with current data ****************************************************************************/ diff --git a/sql/sql_base.h b/sql/sql_base.h index 5674e8378c5..b3b0a11795d 100644 --- a/sql/sql_base.h +++ b/sql/sql_base.h @@ -172,6 +172,7 @@ bool setup_fields(THD *thd, Ref_ptr_array ref_pointer_array, List &item, enum_mark_columns mark_used_columns, List *sum_func_list, List *pre_fix, bool allow_sum_func); +void setup_defaults(THD *thd, List &fields, List &values); void unfix_fields(List &items); bool fill_record(THD * thd, TABLE *table_arg, List &fields, List &values, bool ignore_errors, bool update); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 8af6c8f80a2..0344d8e0082 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -370,6 +370,8 @@ int mysql_update(THD *thd, DBUG_RETURN(1); } + setup_defaults(thd, fields, values); + #ifndef NO_EMBEDDED_ACCESS_CHECKS /* Check values */ table_list->grant.want_privilege= table->grant.want_privilege= @@ -1749,6 +1751,8 @@ int multi_update::prepare(List ¬_used_values, } } + setup_defaults(thd, *fields, *values); + /* We have to check values after setup_tables to get covering_keys right in reference tables diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 25826d2d6b0..ec82c7f9f07 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -9466,8 +9466,8 @@ column_default_non_parenthesized_expr: Item_splocal *il= $3->get_item_splocal(); if (il) my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); - $$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), - $3); + $$= new (thd->mem_root) Item_default_value_arg(thd, Lex->current_context(), + $3); if ($$ == NULL) MYSQL_YYABORT; } From efa311ab8eaa40b0d27691bd70a2ccab343d5477 Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Sun, 18 Jul 2021 21:08:23 +0700 Subject: [PATCH 43/98] MDEV-26147: The test main.sp-row fails in case it is run in PS mode In case a stored procedure is invoked in PS mode with argument of type ROW() like the following one: CALL p1(ROW(10,20)) such statement fails with the error ER_OPERAND_COLUMNS (1241): Operand should contain 1 column(s) The reason of emitting the error is that wrong method was invoked on fixing an item corresponding to an argument of stored procedure - the method fix_fields_if_needed_for_scalar() was called instead of fix_fields_if_needed() that should be called. --- mysql-test/main/ps.result | 14 ++++++++++++++ mysql-test/main/ps.test | 16 ++++++++++++++++ sql/sql_prepare.cc | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result index e1f8d03a156..051f40cfd78 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5553,3 +5553,17 @@ DEALLOCATE PREPARE stmt; DROP TABLE t1, t2, t3; # End of 10.2 tests # +# +# MDEV-26147: The test main.sp-row fails in case it is run in PS mode +# +CREATE PROCEDURE p1(a ROW(a INT,b INT)) +BEGIN +SELECT a.a, a.b; +END; +$$ +PREPARE stmt FROM 'CALL p1(ROW(10, 20))'; +EXECUTE stmt; +a.a a.b +10 20 +DEALLOCATE PREPARE stmt; +DROP PROCEDURE p1; diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index 51531d4bb24..6920051b138 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -5000,3 +5000,19 @@ DROP TABLE t1, t2, t3; --echo # End of 10.2 tests --echo # + +--echo # +--echo # MDEV-26147: The test main.sp-row fails in case it is run in PS mode +--echo # +DELIMITER $$; +CREATE PROCEDURE p1(a ROW(a INT,b INT)) +BEGIN + SELECT a.a, a.b; +END; +$$ +DELIMITER ;$$ +PREPARE stmt FROM 'CALL p1(ROW(10, 20))'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +DROP PROCEDURE p1; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index ea867e7b63f..ae070ec8db0 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1741,7 +1741,7 @@ static bool mysql_test_call_fields(Prepared_statement *stmt, while ((item= it++)) { - if (item->fix_fields_if_needed_for_scalar(thd, it.ref())) + if (item->fix_fields_if_needed(thd, it.ref())) goto err; } DBUG_RETURN(FALSE); From bab989ab38a4d1d93f0f783fa0ee5e9f641a8566 Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Mon, 19 Jul 2021 19:25:11 +0700 Subject: [PATCH 44/98] MDEV-26145: Incorrect metadata is sent on running query with union in PS mode Test cases like the following one produce different result sets if it's run with and without th option --ps-protocol. CREATE TABLE t1(a INT); --enable_metadata (SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1); --disable_metadata DROP TABLE t1; Result sets differ in metadata for the query (SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1); The reason for different content of query metadata is that for queries with union the items being created on JOIN preparing phase is placed into item_list from SELECT_LEX_UNIT whereas for queries without union item_list from SELECT_LEX is used instead. --- mysql-test/r/mysql_client_test.result | 5 ++ mysql-test/t/mysql_client_test.test | 4 ++ sql/sql_prepare.cc | 7 ++- tests/mysql_client_test.c | 66 +++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/mysql_client_test.result b/mysql-test/r/mysql_client_test.result index 9538475fb86..37a735286da 100644 --- a/mysql-test/r/mysql_client_test.result +++ b/mysql-test/r/mysql_client_test.result @@ -126,6 +126,11 @@ Data: EOF mysql_stmt_next_result(): 0; field_count: 0 # ------------------------------------ +# cat MYSQL_TMP_DIR/test_mdev26145.out.log +# ------------------------------------ +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def MAX(a) MAX(a) 3 11 0 Y 32768 0 63 +# ------------------------------------ SET @@global.general_log= @old_general_log; SET @@global.slow_query_log= @old_slow_query_log; diff --git a/mysql-test/t/mysql_client_test.test b/mysql-test/t/mysql_client_test.test index 8c2f5e2c32b..aa9b1d5a77c 100644 --- a/mysql-test/t/mysql_client_test.test +++ b/mysql-test/t/mysql_client_test.test @@ -35,6 +35,10 @@ echo ok; --echo # ------------------------------------ --cat_file $MYSQL_TMP_DIR/test_wl4435.out.log --echo # ------------------------------------ +--echo # cat MYSQL_TMP_DIR/test_mdev26145.out.log +--echo # ------------------------------------ +--cat_file $MYSQL_TMP_DIR/test_mdev26145.out.log +--echo # ------------------------------------ --echo SET @@global.general_log= @old_general_log; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 922d7c92796..624bcb90cd5 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1674,7 +1674,12 @@ static int mysql_test_select(Prepared_statement *stmt, if (!lex->describe && !thd->lex->analyze_stmt && !stmt->is_sql_prepare()) { /* Make copy of item list, as change_columns may change it */ - List fields(lex->select_lex.item_list); + SELECT_LEX_UNIT* master_unit= unit->first_select()->master_unit(); + bool is_union_op= + master_unit->is_union() || master_unit->fake_select_lex; + + List fields(is_union_op ? unit->item_list : + lex->select_lex.item_list); /* Change columns if a procedure like analyse() */ if (unit->last_procedure && unit->last_procedure->change_columns(thd, fields)) diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 93f23236dbc..1f0334ec2cf 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -19896,6 +19896,71 @@ static void test_ps_params_in_ctes() myquery(rc); } +void display_result_metadata(MYSQL_FIELD *field, + uint num_fields) +{ + MYSQL_FIELD* field_end; + + mct_log("Catalog\tDatabase\tTable\tTable_alias\tColumn\t" + "Column_alias\tType\tLength\tMax length\tIs_null\t" + "Flags\tDecimals\tCharsetnr\n"); + for (field_end= field+num_fields; field < field_end; field++) + { + mct_log("%s\t", field->catalog); + mct_log("%s\t", field->db); + mct_log("%s\t", field->org_table); + mct_log("%s\t", field->table); + mct_log("%s\t", field->org_name); + mct_log("%s\t", field->name); + mct_log("%u\t", field->type); + mct_log("%lu\t", field->length); + mct_log("%lu\t", field->max_length); + mct_log("%s\t", (IS_NOT_NULL(field->flags) ? "N" : "Y")); + mct_log("%u\t", field->flags); + mct_log("%u\t", field->decimals); + mct_log("%u\n", field->charsetnr); + } +} + +static void test_mdev_26145() +{ + MYSQL_STMT *stmt; + MYSQL_RES *result; + MYSQL_FIELD *fields; + int rc, num_fields; + + myheader("test_mdev_26145"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); + myquery(rc); + + rc= mysql_query(mysql, "CREATE TABLE t1(a INT)"); + myquery(rc); + + stmt= mysql_simple_prepare( + mysql, "(SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1)"); + check_stmt(stmt); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + result= mysql_stmt_result_metadata(stmt); + DIE_UNLESS(result); + + num_fields= mysql_stmt_field_count(stmt); + fields= mysql_fetch_fields(result); + + mct_start_logging("test_mdev26145"); + display_result_metadata(fields, num_fields); + mct_close_log(); + + mysql_free_result(result); + mysql_stmt_close(stmt); + + rc= mysql_query(mysql, "DROP TABLE t1"); + + myquery(rc); +} #ifndef EMBEDDED_LIBRARY #define MDEV19838_MAX_PARAM_COUNT 32 @@ -20047,6 +20112,7 @@ static void test_mdev19838() #endif // EMBEDDED_LIBRARY static struct my_tests_st my_tests[]= { + { "test_mdev_26145", test_mdev_26145 }, { "disable_query_logs", disable_query_logs }, { "test_view_sp_list_fields", test_view_sp_list_fields }, { "client_query", client_query }, From b7886f55eb707c4cf7d8a5d94e79a87909f153e7 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sun, 18 Jul 2021 23:52:50 +0200 Subject: [PATCH 45/98] fix mysqld_safe --help put defaults* options first (and together). list --defaults-group-suffix too --- scripts/mysqld_safe.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh index dc2c0db8e40..9f539bf875d 100644 --- a/scripts/mysqld_safe.sh +++ b/scripts/mysqld_safe.sh @@ -73,12 +73,14 @@ usage () { cat < Date: Mon, 19 Jul 2021 12:10:45 +0000 Subject: [PATCH 46/98] MDEV-24760 SELECT..CASE statement syntax error at Spider Engine table The root cause of the bug is in `spider_db_mbase_util::open_item_func()`. The function handles an instance of the `Item_func` class based on its `Item_func::Functype`. The `Functype` of `CASE WHEN ... THEN` is `CASE_SEARCHED_FUNC`. However, the Spider SE doesn't recognize this `Functype` because `CASE_SEARCHED_FUNC` is newly added by 4de0d92. This results in the wrong handling of `CASE WHEN ... THEN`. The above also applies to `CASE_SIMPLE_FUNC`. --- .../spider/bugfix/r/mdev_24760.result | 49 ++++++ .../mysql-test/spider/bugfix/t/mdev_24760.cnf | 3 + .../spider/bugfix/t/mdev_24760.test | 49 ++++++ storage/spider/spd_db_mysql.cc | 154 +++++++++--------- 4 files changed, 176 insertions(+), 79 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_24760.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24760.cnf create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24760.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_24760.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_24760.result new file mode 100644 index 00000000000..08481cd15f9 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_24760.result @@ -0,0 +1,49 @@ +# +# MDEV-24760 SELECT..CASE statement syntax error at Spider Engine table +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +DROP TABLE IF EXISTS tbl_a; +Warnings: +Note 1051 Unknown table 'auto_test_remote.tbl_a' +CREATE TABLE tbl_a ( +id int NOT NULL AUTO_INCREMENT, +name varchar(255) DEFAULT NULL, +PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO tbl_a (name) VALUES ('Alice'), ('Bob'); +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +id int NOT NULL AUTO_INCREMENT, +name varchar(255) DEFAULT NULL, +PRIMARY KEY (id) +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a"' +PARTITION BY HASH(id) ( +PARTITION pt1 COMMENT='srv "s_2_1"' +); +SELECT id, CASE WHEN name='Alice' THEN "A" WHEN name='Bob' THEN "B" END FROM tbl_a; +id CASE WHEN name='Alice' THEN "A" WHEN name='Bob' THEN "B" END +1 A +2 B +SELECT id, CASE name WHEN 'Alice' THEN "A" WHEN 'Bob' THEN "B" END FROM tbl_a; +id CASE name WHEN 'Alice' THEN "A" WHEN 'Bob' THEN "B" END +1 A +2 B +DROP DATABASE auto_test_local; +connection child2_1; +DROP DATABASE auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.test new file mode 100644 index 00000000000..149b057d003 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24760.test @@ -0,0 +1,49 @@ +--echo # +--echo # MDEV-24760 SELECT..CASE statement syntax error at Spider Engine table +--echo # + +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_query_log +--enable_result_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +DROP TABLE IF EXISTS tbl_a; +eval CREATE TABLE tbl_a ( + id int NOT NULL AUTO_INCREMENT, + name varchar(255) DEFAULT NULL, + PRIMARY KEY (id) +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +INSERT INTO tbl_a (name) VALUES ('Alice'), ('Bob'); + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; + +eval CREATE TABLE tbl_a ( + id int NOT NULL AUTO_INCREMENT, + name varchar(255) DEFAULT NULL, + PRIMARY KEY (id) +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a"' +PARTITION BY HASH(id) ( + PARTITION pt1 COMMENT='srv "s_2_1"' +); + +SELECT id, CASE WHEN name='Alice' THEN "A" WHEN name='Bob' THEN "B" END FROM tbl_a; +SELECT id, CASE name WHEN 'Alice' THEN "A" WHEN 'Bob' THEN "B" END FROM tbl_a; + +DROP DATABASE auto_test_local; + +--connection child2_1 +DROP DATABASE auto_test_remote; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index ce6aef63fd8..6450506ecc9 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -4181,88 +4181,18 @@ int spider_db_mbase_util::open_item_func( ) { /* no action */ break; - } else if (func_name_length == 4) - { - if ( - !strncasecmp("rand", func_name, func_name_length) && + } else if (func_name_length == 4 && + !strncasecmp("rand", func_name, func_name_length) && #ifdef SPIDER_Item_args_arg_count_IS_PROTECTED - !item_func->argument_count() + !item_func->argument_count() #else - !item_func->arg_count + !item_func->arg_count #endif - ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields)); - } else if ( - !strncasecmp("case", func_name, func_name_length) - ) { -#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC - Item_func_case *item_func_case = (Item_func_case *) item_func; - if (str) - { - if (str->reserve(SPIDER_SQL_CASE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); - } - if (item_func_case->first_expr_num != -1) - { - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->first_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - for (roop_count = 0; roop_count < item_func_case->ncases; - roop_count += 2) - { - if (str) - { - if (str->reserve(SPIDER_SQL_WHEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - if (str) - { - if (str->reserve(SPIDER_SQL_THEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count + 1], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (item_func_case->else_expr_num != -1) - { - if (str) - { - if (str->reserve(SPIDER_SQL_ELSE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->else_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (str) - { - if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } - DBUG_RETURN(0); -#else - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif - } + ) { + if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields)); } else if (func_name_length == 6 && !strncasecmp("istrue", func_name, func_name_length) ) { @@ -5088,6 +5018,72 @@ int spider_db_mbase_util::open_item_func( } } break; + case Item_func::CASE_SEARCHED_FUNC: + case Item_func::CASE_SIMPLE_FUNC: +#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC + Item_func_case *item_func_case = (Item_func_case *) item_func; + if (str) + { + if (str->reserve(SPIDER_SQL_CASE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); + } + if (item_func_case->first_expr_num != -1) + { + if ((error_num = spider_db_print_item_type( + item_list[item_func_case->first_expr_num], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + for (roop_count = 0; roop_count < item_func_case->ncases; + roop_count += 2) + { + if (str) + { + if (str->reserve(SPIDER_SQL_WHEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[roop_count], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + if (str) + { + if (str->reserve(SPIDER_SQL_THEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[roop_count + 1], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (item_func_case->else_expr_num != -1) + { + if (str) + { + if (str->reserve(SPIDER_SQL_ELSE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[item_func_case->else_expr_num], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (str) + { + if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); + } + DBUG_RETURN(0); +#else + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); +#endif default: THD *thd = spider->trx->thd; SPIDER_SHARE *share = spider->share; From f053349797a1dca5206a3b8d5ff33353f45430d8 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 16 Jul 2021 22:46:50 -0700 Subject: [PATCH 47/98] MDEV-26135 Assertion failure when executing PS with a hanging recursive CTE The bug affected execution of queries with With clauses containing so-called hanging recursive CTEs in PREPARE mode. A CTE is hanging if it's not used in the query. Preparation of a prepared statement from a query with a hanging CTE caused a leak in the server and execution of this prepared statement led to an assert failure of the server built in the debug mode. This happened because the units specifying recursive CTEs erroneously were not cleaned up if those CTEs were hanging. The patch enforces cleanup of hanging recursive CTEs in the same way as other hanging CTEs. Approved by dmitry.shulga@mariadb.com --- mysql-test/r/cte_recursive.result | 27 +++++++++++++++++++++++++++ mysql-test/t/cte_recursive.test | 21 +++++++++++++++++++++ sql/sql_union.cc | 6 ++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/cte_recursive.result b/mysql-test/r/cte_recursive.result index 3e926525e99..a4d821ed1a0 100644 --- a/mysql-test/r/cte_recursive.result +++ b/mysql-test/r/cte_recursive.result @@ -4454,5 +4454,32 @@ deallocate prepare stmt; drop table folks; set big_tables=@save_big_tables; # +# MDEV-26135: execution of PS for query with hanging recursive CTE +# +create table t1 (a int); +insert into t1 values (5), (7); +create table t2 (b int); +insert into t2 values (3), (7), (1); +with recursive r as (select a from t1 union select a+1 from r where a < 10) +select * from t2; +b +3 +7 +1 +prepare stmt from "with recursive r as (select a from t1 union select a+1 from r where a < 10) +select * from t2"; +execute stmt; +b +3 +7 +1 +execute stmt; +b +3 +7 +1 +deallocate prepare stmt; +drop table t1,t2; +# # End of 10.2 tests # diff --git a/mysql-test/t/cte_recursive.test b/mysql-test/t/cte_recursive.test index 849e76b0436..49f9c1f4574 100644 --- a/mysql-test/t/cte_recursive.test +++ b/mysql-test/t/cte_recursive.test @@ -2819,6 +2819,27 @@ drop table folks; set big_tables=@save_big_tables; +--echo # +--echo # MDEV-26135: execution of PS for query with hanging recursive CTE +--echo # + +create table t1 (a int); +insert into t1 values (5), (7); +create table t2 (b int); +insert into t2 values (3), (7), (1); + +let $q= +with recursive r as (select a from t1 union select a+1 from r where a < 10) +select * from t2; + +eval $q; +eval prepare stmt from "$q"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +drop table t1,t2; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 7baedfb259c..e5648e6989b 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1382,7 +1382,8 @@ bool st_select_lex_unit::cleanup() { DBUG_RETURN(FALSE); } - if (with_element && with_element->is_recursive && union_result) + if (with_element && with_element->is_recursive && union_result && + with_element->rec_outer_references) { select_union_recursive *result= with_element->rec_result; if (++result->cleanup_count == with_element->rec_outer_references) @@ -1584,7 +1585,8 @@ bool st_select_lex::cleanup() for (SELECT_LEX_UNIT *lex_unit= first_inner_unit(); lex_unit ; lex_unit= lex_unit->next_unit()) { - if (lex_unit->with_element && lex_unit->with_element->is_recursive) + if (lex_unit->with_element && lex_unit->with_element->is_recursive && + lex_unit->with_element->rec_outer_references) continue; error= (bool) ((uint) error | (uint) lex_unit->cleanup()); } From 0151590d8fd2c6492eddf00a6b8dbbb69d378177 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Mon, 19 Jul 2021 17:50:09 +0200 Subject: [PATCH 48/98] Update libmariadb --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index 802ce584a26..e9f02c9ea6e 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 802ce584a26fdc0ba67fcf35e277bf3c7440956a +Subproject commit e9f02c9ea6e5a262005324fd0a3231ca39fa5c99 From 6638cf2e9ea49c21a504c9f1b8e6460887930441 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 19 Jul 2021 22:02:10 +0200 Subject: [PATCH 49/98] MDEV-20787 Script dgcov.pl does not work For every file.gcda file, gcov <7.x created file.cc.gcda.gcov. While gcov 7.x and 8.x create file.cc.gcov And sometimes otherfile.h.gcov or otherfile.ic.gcov, for included files. (gcov 9.x+ creates .json.gz files, see MDEV-26102) So, we use `gcov -l` that will create file.cc.gcda##file.cc.gcov, file.cc.gcda##otherfile.h.gcov, etc. And we search and parse all those file.cc.gcda*.gcov files. --- mysql-test/dgcov.pl | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/mysql-test/dgcov.pl b/mysql-test/dgcov.pl index fbc5540e697..734f5c6ed7d 100755 --- a/mysql-test/dgcov.pl +++ b/mysql-test/dgcov.pl @@ -155,32 +155,34 @@ END sub gcov_one_file { return unless /\.gcda$/; unless ($opt_skip_gcov) { - $cmd= "gcov -i '$_' 2>/dev/null >/dev/null"; + $cmd= "gcov -il '$_' 2>/dev/null >/dev/null"; print STDERR ++$file_no,"\r" if not $opt_verbose and -t STDERR; logv "Running: $cmd"; system($cmd)==0 or die "system($cmd): $? $!"; } # now, read the generated file - open FH, '<', "$_.gcov" or die "open(<$_.gcov): $!"; - my $fname; - while () { - chomp; - if (/^function:/) { - next; + for my $gcov_file (<$_*.gcov>) { + open FH, '<', "$gcov_file" or die "open(<$gcov_file): $!"; + my $fname; + while () { + chomp; + if (/^function:/) { + next; + } + if (/^file:/) { + $fname=realpath($'); + next; + } + next if /^lcount:\d+,-\d+/; # whatever that means + unless (/^lcount:(\d+),(\d+)/ and $fname) { + warn "unknown line '$_' in $gcov_file"; + next; + } + $cov{$fname}->{$1}+=$2; } - if (/^file:/) { - $fname=realpath($'); - next; - } - next if /^lcount:\d+,-\d+/; # whatever that means - unless (/^lcount:(\d+),(\d+)/ and $fname) { - warn "unknown line '$_' after running '$cmd'"; - next; - } - $cov{$fname}->{$1}+=$2; + close(FH); } - close(FH); } sub write_coverage { From ce2a2bff0f087257220ac372cc499cf037599a03 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 19 Jul 2021 22:06:42 +0200 Subject: [PATCH 50/98] MDEV-20787 Script dgcov.pl does not work When building with `make` gcov files use full path names, when building with `ninja` gcov files use paths relative to the source root in gcov_one_file() the current directory is somewhere under CMakeFiles/, so if a file exists in the specified location, this location must've been a full path name. --- mysql-test/dgcov.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/dgcov.pl b/mysql-test/dgcov.pl index 734f5c6ed7d..2c00c64d1ff 100755 --- a/mysql-test/dgcov.pl +++ b/mysql-test/dgcov.pl @@ -171,7 +171,7 @@ sub gcov_one_file { next; } if (/^file:/) { - $fname=realpath($'); + $fname=realpath(-f $' ? $' : $root.$'); next; } next if /^lcount:\d+,-\d+/; # whatever that means From 1cfcf32cd092b775cee0a108aad0b4ec70eb8318 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Tue, 20 Jul 2021 10:56:49 +0200 Subject: [PATCH 51/98] fix libmariadb compilation, on GCC. --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index e9f02c9ea6e..7d3d7c5ff4a 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit e9f02c9ea6e5a262005324fd0a3231ca39fa5c99 +Subproject commit 7d3d7c5ff4a9772cf6c73901757d6e39c6a20e99 From 5f8651ac238d8d6cd3e4a7e3090b4b529f990331 Mon Sep 17 00:00:00 2001 From: Jagdeep Sidhu Date: Tue, 13 Jul 2021 16:05:29 +0000 Subject: [PATCH 52/98] Fix switch case statement in trx_flush_log_if_needed_low() In commit 2e814d4702d71a04388386a9f591d14a35980bfe on MariaDB 10.2 the switch case statement in trx_flush_log_if_needed_low() regressed. Since 10.2 this code was refactored to have switches in descending order, so value of 3 for innodb_flush_log_at_trx_commit is behaving the same as value of 2, that is no FSYNC is being enforced during COMMIT phase. The switch should however not be empty and cases 2 and 3 should not have the identical contents. As per documentation, setting innodb_flush_log_at_trx_commit to 3 should do FSYNC to disk if innodb_flush_log_at_trx_commit is set to 3. This fixes the regression so that the switch statement again does what users expect the setting should do. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- storage/innobase/trx/trx0trx.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index e3df3f397a5..d1b35bd84a3 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1559,12 +1559,12 @@ trx_flush_log_if_needed_low( bool flush = srv_file_flush_method != SRV_NOSYNC; switch (srv_flush_log_at_trx_commit) { - case 3: case 2: /* Write the log but do not flush it to disk */ flush = false; /* fall through */ case 1: + case 3: /* Write the log and optionally flush it to disk */ log_write_up_to(lsn, flush); return; From 1918bdf32cdbd1f190cc4479f4076ee4a467f25d Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Mon, 21 Jun 2021 14:54:26 +0300 Subject: [PATCH 53/98] MDEV-25361 innochecksum must not report errors for freed pages Store and maintain xdes pages always. And doesn't verify checksums for freed pages. innochecksum can work only with the first space file of multiple ones. Tell about it and abort in case of not the first file. --- extra/innochecksum.cc | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 4dca6572434..beda56032b8 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -817,6 +817,16 @@ write_file( return(true); } +// checks using current xdes page whether the page is free +static bool page_is_free(const byte *xdes, page_size_t page_size, + size_t page_no) +{ + const byte *des= + xdes + XDES_ARR_OFFSET + + XDES_SIZE * ((page_no & (page_size.physical() - 1)) / FSP_EXTENT_SIZE); + return xdes_get_bit(des, XDES_FREE_BIT, page_no % FSP_EXTENT_SIZE); +} + /* Parse the page and collect/dump the information about page type @param [in] page buffer page @@ -908,11 +918,7 @@ parse_page( std::map::iterator it; it = index_ids.find(id); per_index_stats &index = (it->second); - const byte* des = xdes + XDES_ARR_OFFSET - + XDES_SIZE * ((page_no & (page_size.physical() - 1)) - / FSP_EXTENT_SIZE); - if (xdes_get_bit(des, XDES_FREE_BIT, - page_no % FSP_EXTENT_SIZE)) { + if (page_is_free(xdes, page_size, page_no)) { index.free_pages++; return; } @@ -1072,7 +1078,6 @@ parse_page( case FIL_PAGE_TYPE_FSP_HDR: page_type.n_fil_page_type_fsp_hdr++; - memcpy(xdes, page, page_size.physical()); if (page_type_dump) { fprintf(file, "#::%llu\t\t|\t\tFile Space " "Header\t\t|\t%s\n", cur_page_num, str); @@ -1081,7 +1086,6 @@ parse_page( case FIL_PAGE_TYPE_XDES: page_type.n_fil_page_type_xdes++; - memcpy(xdes, page, page_size.physical()); if (page_type_dump) { fprintf(file, "#::%llu\t\t|\t\tExtent descriptor " "page\t\t|\t%s\n", cur_page_num, str); @@ -1814,6 +1818,8 @@ int main( printf("page %llu ", cur_page_num); } + memcpy(xdes, buf, physical_page_size); + if (page_type_summary || page_type_dump) { parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); } @@ -1992,6 +1998,7 @@ first_non_zero: /* If no-check is enabled, skip the checksum verification.*/ if (!no_check + && !page_is_free(xdes, page_size, cur_page_num) && !skip_page && (exit_status = verify_checksum( buf, page_size, @@ -2014,6 +2021,10 @@ first_non_zero: printf("page %llu ", cur_page_num); } + if (page_get_page_no(buf) % physical_page_size == 0) { + memcpy(xdes, buf, physical_page_size); + } + if (page_type_summary || page_type_dump) { parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); } From 7da1cfb07a0dfec08b861688640bbbb7779549f6 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Fri, 25 Jun 2021 18:00:47 +0300 Subject: [PATCH 54/98] avoid searching std::map twice in innochecksum --- extra/innochecksum.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index beda56032b8..3eea1244429 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -912,12 +912,7 @@ parse_page( } /* update per-index statistics */ { - if (index_ids.count(id) == 0) { - index_ids[id] = per_index_stats(); - } - std::map::iterator it; - it = index_ids.find(id); - per_index_stats &index = (it->second); + per_index_stats &index = index_ids[id]; if (page_is_free(xdes, page_size, page_no)) { index.free_pages++; return; From 872422dcbbe3681a794935fb2cae422d9d5f4108 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 20 Jul 2021 00:07:31 -0700 Subject: [PATCH 55/98] MDEV-26025 Server crashes while executing query with CTE in PS/SP This bug appeared after the patch for bug MDEV-23886. Due to this bug execution of queries with CTEs used the same CTE at least twice via prepared statements or with stored procedures caused crashes of the server. It happened because the select created for any of not the first usage of a CTE erroneously was not included into all_selects_list. This patch corrects the patch applied to fix the bug MDEV-26108. Approved by Oleksandr Byelkin --- mysql-test/r/cte_nonrecursive.result | 42 ++++++++++++++++++++++++++++ mysql-test/t/cte_nonrecursive.test | 27 ++++++++++++++++++ sql/sql_cte.cc | 15 ++++++---- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result index 5cc5a2503e3..2504e55d77c 100644 --- a/mysql-test/r/cte_nonrecursive.result +++ b/mysql-test/r/cte_nonrecursive.result @@ -2044,4 +2044,46 @@ select a from t1 union select a+1 as a from cte_r r where a < 10 ) select * from cte_e; ERROR 42S02: Table 'test.cte_r' doesn't exist drop table t1; +# +# MDEV-26025: query with two usage of a CTE executing via PS /SP +# +create table t1 (a int, b int); +insert into t1 value (1,3), (3,2), (1,3), (4,1); +prepare stmt from "with +cte1 as ( select a,b from t1 where a = 1 AND b = 3 ), +cte2 as ( select a,b from cte1 ), +cte3 as ( select a,b from cte2 ) +select * from cte3, cte2"; +execute stmt; +a b a b +1 3 1 3 +1 3 1 3 +1 3 1 3 +1 3 1 3 +execute stmt; +a b a b +1 3 1 3 +1 3 1 3 +1 3 1 3 +1 3 1 3 +deallocate prepare stmt; +create procedure sp() with +cte1 as ( select a,b from t1 where a = 1 AND b = 3 ), +cte2 as ( select a,b from cte1 ), +cte3 as ( select a,b from cte2 ) +select * from cte3, cte2; +call sp(); +a b a b +1 3 1 3 +1 3 1 3 +1 3 1 3 +1 3 1 3 +call sp(); +a b a b +1 3 1 3 +1 3 1 3 +1 3 1 3 +1 3 1 3 +drop procedure sp; +drop table t1; # End of 10.2 tests diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test index 68dbc0cac19..c20a0dc1d39 100644 --- a/mysql-test/t/cte_nonrecursive.test +++ b/mysql-test/t/cte_nonrecursive.test @@ -1515,4 +1515,31 @@ with cte_e as ( drop table t1; +--echo # +--echo # MDEV-26025: query with two usage of a CTE executing via PS /SP +--echo # + +create table t1 (a int, b int); +insert into t1 value (1,3), (3,2), (1,3), (4,1); + +let $q= +with + cte1 as ( select a,b from t1 where a = 1 AND b = 3 ), + cte2 as ( select a,b from cte1 ), + cte3 as ( select a,b from cte2 ) +select * from cte3, cte2; + +eval prepare stmt from "$q"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +eval create procedure sp() $q; + +call sp(); +call sp(); + +drop procedure sp; +drop table t1; + --echo # End of 10.2 tests diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc index 702db8f96d9..b720eac2317 100644 --- a/sql/sql_cte.cc +++ b/sql/sql_cte.cc @@ -1012,6 +1012,7 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex, bool parse_status= false; st_select_lex *with_select; + st_select_lex *last_clone_select; char save_end= unparsed_spec.str[unparsed_spec.length]; unparsed_spec.str[unparsed_spec.length]= '\0'; @@ -1099,11 +1100,6 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex, lex->unit.include_down(with_table->select_lex); lex->unit.set_slave(with_select); lex->unit.cloned_from= spec; - old_lex->all_selects_list= - (st_select_lex*) (lex->all_selects_list-> - insert_chain_before( - (st_select_lex_node **) &(old_lex->all_selects_list), - with_select)); /* Now all references to the CTE defined outside of the cloned specification @@ -1119,6 +1115,15 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex, goto err; } + last_clone_select= lex->all_selects_list; + while (last_clone_select->next_select_in_list()) + last_clone_select= last_clone_select->next_select_in_list(); + old_lex->all_selects_list= + (st_select_lex*) (lex->all_selects_list-> + insert_chain_before( + (st_select_lex_node **) &(old_lex->all_selects_list), + last_clone_select)); + lex->sphead= NULL; // in order not to delete lex->sphead lex_end(lex); err: From 4c387945f0f8d5df84ae987c4a4bba7675815c72 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 9 Jul 2021 18:56:34 -0700 Subject: [PATCH 56/98] MDEV-25565 Crash on 2-nd execution of SP/PS for query calculating window functions from view A crash of the server happened when executing a stored procedure whose the only query calculated window functions over a mergeable view specified as a select from non-mergeable view. The crash could be reproduced if the window specifications of the window functions were identical and both contained PARTITION lists and ORDER BY lists. A crash also happened on the second execution of the prepared statement created for such query. If to use derived tables or CTE instead of views the problem still manifests itself crashing the server. When optimizing the window specifications of a window function the server can substitute the partition lists and the order lists for the corresponding lists from another window specification in the case when the lists are identical. This substitution is not permanent and should be rolled back before the second execution. It was not done and this ultimately led to a crash when resolving the column names at the second execution of SP/PS. --- mysql-test/r/win.result | 287 ++++++++++++++++++++++++++++++++++++++++ mysql-test/t/win.test | 147 ++++++++++++++++++++ sql/sql_union.cc | 26 ++++ sql/sql_window.cc | 12 ++ sql/sql_window.h | 5 +- 5 files changed, 476 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result index 8a31dcc0634..bc017ea70a3 100644 --- a/mysql-test/r/win.result +++ b/mysql-test/r/win.result @@ -3911,5 +3911,292 @@ sum(i) over () IN ( SELECT 1 FROM t1 a) 0 DROP TABLE t1; # +# MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE +# returning the result of calculation of 2 window +# functions that use the same window specification +# +create table t1 (a int); +insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5); +create view v2 as select a from t1 group by a; +create view v1 as select * from v2; +create procedure sp1() select v1.a, +sum(v1.a) over (partition by v1.a order by v1.a) as k, +avg(v1.a) over (partition by v1.a order by v1.a) as m +from v1; +call sp1(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp1(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select v1.a, +sum(v1.a) over (partition by v1.a order by v1.a) as k, +avg(v1.a) over (partition by v1.a order by v1.a) as m +from v1"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp2() select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from (select * from v2) as dt1 +) as dt; +call sp2(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp2(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from (select * from v2) as dt1 +) as dt"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp3() select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from ( select * from (select * from t1 group by a) as dt2 ) as dt1 +) as dt; +call sp3(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp3(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from ( select * from (select * from t1 group by a) as dt2 ) as dt1 +) as dt"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp4() with cte1 as (select * from (select * from t1 group by a) as dt2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp4(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp4(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with cte1 as (select * from (select * from t1 group by a) as dt2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp5() with cte1 as (select * from v2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp5(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp5(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with cte1 as (select * from v2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp6() with +cte1 as (with cte2 as (select * from t1 group by a) select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp6(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp6(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with +cte1 as (with cte2 as (select * from t1 group by a) select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp7() with +cte2 as (select * from v1), +cte1 as (select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp7(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp7(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with +cte2 as (select * from v1), +cte1 as (select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +drop procedure sp1; +drop procedure sp2; +drop procedure sp3; +drop procedure sp4; +drop procedure sp5; +drop procedure sp6; +drop procedure sp7; +drop view v1,v2; +drop table t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test index c07a81f17da..72e789dff3f 100644 --- a/mysql-test/t/win.test +++ b/mysql-test/t/win.test @@ -2556,6 +2556,153 @@ INSERT INTO t1 VALUES (1),(2),(3); SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE +--echo # returning the result of calculation of 2 window +--echo # functions that use the same window specification +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5); + +create view v2 as select a from t1 group by a; +create view v1 as select * from v2; + +let $q1= +select v1.a, + sum(v1.a) over (partition by v1.a order by v1.a) as k, + avg(v1.a) over (partition by v1.a order by v1.a) as m +from v1; + +eval create procedure sp1() $q1; +call sp1(); +call sp1(); + +eval prepare stmt from "$q1"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q2= +select * from + ( select dt1.a, + sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, + avg(dt1.a) over (partition by dt1.a order by dt1.a) as m + from (select * from v2) as dt1 + ) as dt; + +eval create procedure sp2() $q2; +call sp2(); +call sp2(); + +eval prepare stmt from "$q2"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q3= +select * from + ( select dt1.a, + sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, + avg(dt1.a) over (partition by dt1.a order by dt1.a) as m + from ( select * from (select * from t1 group by a) as dt2 ) as dt1 + ) as dt; + +eval create procedure sp3() $q3; +call sp3(); +call sp3(); + +eval prepare stmt from "$q3"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q4= +with cte1 as (select * from (select * from t1 group by a) as dt2), + cte as + ( select cte1.a, + sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, + avg(cte1.a) over (partition by cte1.a order by cte1.a) as m + from cte1 ) +select * from cte; + +eval create procedure sp4() $q4; +call sp4(); +call sp4(); + +eval prepare stmt from "$q4"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q5= +with cte1 as (select * from v2), + cte as + ( select cte1.a, + sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, + avg(cte1.a) over (partition by cte1.a order by cte1.a) as m + from cte1 ) +select * from cte; + +eval create procedure sp5() $q5; +call sp5(); +call sp5(); + +eval prepare stmt from "$q5"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q6= +with +cte1 as (with cte2 as (select * from t1 group by a) select * from cte2), + cte as + ( select cte1.a, + sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, + avg(cte1.a) over (partition by cte1.a order by cte1.a) as m + from cte1 ) +select * from cte; + +eval create procedure sp6() $q6; +call sp6(); +call sp6(); + +eval prepare stmt from "$q6"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +let $q7= +with + cte2 as (select * from v1), + cte1 as (select * from cte2), + cte as + ( select cte1.a, + sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, + avg(cte1.a) over (partition by cte1.a order by cte1.a) as m + from cte1 ) +select * from cte; + +eval create procedure sp7() $q7; +call sp7(); +call sp7(); + +eval prepare stmt from "$q7"; +execute stmt; +execute stmt; +deallocate prepare stmt; + + +drop procedure sp1; +drop procedure sp2; +drop procedure sp3; +drop procedure sp4; +drop procedure sp5; +drop procedure sp6; +drop procedure sp7; +drop view v1,v2; +drop table t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/sql_union.cc b/sql/sql_union.cc index e5648e6989b..8f7aca2a8ed 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -30,6 +30,7 @@ #include "filesort.h" // filesort_free_buffers #include "sql_view.h" #include "sql_cte.h" +#include "item_windowfunc.h" bool mysql_union(THD *thd, LEX *lex, select_result *result, SELECT_LEX_UNIT *unit, ulong setup_tables_done_option) @@ -1551,6 +1552,29 @@ static void cleanup_order(ORDER *order) } +static void cleanup_window_funcs(List &win_funcs) +{ + List_iterator_fast it(win_funcs); + Item_window_func *win_func; + while ((win_func= it++)) + { + Window_spec *win_spec= win_func->window_spec; + if (!win_spec) + continue; + if (win_spec->save_partition_list) + { + win_spec->partition_list= win_spec->save_partition_list; + win_spec->save_partition_list= NULL; + } + if (win_spec->save_order_list) + { + win_spec->order_list= win_spec->save_order_list; + win_spec->save_order_list= NULL; + } + } +} + + bool st_select_lex::cleanup() { bool error= FALSE; @@ -1559,6 +1583,8 @@ bool st_select_lex::cleanup() cleanup_order(order_list.first); cleanup_order(group_list.first); + cleanup_window_funcs(window_funcs); + if (join) { List_iterator ti(leaf_tables); diff --git a/sql/sql_window.cc b/sql/sql_window.cc index 612c6e692fe..3ef751bc5b9 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -479,9 +479,15 @@ int compare_window_funcs_by_window_specs(Item_window_func *win_func1, Let's use only one of the lists. */ if (!win_spec1->name() && win_spec2->name()) + { + win_spec1->save_partition_list= win_spec1->partition_list; win_spec1->partition_list= win_spec2->partition_list; + } else + { + win_spec2->save_partition_list= win_spec2->partition_list; win_spec2->partition_list= win_spec1->partition_list; + } cmp= compare_order_lists(win_spec1->order_list, win_spec2->order_list); @@ -494,9 +500,15 @@ int compare_window_funcs_by_window_specs(Item_window_func *win_func1, Let's use only one of the lists. */ if (!win_spec1->name() && win_spec2->name()) + { + win_spec1->save_order_list= win_spec2->order_list; win_spec1->order_list= win_spec2->order_list; + } else + { + win_spec1->save_order_list= win_spec2->order_list; win_spec2->order_list= win_spec1->order_list; + } cmp= compare_window_frames(win_spec1->window_frame, win_spec2->window_frame); diff --git a/sql/sql_window.h b/sql/sql_window.h index e0c1563e5bb..417d0bca12c 100644 --- a/sql/sql_window.h +++ b/sql/sql_window.h @@ -99,8 +99,10 @@ class Window_spec : public Sql_alloc LEX_STRING *window_ref; SQL_I_List *partition_list; + SQL_I_List *save_partition_list; SQL_I_List *order_list; + SQL_I_List *save_order_list; Window_frame *window_frame; @@ -111,7 +113,8 @@ class Window_spec : public Sql_alloc SQL_I_List *ord_list, Window_frame *win_frame) : window_names_are_checked(false), window_ref(win_ref), - partition_list(part_list), order_list(ord_list), + partition_list(part_list), save_partition_list(NULL), + order_list(ord_list), save_order_list(NULL), window_frame(win_frame), referenced_win_spec(NULL) {} virtual char *name() { return NULL; } From 2b017367c785af003fd4d1826c278f6b9dab8084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicen=C8=9Biu=20Ciorbaru?= Date: Tue, 13 Jul 2021 16:18:53 +0300 Subject: [PATCH 57/98] Delete unused MYSQL_CHECK_{LZ4|LZO}_STATIC macros --- storage/innobase/lz4.cmake | 20 -------------------- storage/innobase/lzo.cmake | 16 ---------------- 2 files changed, 36 deletions(-) diff --git a/storage/innobase/lz4.cmake b/storage/innobase/lz4.cmake index e901378eafc..2f2f0441774 100644 --- a/storage/innobase/lz4.cmake +++ b/storage/innobase/lz4.cmake @@ -34,23 +34,3 @@ MACRO (MYSQL_CHECK_LZ4) ENDIF() ENDIF() ENDMACRO() - -MACRO (MYSQL_CHECK_LZ4_STATIC) - IF (WITH_INNODB_LZ4 STREQUAL "ON" OR WITH_INNODB_LZ4 STREQUAL "AUTO") - CHECK_INCLUDE_FILES(lz4.h HAVE_LZ4_H) - CHECK_LIBRARY_EXISTS(liblz4.a LZ4_compress_limitedOutput "" HAVE_LZ4_LIB) - CHECK_LIBRARY_EXISTS(liblz3.a LZ4_compress_default "" HAVE_LZ4_COMPRESS_DEFAULT) - - IF(HAVE_LZ4_LIB AND HAVE_LZ4_H) - ADD_DEFINITIONS(-DHAVE_LZ4=1) - IF (HAVE_LZ4_COMPRESS_DEFAULT) - ADD_DEFINITIONS(-DHAVE_LZ4_COMPRESS_DEFAULT=1) - ENDIF() - LINK_LIBRARIES(liblz4.a) - ELSE() - IF (WITH_INNODB_LZ4 STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required lz4 library is not found") - ENDIF() - ENDIF() - ENDIF() -ENDMACRO() diff --git a/storage/innobase/lzo.cmake b/storage/innobase/lzo.cmake index 236eac2d1e5..ef6cc52c35d 100644 --- a/storage/innobase/lzo.cmake +++ b/storage/innobase/lzo.cmake @@ -15,22 +15,6 @@ SET(WITH_INNODB_LZO AUTO CACHE STRING "Build with lzo. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'") -MACRO (MYSQL_CHECK_LZO_STATIC) - IF (WITH_INNODB_LZO STREQUAL "ON" OR WITH_INNODB_LZO STREQUAL "AUTO") - CHECK_INCLUDE_FILES(lzo/lzo1x.h HAVE_LZO_H) - CHECK_LIBRARY_EXISTS(liblzo2.a lzo1x_1_compress "" HAVE_LZO_LIB) - - IF(HAVE_LZO_LIB AND HAVE_LZO_H) - ADD_DEFINITIONS(-DHAVE_LZO=1) - LINK_LIBRARIES(liblzo2.a) - ELSE() - IF (WITH_INNODB_LZO STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required lzo library is not found") - ENDIF() - ENDIF() - ENDIF() -ENDMACRO() - MACRO (MYSQL_CHECK_LZO) IF (WITH_INNODB_LZO STREQUAL "ON" OR WITH_INNODB_LZO STREQUAL "AUTO") CHECK_INCLUDE_FILES(lzo/lzo1x.h HAVE_LZO_H) From 751ebe44fda4deb715fc2235548517c287f2a559 Mon Sep 17 00:00:00 2001 From: Heinz Wiesinger Date: Wed, 9 Aug 2017 21:39:18 +0200 Subject: [PATCH 58/98] Add feature summary at the end of cmake. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This gives a short overview over found/missing dependencies as well as enabled/disabled features. Initial author Heinz Wiesinger Additions by VicenÈ›iu Ciorbaru * Report all plugins enabled via MYSQL_ADD_PLUGIN * Simplify code. Eliminate duplication by making use of WITH_xxx variable values to set feature "ON" / "OFF" state. Reviewed by: wlad@mariadb.com (code details) serg@mariadb.com (the idea) --- CMakeLists.txt | 17 ++++++++++++++--- cmake/jemalloc.cmake | 1 + cmake/numa.cmake | 1 + cmake/plugin.cmake | 16 +++++++++++++--- cmake/readline.cmake | 2 +- cmake/ssl.cmake | 1 + cmake/systemd.cmake | 1 + cmake/wsrep.cmake | 3 +++ configure.cmake | 1 + extra/mariabackup/CMakeLists.txt | 1 + plugin/auth_gssapi/CMakeLists.txt | 1 + plugin/aws_key_management/CMakeLists.txt | 8 +++++++- plugin/win_auth_client/CMakeLists.txt | 2 +- storage/connect/CMakeLists.txt | 23 ++++++++++++++++++++++- storage/innobase/bzip2.cmake | 5 ++++- storage/innobase/innodb.cmake | 13 +++++++++++-- storage/innobase/lz4.cmake | 6 ++++-- storage/innobase/lzma.cmake | 4 +++- storage/innobase/lzo.cmake | 4 +++- storage/innobase/snappy.cmake | 4 +++- storage/oqgraph/CMakeLists.txt | 8 ++++++++ storage/rocksdb/CMakeLists.txt | 1 + storage/rocksdb/build_rocksdb.cmake | 9 +++++++++ 23 files changed, 114 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45efa38a9f7..0c80ff1bfd7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,7 @@ IF (NOT CPACK_GENERATOR) ENDIF(WIN32) ENDIF(NOT CPACK_GENERATOR) +INCLUDE(FeatureSummary) INCLUDE(misc) INCLUDE(mysql_version) INCLUDE(cpack_source_ignore_files) @@ -418,11 +419,14 @@ ADD_SUBDIRECTORY(sql/share) IF(NOT WITHOUT_SERVER) ADD_SUBDIRECTORY(tests) ADD_SUBDIRECTORY(sql) - OPTION (WITH_EMBEDDED_SERVER "Compile MySQL with embedded server" OFF) + OPTION (WITH_EMBEDDED_SERVER "Compile MariaDB with embedded server" OFF) IF(WITH_EMBEDDED_SERVER) - ADD_SUBDIRECTORY(libmysqld) - ADD_SUBDIRECTORY(libmysqld/examples) + ADD_SUBDIRECTORY(libmysqld) + ADD_SUBDIRECTORY(libmysqld/examples) ENDIF(WITH_EMBEDDED_SERVER) + IF(NOT WIN32) + ADD_FEATURE_INFO(EMBEDDED_SERVER WITH_EMBEDDED_SERVER "Embedded MariaDB Server Library") + ENDIF() IF(WITH_WSREP) ADD_SUBDIRECTORY(wsrep) @@ -507,6 +511,13 @@ IF(WIN32 AND SIGNCODE) INSTALL(SCRIPT ${PROJECT_BINARY_DIR}/sign.cmake) ENDIF() +FEATURE_SUMMARY(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES VAR MARIADB_FEATURE_SUMMARY) + +OPTION(FEATURE_SUMMARY "Print feature summary at the end of configure step" ON) +IF (FEATURE_SUMMARY) + MESSAGE_ONCE(SUMMARY "${MARIADB_FEATURE_SUMMARY}") +ENDIF() + IF(NON_DISTRIBUTABLE_WARNING) MESSAGE(WARNING " You have linked MariaDB with ${NON_DISTRIBUTABLE_WARNING} libraries! You may not distribute the resulting binary. If you do, you will put yourself into a legal problem with the Free Software Foundation.") diff --git a/cmake/jemalloc.cmake b/cmake/jemalloc.cmake index 5ad636d0e6c..08ab2877c89 100644 --- a/cmake/jemalloc.cmake +++ b/cmake/jemalloc.cmake @@ -37,5 +37,6 @@ MACRO (CHECK_JEMALLOC) IF (NOT LIBJEMALLOC AND NOT WITH_JEMALLOC STREQUAL "auto") MESSAGE(FATAL_ERROR "jemalloc is not found") ENDIF() + ADD_FEATURE_INFO(JEMALLOC LIBJEMALLOC "Use the JeMalloc memory allocator") ENDIF() ENDMACRO() diff --git a/cmake/numa.cmake b/cmake/numa.cmake index 4bace0ee7f4..a7b0c0a3392 100644 --- a/cmake/numa.cmake +++ b/cmake/numa.cmake @@ -31,6 +31,7 @@ MACRO (MYSQL_CHECK_NUMA) ENDIF() ENDIF() + ADD_FEATURE_INFO(NUMA HAVE_LIBNUMA "NUMA memory allocation policy") IF(WITH_NUMA AND NOT HAVE_LIBNUMA) # Forget it in cache, abort the build. UNSET(WITH_NUMA CACHE) diff --git a/cmake/plugin.cmake b/cmake/plugin.cmake index 68eb715eed9..7a8eb97891e 100644 --- a/cmake/plugin.cmake +++ b/cmake/plugin.cmake @@ -49,7 +49,7 @@ MACRO(MYSQL_ADD_PLUGIN) LIST(REMOVE_AT SOURCES 0) STRING(TOUPPER ${plugin} plugin) STRING(TOLOWER ${plugin} target) - + IF (ARG_MANDATORY) UNSET(PLUGIN_${plugin} CACHE) SET(PLUGIN_${plugin} "YES") @@ -110,11 +110,11 @@ MACRO(MYSQL_ADD_PLUGIN) SET(with_var "WITH_${plugin}") ENDIF() UNSET(${with_var} CACHE) - + IF(NOT ARG_DEPENDENCIES) SET(ARG_DEPENDENCIES) ENDIF() - + IF(NOT ARG_MODULE_OUTPUT_NAME) IF(ARG_STORAGE_ENGINE) SET(ARG_MODULE_OUTPUT_NAME "ha_${target}") @@ -257,6 +257,16 @@ MACRO(MYSQL_ADD_PLUGIN) INSTALL_MYSQL_TEST("${CMAKE_CURRENT_SOURCE_DIR}/mysql-test/" "plugin/${subpath}") ENDIF() + GET_TARGET_PROPERTY(plugin_type ${target} TYPE) + STRING(REGEX REPLACE "_LIBRARY$" "" plugin_type ${plugin_type}) + STRING(REGEX REPLACE "^NO$" "" plugin_type ${plugin_type}) + IF(ARG_STORAGE_ENGINE) + ADD_FEATURE_INFO(${plugin} PLUGIN_${plugin} "Storage Engine ${plugin_type}") + ELSEIF(ARG_CLIENT) + ADD_FEATURE_INFO(${plugin} PLUGIN_${plugin} "Client plugin ${plugin_type}") + ELSE() + ADD_FEATURE_INFO(${plugin} PLUGIN_${plugin} "Server plugin ${plugin_type}") + ENDIF() ENDIF(NOT WITHOUT_SERVER OR ARG_CLIENT) ENDMACRO() diff --git a/cmake/readline.cmake b/cmake/readline.cmake index f676aeb7838..c423a8a830f 100644 --- a/cmake/readline.cmake +++ b/cmake/readline.cmake @@ -52,7 +52,7 @@ MACRO (MYSQL_CHECK_MULTIBYTE) ENDMACRO() MACRO (FIND_CURSES) - FIND_PACKAGE(Curses) + FIND_PACKAGE(Curses REQUIRED) MARK_AS_ADVANCED(CURSES_CURSES_H_PATH CURSES_FORM_LIBRARY CURSES_HAVE_CURSES_H) IF(NOT CURSES_FOUND) SET(ERRORMSG "Curses library not found. Please install appropriate package, diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake index d87d2c8fbd0..1b238826311 100644 --- a/cmake/ssl.cmake +++ b/cmake/ssl.cmake @@ -126,6 +126,7 @@ MACRO (MYSQL_CHECK_SSL) ENDIF() ENDIF() FIND_PACKAGE(OpenSSL) + SET_PACKAGE_PROPERTIES(OpenSSL PROPERTIES TYPE RECOMMENDED) IF(OPENSSL_FOUND) SET(OPENSSL_LIBRARY ${OPENSSL_SSL_LIBRARY}) SET(SSL_SOURCES "") diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake index 8a5695a246c..df10d6396df 100644 --- a/cmake/systemd.cmake +++ b/cmake/systemd.cmake @@ -63,5 +63,6 @@ MACRO(CHECK_SYSTEMD) ELSEIF(NOT WITH_SYSTEMD STREQUAL "no") MESSAGE(FATAL_ERROR "Invalid value for WITH_SYSTEMD. Must be 'yes', 'no', or 'auto'.") ENDIF() + ADD_FEATURE_INFO(SYSTEMD LIBSYSTEMD "Systemd scripts and notification support") ENDIF() ENDMACRO() diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index a1e8fc39fca..990198ecf72 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -41,3 +41,6 @@ SET(WSREP_PROC_INFO ${WITH_WSREP}) IF(WITH_WSREP) SET(WSREP_PATCH_VERSION "wsrep_${WSREP_VERSION}") ENDIF() +IF (NOT WIN32) + ADD_FEATURE_INFO(WSREP WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication library)") +ENDIF() diff --git a/configure.cmake b/configure.cmake index 1aa0827a503..942d5780ed9 100644 --- a/configure.cmake +++ b/configure.cmake @@ -161,6 +161,7 @@ IF(UNIX) SET(LIBWRAP "wrap") ENDIF() ENDIF() + ADD_FEATURE_INFO(LIBWRAP HAVE_LIBWRAP "Support for tcp wrappers") ENDIF() # diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt index fd3ebd68d64..409dcd7efde 100644 --- a/extra/mariabackup/CMakeLists.txt +++ b/extra/mariabackup/CMakeLists.txt @@ -15,6 +15,7 @@ OPTION(WITH_MARIABACKUP "Include mariabackup" ON) +ADD_FEATURE_INFO(MARIABACKUP WITH_MARIABACKUP "MariaDB Backup Utility") IF(NOT WITH_MARIABACKUP) RETURN() ENDIF() diff --git a/plugin/auth_gssapi/CMakeLists.txt b/plugin/auth_gssapi/CMakeLists.txt index 4d3718dd471..11063df0884 100644 --- a/plugin/auth_gssapi/CMakeLists.txt +++ b/plugin/auth_gssapi/CMakeLists.txt @@ -11,6 +11,7 @@ IF(USE_SSPI) ELSE() SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) FIND_PACKAGE(GSSAPI) + SET_PACKAGE_PROPERTIES(GSSAPI PROPERTIES TYPE OPTIONAL) IF(GSSAPI_FOUND) INCLUDE_DIRECTORIES(${GSSAPI_INCS}) ADD_DEFINITIONS(-DPLUGIN_GSSAPI) diff --git a/plugin/aws_key_management/CMakeLists.txt b/plugin/aws_key_management/CMakeLists.txt index e9e1b49d5f2..5389ad34bbd 100644 --- a/plugin/aws_key_management/CMakeLists.txt +++ b/plugin/aws_key_management/CMakeLists.txt @@ -13,6 +13,7 @@ # or if plugin is explicitly requested to build. Then bail out. MACRO(SKIP_AWS_PLUGIN msg) MESSAGE_ONCE(SKIP_AWS_PLUGIN "Skip aws_key_management - ${msg}") + ADD_FEATURE_INFO(AWS_KEY_MANAGEMENT "OFF" "AWS Encryption Key Management Plugin") RETURN() ENDMACRO() SET(CMAKE_CXX_STANDARD 11) @@ -76,6 +77,7 @@ ELSE() INCLUDE(ExternalProject) IF(UNIX) FIND_PACKAGE(CURL) + SET_PACKAGE_PROPERTIES(CURL PROPERTIES TYPE REQUIRED) IF(NOT CURL_FOUND) SKIP_AWS_PLUGIN("AWS C++ SDK requires libcurl development package") ENDIF() @@ -86,10 +88,12 @@ ELSE() ENDIF() IF(NOT APPLE) FIND_LIBRARY(UUID_LIBRARIES uuid) + SET_PACKAGE_PROPERTIES(UUID_LIBRARIES PROPERTIES TYPE REQUIRED) IF(NOT UUID_LIBRARIES) SKIP_AWS_PLUGIN("AWS C++ SDK requires uuid development package") ENDIF() FIND_PACKAGE(OpenSSL) + SET_PACKAGE_PROPERTIES(OpenSSL PROPERTIES TYPE REQUIRED) IF(NOT OPENSSL_FOUND) SKIP_AWS_PLUGIN("AWS C++ SDK requires openssl development package") ENDIF() @@ -170,5 +174,7 @@ MYSQL_ADD_PLUGIN(aws_key_management aws_key_management_plugin.cc COMPONENT aws-key-management) IF (TARGET aws_key_management) - SET(NON_DISTRIBUTABLE_WARNING "Apache 2.0" PARENT_SCOPE) + SET(NON_DISTRIBUTABLE_WARNING "Apache 2.0" PARENT_SCOPE) ENDIF() + +ADD_FEATURE_INFO(AWS_KEY_MANAGEMENT "ON" "AWS Encryption Key Management Plugin") diff --git a/plugin/win_auth_client/CMakeLists.txt b/plugin/win_auth_client/CMakeLists.txt index 435c5b8966a..c0932b04e45 100644 --- a/plugin/win_auth_client/CMakeLists.txt +++ b/plugin/win_auth_client/CMakeLists.txt @@ -29,7 +29,7 @@ IF(WIN32) MYSQL_ADD_PLUGIN(authentication_windows_client ${PLUGIN_SOURCES} ${HEADERS} LINK_LIBRARIES Secur32 - MODULE_ONLY COMPONENT ClientPlugins) + MODULE_ONLY COMPONENT ClientPlugins CLIENT) #IF(MSVC) # INSTALL_DEBUG_TARGET(auth_win_client DESTINATION ${INSTALL_LIBDIR}/debug) diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index d3632b689fe..f991726634d 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -108,6 +108,7 @@ IF(CONNECT_WITH_VCT) SET(CONNECT_SOURCES ${CONNECT_SOURCES} filamvct.cpp tabvct.cpp filamvct.h tabvct.h) add_definitions(-DVCT_SUPPORT) ENDIF(CONNECT_WITH_VCT) +ADD_FEATURE_INFO(CONNECT_VCT CONNECT_WITH_VCT "Support for VCT in the CONNECT storage engine") # @@ -133,6 +134,7 @@ IF(CONNECT_WITH_LIBXML2) D:/libxml/lib) ENDIF(WIN32) FIND_PACKAGE(LibXml2) + SET_PACKAGE_PROPERTIES(LibXml2 PROPERTIES TYPE OPTIONAL) IF (LIBXML2_FOUND) INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR}) SET(XML_LIBRARY ${LIBXML2_LIBRARIES}) @@ -140,6 +142,8 @@ IF(CONNECT_WITH_LIBXML2) add_definitions(-DLIBXML2_SUPPORT) ENDIF(LIBXML2_FOUND) ENDIF(CONNECT_WITH_LIBXML2) +ADD_FEATURE_INFO(CONNECT_LIBXML2 CONNECT_WITH_LIBXML2 + "Support for LIBXML2 in the CONNECT storage engine") IF(WIN32) @@ -153,6 +157,8 @@ IF(WIN32) SET(MSXML_FOUND 1) SET(CONNECT_SOURCES ${CONNECT_SOURCES} domdoc.cpp domdoc.h) ENDIF(CONNECT_WITH_MSXML) + ADD_FEATURE_INFO(CONNECT_MSXML CONNECT_WITH_MSXML + "Support for MSXML in the CONNECT storage engine") ENDIF(WIN32) IF(LIBXML2_FOUND OR MSXML_FOUND) @@ -253,6 +259,7 @@ int main() { tabodbc.cpp tabodbc.h odbccat.h odbconn.cpp odbconn.h) ENDIF(UNIX) ENDIF(CONNECT_WITH_ODBC) +ADD_FEATURE_INFO(CONNECT_ODBC ODBC_LIBRARY "Support for ODBC in the CONNECT storage engine") # # JDBC with MongoDB Java Driver included but disabled if without MONGO @@ -262,7 +269,9 @@ OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) FIND_PACKAGE(Java 1.6) + SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL) FIND_PACKAGE(JNI) + SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL) IF (JAVA_FOUND AND JNI_FOUND) INCLUDE(UseJava) INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) @@ -278,6 +287,7 @@ IF(CONNECT_WITH_JDBC) Mongo2Interface.java Mongo3Interface.java mysql-test/connect/std_data/JavaWrappers.jar) add_definitions(-DJAVA_SUPPORT) + ADD_FEATURE_INFO(CONNECT_JDBC "ON" "Support for JDBC in the CONNECT storage engine") IF(CONNECT_WITH_MONGO) SET(CONNECT_SOURCES ${CONNECT_SOURCES} mysql-test/connect/std_data/Mongo2.jar @@ -286,7 +296,10 @@ IF(CONNECT_WITH_JDBC) ENDIF() ELSE() SET(JDBC_LIBRARY "") + ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") ENDIF() +ELSE(CONNECT_WITH_JDBC) + ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") ENDIF(CONNECT_WITH_JDBC) # @@ -300,6 +313,7 @@ IF(CONNECT_WITH_ZIP) filamzip.h tabzip.h ioapi.h unzip.h zip.h) add_definitions(-DZIP_SUPPORT -DNOCRYPT) ENDIF(CONNECT_WITH_ZIP) +ADD_FEATURE_INFO(CONNECT_ZIP CONNECT_WITH_ZIP "Support for ZIP in the CONNECT storage engine") # # MONGO C Driver @@ -316,6 +330,7 @@ IF(CONNECT_WITH_MONGO) D:/mongo-c-driver/lib) ENDIF(WIN32) FIND_PACKAGE(libmongoc-1.0 1.7 QUIET) + SET_PACKAGE_PROPERTIES(libmongoc PROPERTIES TYPE OPTIONAL) IF (libmongoc-1.0_FOUND) INCLUDE_DIRECTORIES(${MONGOC_INCLUDE_DIRS}) SET(MONGOC_LIBRARY ${MONGOC_LIBRARIES}) @@ -323,14 +338,18 @@ IF(CONNECT_WITH_MONGO) cmgoconn.cpp cmgfam.cpp tabcmg.cpp cmgoconn.h cmgfam.h tabcmg.h) add_definitions(-DCMGO_SUPPORT) + ADD_FEATURE_INFO(CONNECT_MONGODB "ON" "Support for MongoDB in the CONNECT storage engine") IF (NOT JAVA_FOUND AND JNI_FOUND) SET(CONNECT_SOURCES ${CONNECT_SOURCES} mongo.cpp mongo.h) add_definitions(-DMONGO_SUPPORT) ENDIF (NOT JAVA_FOUND AND JNI_FOUND) + ELSE(libmongoc-1.0_FOUND) + ADD_FEATURE_INFO(CONNECT_MONGODB "OFF" "Support for MongoDB in the CONNECT storage engine") ENDIF(libmongoc-1.0_FOUND) +ELSE(CONNECT_WITH_MONGO) + ADD_FEATURE_INFO(CONNECT_MONGODB "OFF" "Support for MongoDB in the CONNECT storage engine") ENDIF(CONNECT_WITH_MONGO) - # # REST # @@ -362,6 +381,7 @@ IF(CONNECT_WITH_REST) ## MESSAGE(STATUS "=====> cpprestsdk package not found") # ENDIF (cpprestsdk_FOUND) ENDIF(CONNECT_WITH_REST) +ADD_FEATURE_INFO(CONNECT_REST CONNECT_WITH_REST "Support for REST API in the CONNECT storage engine") # # XMAP @@ -372,6 +392,7 @@ OPTION(CONNECT_WITH_XMAP "Compile CONNECT storage engine with index file mapping IF(CONNECT_WITH_XMAP) add_definitions(-DXMAP) ENDIF(CONNECT_WITH_XMAP) +ADD_FEATURE_INFO(CONNECT_XMAP CONNECT_WITH_XMAP "Support for index file mapping in the CONNECT storage engine") # # Plugin definition diff --git a/storage/innobase/bzip2.cmake b/storage/innobase/bzip2.cmake index 26fd703120e..91dd2bf0fcd 100644 --- a/storage/innobase/bzip2.cmake +++ b/storage/innobase/bzip2.cmake @@ -22,12 +22,15 @@ MACRO (MYSQL_CHECK_BZIP2) CHECK_LIBRARY_EXISTS(bz2 BZ2_bzBuffToBuffDecompress "" HAVE_BZLIB2_DECOMPRESS) IF (HAVE_BZLIB2_COMPRESS AND HAVE_BZLIB2_DECOMPRESS AND HAVE_BZLIB2_H) + SET(HAVE_INNODB_BZLIB2 TRUE) ADD_DEFINITIONS(-DHAVE_BZIP2=1) LINK_LIBRARIES(bz2) ELSE() IF (WITH_INNODB_BZIP2 STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required bzip2 library is not found") + MESSAGE(FATAL_ERROR "Required bzip2 library is not found") ENDIF() ENDIF() ENDIF() + ADD_FEATURE_INFO(INNODB_BZIP2 HAVE_INNODB_BZLIB2 + "BZIP2 compression in the InnoDB storage engine") ENDMACRO() diff --git a/storage/innobase/innodb.cmake b/storage/innobase/innodb.cmake index 523176b4530..e2e74951f67 100644 --- a/storage/innobase/innodb.cmake +++ b/storage/innobase/innodb.cmake @@ -86,6 +86,7 @@ MARK_AS_ADVANCED(INNODB_COMPILER_HINTS) IF(INNODB_COMPILER_HINTS) ADD_DEFINITIONS("-DCOMPILER_HINTS") ENDIF() +ADD_FEATURE_INFO(INNODB_COMPILER_HINTS INNODB_COMPILER_HINTS "InnoDB compiled with compiler hints") SET(MUTEXTYPE "event" CACHE STRING "Mutex type: event, sys or futex") @@ -121,15 +122,20 @@ IF(WITH_INNODB_AHI) ADD_DEFINITIONS(-DBTR_CUR_HASH_ADAPT -DBTR_CUR_ADAPT) IF(NOT WITH_INNODB_ROOT_GUESS) MESSAGE(WARNING "WITH_INNODB_AHI implies WITH_INNODB_ROOT_GUESS") + SET(WITH_INNODB_ROOT_GUESS ON) ENDIF() ELSEIF(WITH_INNODB_ROOT_GUESS) ADD_DEFINITIONS(-DBTR_CUR_ADAPT) ENDIF() +ADD_FEATURE_INFO(INNODB_AHI WITH_INNODB_AHI "InnoDB Adaptive Hash Index") +ADD_FEATURE_INFO(INNODB_ROOT_GUESS WITH_INNODB_ROOT_GUESS + "Cache index root block descriptors in InnoDB") OPTION(WITH_INNODB_BUG_ENDIAN_CRC32 "Weaken innodb_checksum_algorithm=crc32 by supporting upgrade from big-endian systems running 5.6/10.0/10.1" ${IS_BIG_ENDIAN}) IF(WITH_INNODB_BUG_ENDIAN_CRC32) ADD_DEFINITIONS(-DINNODB_BUG_ENDIAN_CRC32) ENDIF() +ADD_FEATURE_INFO(INNODB_BUG_ENDIAN_CRC32 WITH_INNODB_BUG_ENDIAN_CRC32 "Big endian weaker CRC32 to support upgrade from big-endian systems running 5.6/10.0/10.1") OPTION(WITH_INNODB_EXTRA_DEBUG "Enable extra InnoDB debug checks" OFF) IF(WITH_INNODB_EXTRA_DEBUG) @@ -148,6 +154,8 @@ IF(WITH_INNODB_EXTRA_DEBUG) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_DEBUG_FLAGS}") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${EXTRA_DEBUG_FLAGS}") ENDIF() +ADD_FEATURE_INFO(INNODB_EXTRA_DEBUG WITH_INNODB_EXTRA_DEBUG "Extra InnoDB debug checks") + CHECK_FUNCTION_EXISTS(sched_getcpu HAVE_SCHED_GETCPU) IF(HAVE_SCHED_GETCPU) @@ -239,6 +247,7 @@ OPTION(WITH_INNODB_DISALLOW_WRITES "InnoDB freeze writes patch from Google" ${WI IF (WITH_INNODB_DISALLOW_WRITES) ADD_DEFINITIONS(-DWITH_INNODB_DISALLOW_WRITES) ENDIF() +ADD_FEATURE_INFO(INNODB_DISALLOW_WRITES WITH_INNODB_DISALLOW_WRITES "Expose innodb_disallow_writes switch to stop innodb from writing to disk") # Include directories under innobase @@ -281,8 +290,8 @@ IF(MSVC) SET_SOURCE_FILES_PROPERTIES(${_SRC_DIR}/pars/lexyy.c PROPERTIES COMPILE_FLAGS "/wd4003") ENDIF() - + # Include directories under innobase INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/storage/innobase/include - ${CMAKE_SOURCE_DIR}/storage/innobase/handler + ${CMAKE_SOURCE_DIR}/storage/innobase/handler ${CMAKE_SOURCE_DIR}/libbinlogevents/include ) diff --git a/storage/innobase/lz4.cmake b/storage/innobase/lz4.cmake index 2f2f0441774..a908dd3b73e 100644 --- a/storage/innobase/lz4.cmake +++ b/storage/innobase/lz4.cmake @@ -22,15 +22,17 @@ MACRO (MYSQL_CHECK_LZ4) CHECK_LIBRARY_EXISTS(lz4 LZ4_compress_default "" HAVE_LZ4_COMPRESS_DEFAULT) IF (HAVE_LZ4_SHARED_LIB AND HAVE_LZ4_H) + SET(HAVE_INNODB_LZ4 TRUE) ADD_DEFINITIONS(-DHAVE_LZ4=1) IF (HAVE_LZ4_COMPRESS_DEFAULT) - ADD_DEFINITIONS(-DHAVE_LZ4_COMPRESS_DEFAULT=1) + ADD_DEFINITIONS(-DHAVE_LZ4_COMPRESS_DEFAULT=1) ENDIF() LINK_LIBRARIES(lz4) ELSE() IF (WITH_INNODB_LZ4 STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required lz4 library is not found") + MESSAGE(FATAL_ERROR "Required lz4 library is not found") ENDIF() ENDIF() ENDIF() + ADD_FEATURE_INFO(INNODB_LZ4 HAVE_INNODB_LZ4 "LZ4 compression in the InnoDB storage engine") ENDMACRO() diff --git a/storage/innobase/lzma.cmake b/storage/innobase/lzma.cmake index 93de0a2934d..3060139c27c 100644 --- a/storage/innobase/lzma.cmake +++ b/storage/innobase/lzma.cmake @@ -22,12 +22,14 @@ MACRO (MYSQL_CHECK_LZMA) CHECK_LIBRARY_EXISTS(lzma lzma_easy_buffer_encode "" HAVE_LZMA_ENCODE) IF (HAVE_LZMA_DECODE AND HAVE_LZMA_ENCODE AND HAVE_LZMA_H) + SET(HAVE_INNODB_LZMA TRUE) ADD_DEFINITIONS(-DHAVE_LZMA=1) LINK_LIBRARIES(lzma) ELSE() IF (WITH_INNODB_LZMA STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required lzma library is not found") + MESSAGE(FATAL_ERROR "Required lzma library is not found") ENDIF() ENDIF() ENDIF() + ADD_FEATURE_INFO(INNODB_LZMA HAVE_INNODB_LZMA "LZMA compression in the InnoDB storage engine") ENDMACRO() diff --git a/storage/innobase/lzo.cmake b/storage/innobase/lzo.cmake index ef6cc52c35d..ca2de6ab1c5 100644 --- a/storage/innobase/lzo.cmake +++ b/storage/innobase/lzo.cmake @@ -21,12 +21,14 @@ MACRO (MYSQL_CHECK_LZO) CHECK_LIBRARY_EXISTS(lzo2 lzo1x_1_compress "" HAVE_LZO_SHARED_LIB) IF(HAVE_LZO_SHARED_LIB AND HAVE_LZO_H) + SET(HAVE_INNODB_LZO TRUE) ADD_DEFINITIONS(-DHAVE_LZO=1) LINK_LIBRARIES(lzo2) ELSE() IF (WITH_INNODB_LZO STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required lzo library is not found") + MESSAGE(FATAL_ERROR "Required lzo library is not found") ENDIF() ENDIF() ENDIF() + ADD_FEATURE_INFO(INNODB_LZO HAVE_INNODB_LZO "LZO compression in the InnoDB storage engine") ENDMACRO() diff --git a/storage/innobase/snappy.cmake b/storage/innobase/snappy.cmake index 2810472cef6..3a2d828ee5c 100644 --- a/storage/innobase/snappy.cmake +++ b/storage/innobase/snappy.cmake @@ -21,12 +21,14 @@ MACRO (MYSQL_CHECK_SNAPPY) CHECK_LIBRARY_EXISTS(snappy snappy_uncompress "" HAVE_SNAPPY_SHARED_LIB) IF(HAVE_SNAPPY_SHARED_LIB AND HAVE_SNAPPY_H) + SET(HAVE_INNODB_SNAPPY TRUE) ADD_DEFINITIONS(-DHAVE_SNAPPY=1) LINK_LIBRARIES(snappy) ELSE() IF (WITH_INNODB_SNAPPY STREQUAL "ON") - MESSAGE(FATAL_ERROR "Required snappy library is not found") + MESSAGE(FATAL_ERROR "Required snappy library is not found") ENDIF() ENDIF() ENDIF() + ADD_FEATURE_INFO(INNODB_SNAPPY HAVE_INNODB_SNAPPY "Snappy compression in the InnoDB storage engine") ENDMACRO() diff --git a/storage/oqgraph/CMakeLists.txt b/storage/oqgraph/CMakeLists.txt index 3be197f7106..9770820f0b7 100644 --- a/storage/oqgraph/CMakeLists.txt +++ b/storage/oqgraph/CMakeLists.txt @@ -3,6 +3,10 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") FUNCTION(CHECK_OQGRAPH) MESSAGE(STATUS "Configuring OQGraph") FIND_PACKAGE(Boost 1.40.0) +SET_PACKAGE_PROPERTIES(Boost PROPERTIES + PURPOSE "Required for the OQGraph storage engine" + TYPE OPTIONAL +) IF(NOT Boost_FOUND) MESSAGE(STATUS "Boost not found. OQGraph will not be compiled") SET(OQGRAPH_OK 0 CACHE INTERNAL "") @@ -11,6 +15,10 @@ ENDIF() INCLUDE_DIRECTORIES(BEFORE ${Boost_INCLUDE_DIRS}) FIND_PACKAGE(Judy) +SET_PACKAGE_PROPERTIES(Judy PROPERTIES + PURPOSE "Required for the OQGraph storage engine" + TYPE OPTIONAL +) IF(NOT Judy_FOUND) MESSAGE(STATUS "Judy not found. OQGraph will not be compiled") SET(OQGRAPH_OK 0 CACHE INTERNAL "") diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index f9384848243..e2b0d9df547 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -2,6 +2,7 @@ MACRO(SKIP_ROCKSDB_PLUGIN msg) MESSAGE_ONCE(SKIP_ROCKSDB_PLUGIN "Can't build rocksdb engine - ${msg}") + ADD_FEATURE_INFO(ROCKSDB "OFF" "Storage Engine") RETURN() ENDMACRO() diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 883ee15f74c..b1937344b9f 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -48,22 +48,28 @@ foreach(compression_lib LZ4 BZip2 ZSTD snappy) endforeach() if(LZ4_FOUND AND (NOT WITH_ROCKSDB_LZ4 STREQUAL "OFF")) + set(HAVE_ROCKSDB_LZ4 TRUE) add_definitions(-DLZ4) include_directories(${LZ4_INCLUDE_DIR}) list(APPEND THIRDPARTY_LIBS ${LZ4_LIBRARY}) endif() +ADD_FEATURE_INFO(ROCKSDB_LZ4 HAVE_ROCKSDB_LZ4 "LZ4 Compression in the RocksDB storage engine") if(BZIP2_FOUND AND (NOT WITH_ROCKSDB_BZip2 STREQUAL "OFF")) + set(HAVE_ROCKSDB_BZIP2 TRUE) add_definitions(-DBZIP2) include_directories(${BZIP2_INCLUDE_DIR}) list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES}) endif() +ADD_FEATURE_INFO(ROCKSDB_BZIP2 HAVE_ROCKSDB_BZIP2 "BZIP2 Compression in the RocksDB storage engine") if(SNAPPY_FOUND AND (NOT WITH_ROCKSDB_snappy STREQUAL "OFF")) + set(HAVE_ROCKSDB_SNAPPY TRUE) add_definitions(-DSNAPPY) include_directories(${snappy_INCLUDE_DIR}) list(APPEND THIRDPARTY_LIBS ${snappy_LIBRARIES}) endif() +ADD_FEATURE_INFO(ROCKSDB_SNAPPY HAVE_ROCKSDB_SNAPPY "Snappy Compression in the RocksDB storage engine") include(CheckFunctionExists) if(ZSTD_FOUND AND (NOT WITH_ROCKSDB_ZSTD STREQUAL "OFF")) @@ -75,14 +81,17 @@ if(ZSTD_FOUND AND (NOT WITH_ROCKSDB_ZSTD STREQUAL "OFF")) "WITH_ROCKSDB_ZSTD is ON and ZSTD library was found, but the version needs to be >= 1.1.3") endif() if (ZSTD_VALID) + set(HAVE_ROCKSDB_ZSTD TRUE) add_definitions(-DZSTD) include_directories(${ZSTD_INCLUDE_DIR}) list(APPEND THIRDPARTY_LIBS ${ZSTD_LIBRARY}) endif() endif() +ADD_FEATURE_INFO(ROCKSDB_ZSTD HAVE_ROCKSDB_ZSTD "Zstandard Compression in the RocksDB storage engine") add_definitions(-DZLIB) list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARY}) +ADD_FEATURE_INFO(ROCKSDB_ZLIB "ON" "zlib Compression in the RocksDB storage engine") if(CMAKE_SYSTEM_NAME MATCHES "Cygwin") add_definitions(-fno-builtin-memcmp -DCYGWIN) From bd711d4f3de386479ba10df2ee07e6fc7c2a02e5 Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Wed, 21 Jul 2021 10:30:01 +0300 Subject: [PATCH 59/98] Typo fixes in item_strfunc.cc --- sql/item_strfunc.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index f5a8a649ac2..26a23b0cb55 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -479,7 +479,7 @@ err: const char *histogram_types[] = {"SINGLE_PREC_HB", "DOUBLE_PREC_HB", 0}; -static TYPELIB hystorgam_types_typelib= +static TYPELIB histogram_types_typelib= { array_elements(histogram_types), "histogram_types", histogram_types, NULL}; @@ -495,7 +495,7 @@ String *Item_func_decode_histogram::val_str(String *str) tmp.length(0); if (!(res= args[0]->val_str(&tmp)) || (type= find_type(res->c_ptr_safe(), - &hystorgam_types_typelib, MYF(0))) <= 0) + &histogram_types_typelib, MYF(0))) <= 0) { null_value= 1; return 0; @@ -580,7 +580,7 @@ bool Item_func_concat::realloc_result(String *str, uint length) const as str was initially set by args[0]->val_str(str). So multiplication by 2 can overflow, if args[0] for some reasons did not limit the result to max_alloced_packet. But it's not harmful, - "str" will be realloced exactly to "length" bytes in case of overflow. + "str" will be reallocated exactly to "length" bytes in case of overflow. */ uint new_length= MY_MAX(str->alloced_length() * 2, length); return str->realloc(new_length); @@ -1456,7 +1456,7 @@ String *Item_func_insert::val_str(String *str) length= res->length(); /* - There is one exception not handled (intentionaly) by the character set + There is one exception not handled (intentionally) by the character set aggregation code. If one string is strong side and is binary, and another one is weak side and is a multi-byte character string, then we need to operate on the second string in terms on bytes when @@ -3204,7 +3204,7 @@ String *Item_func_rpad::val_str(String *str) if ((ulonglong) count > INT_MAX32) count= INT_MAX32; /* - There is one exception not handled (intentionaly) by the character set + There is one exception not handled (intentionally) by the character set aggregation code. If one string is strong side and is binary, and another one is weak side and is a multi-byte character string, then we need to operate on the second string in terms on bytes when @@ -3286,7 +3286,7 @@ String *Item_func_lpad::val_str(String *str) count= INT_MAX32; /* - There is one exception not handled (intentionaly) by the character set + There is one exception not handled (intentionally) by the character set aggregation code. If one string is strong side and is binary, and another one is weak side and is a multi-byte character string, then we need to operate on the second string in terms on bytes when @@ -4131,7 +4131,7 @@ longlong Item_func_uncompressed_length::val_int() 5 bytes long. res->c_ptr() is not used because: - we do not need \0 terminated string to get first 4 bytes - - c_ptr() tests simbol after string end (uninitialiozed memory) which + - c_ptr() tests simbol after string end (uninitialized memory) which confuse valgrind */ return uint4korr(res->ptr()) & 0x3FFFFFFF; From 4aeb2b1c6c542e09be2474644358038279197529 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 20 Jul 2021 23:14:43 -0700 Subject: [PATCH 60/98] MDEV-26189 Missing handling of unknown column in WHERE of recursive CTE SQL processor failed to catch references to unknown columns and other errors of the phase of semantic analysis in the specification of a hanging recursive CTE. This happened because the function With_clause::prepare_unreferenced_elements() failed to detect a CTE as a hanging CTE if the CTE was recursive. Fixing this problem in the code of the mentioned function opened another problem: EXPLAIN started including the lines for the specifications of hanging recursive CTEs in its output. This problem also was fixed in this patch. Approved by Dmitry Shulga --- mysql-test/r/cte_recursive.result | 46 ++++++++++++++++++++++++++--- mysql-test/t/cte_recursive.test | 48 +++++++++++++++++++++++++++++-- sql/sql_cte.cc | 3 +- sql/sql_cte.h | 2 ++ sql/sql_select.cc | 12 +++++--- 5 files changed, 100 insertions(+), 11 deletions(-) diff --git a/mysql-test/r/cte_recursive.result b/mysql-test/r/cte_recursive.result index a4d821ed1a0..1b1fd8b908d 100644 --- a/mysql-test/r/cte_recursive.result +++ b/mysql-test/r/cte_recursive.result @@ -3689,7 +3689,7 @@ select * from t1 as t; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t ALL NULL NULL NULL NULL 4 100.00 Warnings: -Note 1003 with recursive cte as (select `*` AS `*` from `test`.`t1` where `a` = 1 union select `a` + 1 AS `a+1` from `cte` where `a` < 3)select `test`.`t`.`a` AS `a` from `test`.`t1` `t` +Note 1003 with recursive cte as (select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 1 union select `cte`.`a` + 1 AS `a+1` from `cte` where `cte`.`a` < 3)select `test`.`t`.`a` AS `a` from `test`.`t1` `t` with recursive cte as (select * from t1 where a=1 union select a+1 from cte where a<3) select * from t1 as t; @@ -3702,10 +3702,10 @@ create table t2 ( i1 int, i2 int); insert into t2 values (1,1),(2,2); explain with recursive cte as -( select * from t1 union select s1.* from t1 as s1, cte where s1.i1 = cte.i2 ) -select * from t1 as t; +( select * from t2 union select s1.* from t2 as s1, cte where s1.i1 = cte.i2 ) +select * from t2 as t; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t ALL NULL NULL NULL NULL 4 +1 PRIMARY t ALL NULL NULL NULL NULL 2 drop table t1,t2; # # MDEV-22042: ANALYZE of query using stored function and recursive CTE @@ -4481,5 +4481,43 @@ b deallocate prepare stmt; drop table t1,t2; # +# MDEV-26189: Unknown column reference within hanging recursive CTE +# +create table t1 (a int); +insert into t1 values (3), (7), (1); +with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.a = r.b) +select * from t1 as t; +ERROR 42S22: Unknown column 'r.b' in 'where clause' +explain with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.a = r.b) +select * from t1 as t; +ERROR 42S22: Unknown column 'r.b' in 'where clause' +create procedure sp1() with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.a = r.b) +select * from t1 as t; +call sp1(); +ERROR 42S22: Unknown column 'r.b' in 'where clause' +call sp1(); +ERROR 42S22: Unknown column 'r.b' in 'where clause' +with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.b = r.a) +select * from t1 as t; +ERROR 42S22: Unknown column 's1.b' in 'where clause' +explain with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.b = r.a) +select * from t1 as t; +ERROR 42S22: Unknown column 's1.b' in 'where clause' +create procedure sp2() with recursive +r as (select * from t1 union select s1.* from t1 as s1, r where s1.b = r.a) +select * from t1 as t; +call sp2(); +ERROR 42S22: Unknown column 's1.b' in 'where clause' +call sp2(); +ERROR 42S22: Unknown column 's1.b' in 'where clause' +drop procedure sp1; +drop procedure sp2; +drop table t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/cte_recursive.test b/mysql-test/t/cte_recursive.test index 49f9c1f4574..cdd3a075e21 100644 --- a/mysql-test/t/cte_recursive.test +++ b/mysql-test/t/cte_recursive.test @@ -2556,8 +2556,8 @@ insert into t2 values (1,1),(2,2); explain with recursive cte as - ( select * from t1 union select s1.* from t1 as s1, cte where s1.i1 = cte.i2 ) -select * from t1 as t; + ( select * from t2 union select s1.* from t2 as s1, cte where s1.i1 = cte.i2 ) +select * from t2 as t; drop table t1,t2; @@ -2840,6 +2840,50 @@ deallocate prepare stmt; drop table t1,t2; +--echo # +--echo # MDEV-26189: Unknown column reference within hanging recursive CTE +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1); + +let $q1= +with recursive + r as (select * from t1 union select s1.* from t1 as s1, r where s1.a = r.b) +select * from t1 as t; + +--ERROR ER_BAD_FIELD_ERROR +eval $q1; +--ERROR ER_BAD_FIELD_ERROR +eval explain $q1; + +eval create procedure sp1() $q1; +--ERROR ER_BAD_FIELD_ERROR +call sp1(); +--ERROR ER_BAD_FIELD_ERROR +call sp1(); + +let $q2= +with recursive + r as (select * from t1 union select s1.* from t1 as s1, r where s1.b = r.a) +select * from t1 as t; + +--ERROR ER_BAD_FIELD_ERROR +eval $q2; +--ERROR ER_BAD_FIELD_ERROR +eval explain $q2; + +eval create procedure sp2() $q2; +--ERROR ER_BAD_FIELD_ERROR +call sp2(); +--ERROR ER_BAD_FIELD_ERROR +call sp2(); + +drop procedure sp1; +drop procedure sp2; + +drop table t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc index b720eac2317..22a99842f6a 100644 --- a/sql/sql_cte.cc +++ b/sql/sql_cte.cc @@ -911,7 +911,8 @@ bool With_clause::prepare_unreferenced_elements(THD *thd) with_elem; with_elem= with_elem->next) { - if (!with_elem->is_referenced() && with_elem->prepare_unreferenced(thd)) + if ((with_elem->is_hanging_recursive() || !with_elem->is_referenced()) && + with_elem->prepare_unreferenced(thd)) return true; } diff --git a/sql/sql_cte.h b/sql/sql_cte.h index 5f30894afb1..d484dcf123e 100644 --- a/sql/sql_cte.h +++ b/sql/sql_cte.h @@ -242,6 +242,8 @@ public: bool is_referenced() { return referenced; } + bool is_hanging_recursive() { return is_recursive && !rec_outer_references; } + void inc_references() { references++; } bool rename_columns_of_derived_unit(THD *thd, st_select_lex_unit *unit); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2bb01ee0d0a..ff584e936b7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -25276,8 +25276,10 @@ int JOIN::save_explain_data_intern(Explain_query *output, if (!(tmp_unit->item && tmp_unit->item->eliminated) && // (1) (!tmp_unit->derived || tmp_unit->derived->is_materialized_derived()) && // (2) - !(tmp_unit->with_element && - (!tmp_unit->derived || !tmp_unit->derived->derived_result))) // (3) + (!tmp_unit->with_element || + (tmp_unit->derived && + tmp_unit->derived->derived_result && + !tmp_unit->with_element->is_hanging_recursive()))) // (3) { explain->add_child(tmp_unit->first_select()->select_number); } @@ -25342,8 +25344,10 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, */ if (!(unit->item && unit->item->eliminated) && // (1) !(unit->derived && unit->derived->merged_for_insert) && // (2) - !(unit->with_element && - (!unit->derived || !unit->derived->derived_result))) // (3) + (!unit->with_element || + (unit->derived && + unit->derived->derived_result && + !unit->with_element->is_hanging_recursive()))) // (3) { if (mysql_explain_union(thd, unit, result)) DBUG_VOID_RETURN; From b30f26e3fe7bec76d202a5d7b5773dd1b9f38334 Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Thu, 22 Jul 2021 09:19:18 +0200 Subject: [PATCH 61/98] Record tempfiles_encrypted test failure --- .../encryption/r/tempfiles_encrypted.result | 287 ++++++++++++++++++ 1 file changed, 287 insertions(+) diff --git a/mysql-test/suite/encryption/r/tempfiles_encrypted.result b/mysql-test/suite/encryption/r/tempfiles_encrypted.result index 3c81d7b6046..f66a5fd0b25 100644 --- a/mysql-test/suite/encryption/r/tempfiles_encrypted.result +++ b/mysql-test/suite/encryption/r/tempfiles_encrypted.result @@ -3917,6 +3917,293 @@ sum(i) over () IN ( SELECT 1 FROM t1 a) 0 DROP TABLE t1; # +# MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE +# returning the result of calculation of 2 window +# functions that use the same window specification +# +create table t1 (a int); +insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5); +create view v2 as select a from t1 group by a; +create view v1 as select * from v2; +create procedure sp1() select v1.a, +sum(v1.a) over (partition by v1.a order by v1.a) as k, +avg(v1.a) over (partition by v1.a order by v1.a) as m +from v1; +call sp1(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp1(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select v1.a, +sum(v1.a) over (partition by v1.a order by v1.a) as k, +avg(v1.a) over (partition by v1.a order by v1.a) as m +from v1"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp2() select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from (select * from v2) as dt1 +) as dt; +call sp2(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp2(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from (select * from v2) as dt1 +) as dt"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp3() select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from ( select * from (select * from t1 group by a) as dt2 ) as dt1 +) as dt; +call sp3(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp3(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "select * from +( select dt1.a, +sum(dt1.a) over (partition by dt1.a order by dt1.a) as k, +avg(dt1.a) over (partition by dt1.a order by dt1.a) as m +from ( select * from (select * from t1 group by a) as dt2 ) as dt1 +) as dt"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp4() with cte1 as (select * from (select * from t1 group by a) as dt2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp4(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp4(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with cte1 as (select * from (select * from t1 group by a) as dt2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp5() with cte1 as (select * from v2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp5(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp5(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with cte1 as (select * from v2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp6() with +cte1 as (with cte2 as (select * from t1 group by a) select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp6(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp6(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with +cte1 as (with cte2 as (select * from t1 group by a) select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +create procedure sp7() with +cte2 as (select * from v1), +cte1 as (select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte; +call sp7(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +call sp7(); +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +prepare stmt from "with +cte2 as (select * from v1), +cte1 as (select * from cte2), +cte as +( select cte1.a, +sum(cte1.a) over (partition by cte1.a order by cte1.a) as k, +avg(cte1.a) over (partition by cte1.a order by cte1.a) as m +from cte1 ) +select * from cte"; +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +execute stmt; +a k m +1 1 1.0000 +3 3 3.0000 +5 5 5.0000 +7 7 7.0000 +deallocate prepare stmt; +drop procedure sp1; +drop procedure sp2; +drop procedure sp3; +drop procedure sp4; +drop procedure sp5; +drop procedure sp6; +drop procedure sp7; +drop view v1,v2; +drop table t1; +# # End of 10.2 tests # # From 124dc0d85bb7c9c47143ce9cdc723919ed674321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 22 Jul 2021 17:53:43 +0300 Subject: [PATCH 62/98] MDEV-25361 fixup: Fix integer type mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InnoDB tablespace identifiers and page numbers are 32-bit numbers. Let us use a 32-bit type for them in innochecksum. The changes in commit 1918bdf32cdbd1f190cc4479f4076ee4a467f25d broke the build on 32-bit Windows. Thanks to VicenÈ›iu Ciorbaru for an initial version of this fixup. --- extra/innochecksum.cc | 181 +++++++++--------- .../suite/innodb_zip/r/innochecksum_3.result | 8 +- .../suite/innodb_zip/t/innochecksum_3.test | 5 +- storage/innobase/buf/buf0buf.cc | 26 +-- storage/innobase/include/univ.i | 2 +- storage/innobase/page/page0zip.cc | 16 +- 6 files changed, 119 insertions(+), 119 deletions(-) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 3eea1244429..f333ec20991 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. - Copyright (c) 2014, 2019, MariaDB Corporation. + Copyright (c) 2014, 2021, MariaDB Corporation. 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 @@ -85,9 +85,9 @@ typedef void fil_space_t; /* Global variables */ static bool verbose; static bool just_count; -static unsigned long long start_page; -static unsigned long long end_page; -static unsigned long long do_page; +static uint32_t start_page; +static uint32_t end_page; +static uint32_t do_page; static bool use_end_page; static bool do_one_page; static my_bool do_leaf; @@ -99,9 +99,9 @@ static ulong logical_page_size; /* Page size when uncompressed. */ ulong srv_page_size; page_size_t univ_page_size(0, 0, false); /* Current page number (0 based). */ -unsigned long long cur_page_num; +uint32_t cur_page_num; /* Current space. */ -unsigned long long cur_space; +uint32_t cur_space; /* Skip the checksum verification. */ static bool no_check; /* Enabled for strict checksum verification. */ @@ -494,11 +494,11 @@ is_page_corrupted( /* enable if page is corrupted. */ bool is_corrupted; /* use to store LSN values. */ - ulint logseq; - ulint logseqfield; + uint32_t logseq; + uint32_t logseqfield; ulint page_type = mach_read_from_2(buf+FIL_PAGE_TYPE); - uint key_version = mach_read_from_4(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - ulint space_id = mach_read_from_4( + uint32_t key_version = mach_read_from_4(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + uint32_t space_id = mach_read_from_4( buf + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); if (mach_read_from_4(buf + FIL_PAGE_OFFSET) != cur_page_num @@ -511,8 +511,8 @@ is_page_corrupted( if (is_log_enabled) { fprintf(log_file, - "page id mismatch space::" ULINTPF - " page::%llu \n", + "page id mismatch space::" UINT32PF + " page::" UINT32PF " \n", space_id, cur_page_num); } @@ -539,13 +539,14 @@ is_page_corrupted( if (is_log_enabled) { fprintf(log_file, - "space::" ULINTPF " page::%llu" - "; log sequence number:first = " ULINTPF - "; second = " ULINTPF "\n", + "space::" UINT32PF " page::" UINT32PF + "; log sequence number:first = " UINT32PF + "; second = " UINT32PF "\n", space_id, cur_page_num, logseq, logseqfield); if (logseq != logseqfield) { fprintf(log_file, - "Fail; space::" ULINTPF " page::%llu" + "Fail; space::" UINT32PF + " page::" UINT32PF " invalid (fails log " "sequence number check)\n", space_id, cur_page_num); @@ -567,9 +568,9 @@ is_page_corrupted( page_size); if (is_corrupted && log_file) { fprintf(log_file, - "[page id: space=" ULINTPF - ", page_number=%llu] may be corrupted;" - " key_version=%u\n", + "[page id: space=" UINT32PF + ", page_number=" UINT32PF "] may be corrupted;" + " key_version=" UINT32PF "\n", space_id, cur_page_num, mach_read_from_4( FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION @@ -680,8 +681,8 @@ update_checksum( mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); if (is_log_enabled) { - fprintf(log_file, "page::%llu; Updated checksum =" - " %u\n", cur_page_num, checksum); + fprintf(log_file, "page::" UINT32PF "; Updated checksum =" + " " UINT32PF "\n", cur_page_num, checksum); } } else { @@ -711,8 +712,8 @@ update_checksum( mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, checksum); if (is_log_enabled) { - fprintf(log_file, "page::%llu; Updated checksum field1" - " = %u\n", cur_page_num, checksum); + fprintf(log_file, "page::" UINT32PF "; Updated checksum field1" + " = " UINT32PF "\n", cur_page_num, checksum); } if (write_check == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB @@ -725,8 +726,8 @@ update_checksum( FIL_PAGE_END_LSN_OLD_CHKSUM,checksum); if (is_log_enabled) { - fprintf(log_file, "page::%llu; Updated checksum " - "field2 = %u\n", cur_page_num, checksum); + fprintf(log_file, "page::" UINT32PF "; Updated checksum " + "field2 = " UINT32PF "\n", cur_page_num, checksum); } } @@ -800,7 +801,7 @@ write_file( if (page_size != fwrite(buf, 1, page_size, file == stdin ? stdout : file)) { - fprintf(stderr, "Failed to write page::%llu to %s: %s\n", + fprintf(stderr, "Failed to write page::" UINT32PF " to %s: %s\n", cur_page_num, filename, strerror(errno)); return(false); @@ -818,8 +819,8 @@ write_file( } // checks using current xdes page whether the page is free -static bool page_is_free(const byte *xdes, page_size_t page_size, - size_t page_no) +static inline bool is_page_free(const byte *xdes, page_size_t page_size, + uint32_t page_no) { const byte *des= xdes + XDES_ARR_OFFSET + @@ -844,12 +845,10 @@ parse_page( bool is_encrypted) { unsigned long long id; - ulint undo_page_type; + uint16_t undo_page_type; char str[20]={'\0'}; ulint n_recs; - ulint page_no; - ulint left_page_no; - ulint right_page_no; + uint32_t page_no, left_page_no, right_page_no; ulint data_bytes; bool is_leaf; int size_range_id; @@ -864,7 +863,7 @@ parse_page( switch (mach_read_from_2(page + FIL_PAGE_TYPE)) { case FIL_PAGE_INDEX: { - uint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); + uint32_t key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); page_type.n_fil_page_index++; /* If page is encrypted we can't read index header */ @@ -888,7 +887,7 @@ parse_page( is_leaf = (!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL))); if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tIndex page\t\t\t|" + fprintf(file, "#::" UINT32PF "\t\t|\t\tIndex page\t\t\t|" "\tindex id=%llu,", cur_page_num, id); fprintf(file, @@ -907,13 +906,13 @@ parse_page( size_range_id = SIZE_RANGES_FOR_PAGE + 1; } if (per_page_details) { - printf("index id=%llu page " ULINTPF " leaf %d n_recs " ULINTPF " data_bytes " ULINTPF + printf("index id=%llu page " UINT32PF " leaf %d n_recs " ULINTPF " data_bytes " ULINTPF "\n", id, page_no, is_leaf, n_recs, data_bytes); } /* update per-index statistics */ { per_index_stats &index = index_ids[id]; - if (page_is_free(xdes, page_size, page_no)) { + if (is_page_free(xdes, page_size, page_no)) { index.free_pages++; return; } @@ -941,8 +940,8 @@ parse_page( index.pages_in_size_range[size_range_id] ++; } } else { - fprintf(file, "#::%llu\t\t|\t\tEncrypted Index page\t\t\t|" - "\tkey_version %u,%s\n", cur_page_num, key_version, str); + fprintf(file, "#::" UINT32PF "\t\t|\t\tEncrypted Index page\t\t\t|" + "\tkey_version " UINT32PF ",%s\n", cur_page_num, key_version, str); } break; @@ -952,7 +951,7 @@ parse_page( undo_page_type = mach_read_from_2(page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE); if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tUndo log page\t\t\t|", + fprintf(file, "#::" UINT32PF "\t\t|\t\tUndo log page\t\t\t|", cur_page_num); } if (undo_page_type == TRX_UNDO_INSERT) { @@ -1026,7 +1025,7 @@ parse_page( case FIL_PAGE_INODE: page_type.n_fil_page_inode++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tInode page\t\t\t|" + fprintf(file, "#::" UINT32PF "\t\t|\t\tInode page\t\t\t|" "\t%s\n",cur_page_num, str); } break; @@ -1034,7 +1033,7 @@ parse_page( case FIL_PAGE_IBUF_FREE_LIST: page_type.n_fil_page_ibuf_free_list++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tInsert buffer free list" + fprintf(file, "#::" UINT32PF "\t\t|\t\tInsert buffer free list" " page\t|\t%s\n", cur_page_num, str); } break; @@ -1042,7 +1041,7 @@ parse_page( case FIL_PAGE_TYPE_ALLOCATED: page_type.n_fil_page_type_allocated++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tFreshly allocated " + fprintf(file, "#::" UINT32PF "\t\t|\t\tFreshly allocated " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1050,7 +1049,7 @@ parse_page( case FIL_PAGE_IBUF_BITMAP: page_type.n_fil_page_ibuf_bitmap++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tInsert Buffer " + fprintf(file, "#::" UINT32PF "\t\t|\t\tInsert Buffer " "Bitmap\t\t|\t%s\n", cur_page_num, str); } break; @@ -1058,15 +1057,15 @@ parse_page( case FIL_PAGE_TYPE_SYS: page_type.n_fil_page_type_sys++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tSystem page\t\t\t|" - "\t%s\n",cur_page_num, str); + fprintf(file, "#::" UINT32PF "\t\t|\t\tSystem page\t\t\t|" + "\t%s\n", cur_page_num, str); } break; case FIL_PAGE_TYPE_TRX_SYS: page_type.n_fil_page_type_trx_sys++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tTransaction system " + fprintf(file, "#::" UINT32PF "\t\t|\t\tTransaction system " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1074,7 +1073,7 @@ parse_page( case FIL_PAGE_TYPE_FSP_HDR: page_type.n_fil_page_type_fsp_hdr++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tFile Space " + fprintf(file, "#::" UINT32PF "\t\t|\t\tFile Space " "Header\t\t|\t%s\n", cur_page_num, str); } break; @@ -1082,7 +1081,7 @@ parse_page( case FIL_PAGE_TYPE_XDES: page_type.n_fil_page_type_xdes++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tExtent descriptor " + fprintf(file, "#::" UINT32PF "\t\t|\t\tExtent descriptor " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1090,7 +1089,7 @@ parse_page( case FIL_PAGE_TYPE_BLOB: page_type.n_fil_page_type_blob++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tBLOB page\t\t\t|\t%s\n", + fprintf(file, "#::" UINT32PF "\t\t|\t\tBLOB page\t\t\t|\t%s\n", cur_page_num, str); } break; @@ -1098,7 +1097,7 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB: page_type.n_fil_page_type_zblob++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tCompressed BLOB " + fprintf(file, "#::" UINT32PF "\t\t|\t\tCompressed BLOB " "page\t\t|\t%s\n", cur_page_num, str); } break; @@ -1106,7 +1105,7 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB2: page_type.n_fil_page_type_zblob2++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tSubsequent Compressed " + fprintf(file, "#::" UINT32PF "\t\t|\t\tSubsequent Compressed " "BLOB page\t|\t%s\n", cur_page_num, str); } break; @@ -1114,7 +1113,7 @@ parse_page( case FIL_PAGE_PAGE_COMPRESSED: page_type.n_fil_page_type_page_compressed++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tPage compressed " + fprintf(file, "#::" UINT32PF "\t\t|\t\tPage compressed " "page\t|\t%s\n", cur_page_num, str); } break; @@ -1122,7 +1121,7 @@ parse_page( case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: page_type.n_fil_page_type_page_compressed_encrypted++; if (page_type_dump) { - fprintf(file, "#::%llu\t\t|\t\tPage compressed encrypted " + fprintf(file, "#::" UINT32PF "\t\t|\t\tPage compressed encrypted " "page\t|\t%s\n", cur_page_num, str); } break; @@ -1278,14 +1277,14 @@ static struct my_option innochecksum_options[] = { {"count", 'c', "Print the count of pages in the file and exits.", &just_count, &just_count, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"start_page", 's', "Start on this page number (0 based).", - &start_page, &start_page, 0, GET_ULL, REQUIRED_ARG, - 0, 0, ULLONG_MAX, 0, 1, 0}, + &start_page, &start_page, 0, GET_UINT, REQUIRED_ARG, + 0, 0, FIL_NULL, 0, 1, 0}, {"end_page", 'e', "End at this page number (0 based).", - &end_page, &end_page, 0, GET_ULL, REQUIRED_ARG, - 0, 0, ULLONG_MAX, 0, 1, 0}, + &end_page, &end_page, 0, GET_UINT, REQUIRED_ARG, + 0, 0, FIL_NULL, 0, 1, 0}, {"page", 'p', "Check only this page (0 based).", - &do_page, &do_page, 0, GET_ULL, REQUIRED_ARG, - 0, 0, ULLONG_MAX, 0, 1, 0}, + &do_page, &do_page, 0, GET_UINT, REQUIRED_ARG, + 0, 0, FIL_NULL, 0, 1, 0}, {"strict-check", 'C', "Specify the strict checksum algorithm by the user.", &strict_check, &strict_check, &innochecksum_algorithms_typelib, GET_ENUM, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1479,14 +1478,14 @@ bool check_encryption( return false; } - uint min_key_version = mach_read_from_4 + uint32_t min_key_version = mach_read_from_4 (page + offset + MAGIC_SZ + 2 + iv_length); - uint key_id = mach_read_from_4 + uint32_t key_id = mach_read_from_4 (page + offset + MAGIC_SZ + 2 + iv_length + 4); if (type == CRYPT_SCHEME_1 && is_log_enabled) { - fprintf(log_file,"Tablespace %s encrypted key_version %u key_id %u\n", + fprintf(log_file,"Tablespace %s encrypted key_version " UINT32PF " key_id " UINT32PF "\n", filename, min_key_version, key_id); } @@ -1517,7 +1516,7 @@ int verify_checksum( buf, page_size, is_encrypted, is_compressed); if (is_corrupted) { - fprintf(stderr, "Fail: page::%llu invalid\n", + fprintf(stderr, "Fail: page::" UINT32PF " invalid\n", cur_page_num); (*mismatch_count)++; @@ -1603,7 +1602,7 @@ int main( /* size of file (has to be 64 bits) */ unsigned long long int size = 0; /* number of pages in file */ - ulint pages; + uint32_t pages; off_t offset = 0; /* count the no. of page corrupted. */ @@ -1810,7 +1809,7 @@ int main( } if (per_page_details) { - printf("page %llu ", cur_page_num); + printf("page " UINT32PF " ", cur_page_num); } memcpy(xdes, buf, physical_page_size); @@ -1819,29 +1818,29 @@ int main( parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); } - pages = (ulint) (size / page_size.physical()); + pages = uint32_t(size / page_size.physical()); if (just_count) { - if (read_from_stdin) { - fprintf(stderr, "Number of pages:" ULINTPF "\n", pages); - } else { - printf("Number of pages:" ULINTPF "\n", pages); - } + fprintf(read_from_stdin ? stderr : stdout, + "Number of pages:" UINT32PF "\n", pages); continue; } else if (verbose && !read_from_stdin) { if (is_log_enabled) { fprintf(log_file, "file %s = %llu bytes " - "(" ULINTPF " pages)\n", filename, size, pages); + "(" UINT32PF " pages)\n", + filename, size, pages); if (do_one_page) { fprintf(log_file, "Innochecksum: " - "checking page::%llu;\n", + "checking page::" + UINT32PF ";\n", do_page); } } } else { if (is_log_enabled) { fprintf(log_file, "Innochecksum: checking " - "pages in range::%llu to %llu\n", + "pages in range::" UINT32PF + " to " UINT32PF "\n", start_page, use_end_page ? end_page : (pages - 1)); } @@ -1885,8 +1884,8 @@ int main( the desired page. */ partial_page_read = false; - offset = (off_t) start_page - * (off_t) page_size.physical(); + offset = off_t(ulonglong(start_page) + * page_size.physical()); #ifdef _WIN32 if (_fseeki64(fil_in, offset, SEEK_SET)) { #else @@ -1931,12 +1930,7 @@ int main( count++; if (!bytes || feof(fil_in)) { - fprintf(stderr, "Error: Unable " - "to seek to necessary " - "offset"); - - exit_status = 1; - goto my_exit; + goto unexpected_eof; } } } @@ -1953,6 +1947,15 @@ int main( partial_page_read = false; if (!bytes && feof(fil_in)) { + if (cur_page_num == start_page) { +unexpected_eof: + fputs("Error: Unable " + "to seek to necessary offset\n", + stderr); + + exit_status = 1; + goto my_exit; + } break; } @@ -1992,10 +1995,10 @@ first_non_zero: /* If no-check is enabled, skip the checksum verification.*/ - if (!no_check - && !page_is_free(xdes, page_size, cur_page_num) - && !skip_page - && (exit_status = verify_checksum( + if (!no_check && + !is_page_free(xdes, page_size, cur_page_num) && + !skip_page && + (exit_status = verify_checksum( buf, page_size, is_encrypted, is_compressed, &mismatch_count))) { @@ -2013,7 +2016,7 @@ first_non_zero: } if (per_page_details) { - printf("page %llu ", cur_page_num); + printf("page " UINT32PF " ", cur_page_num); } if (page_get_page_no(buf) % physical_page_size == 0) { @@ -2033,10 +2036,10 @@ first_non_zero: if (!lastt) { lastt= now; } else if (now - lastt >= 1 && is_log_enabled) { - fprintf(log_file, "page::%llu " + fprintf(log_file, "page::" UINT32PF " " "okay: %.3f%% done\n", (cur_page_num - 1), - (float) cur_page_num / pages * 100); + (double) cur_page_num / pages * 100); lastt = now; } } diff --git a/mysql-test/suite/innodb_zip/r/innochecksum_3.result b/mysql-test/suite/innodb_zip/r/innochecksum_3.result index aaab68b3df9..46fe282ee15 100644 --- a/mysql-test/suite/innodb_zip/r/innochecksum_3.result +++ b/mysql-test/suite/innodb_zip/r/innochecksum_3.result @@ -210,10 +210,10 @@ Filename::tab#.ibd # allow-mismatches,page,start-page,end-page [9]: check the both short and long options "page" and "start-page" when # seek value is larger than file size. -FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err -FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err -FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err -FOUND 1 /Error: Unable to seek to necessary offset: Invalid argument/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset/ in my_restart.err +FOUND 1 /Error: Unable to seek to necessary offset/ in my_restart.err [34]: check the invalid upper bound values for options, allow-mismatches, end-page, start-page and page. # innochecksum will fail with error code: 1 NOT FOUND /Incorrect unsigned integer value: '18446744073709551616'/ in my_restart.err diff --git a/mysql-test/suite/innodb_zip/t/innochecksum_3.test b/mysql-test/suite/innodb_zip/t/innochecksum_3.test index dab10dcc997..6d14d4c334e 100644 --- a/mysql-test/suite/innodb_zip/t/innochecksum_3.test +++ b/mysql-test/suite/innodb_zip/t/innochecksum_3.test @@ -339,22 +339,19 @@ cat_file $MYSQLTEST_VARDIR/tmp/dump.txt; --echo # seek value is larger than file size. --error 1 --exec $INNOCHECKSUM --page=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE -let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; +let SEARCH_PATTERN= Error: Unable to seek to necessary offset; --source include/search_pattern_in_file.inc --error 1 --exec $INNOCHECKSUM -p 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE -let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; --source include/search_pattern_in_file.inc --error 1 --exec $INNOCHECKSUM --start-page=18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE -let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; --source include/search_pattern_in_file.inc --error 1 --exec $INNOCHECKSUM -s 18446744073709551615 $MYSQLD_DATADIR/test/tab1.ibd 2> $SEARCH_FILE -let SEARCH_PATTERN= Error: Unable to seek to necessary offset: Invalid argument; --source include/search_pattern_in_file.inc --echo [34]: check the invalid upper bound values for options, allow-mismatches, end-page, start-page and page. diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 070789288b6..fdd78d19b55 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2020, MariaDB Corporation. +Copyright (c) 2013, 2021, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -776,8 +776,8 @@ buf_page_is_checksum_valid_crc32( #ifdef UNIV_INNOCHECKSUM if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) { - fprintf(log_file, "page::%llu;" - " crc32 calculated = %u;" + fprintf(log_file, "page::" UINT32PF ";" + " crc32 calculated = " UINT32PF ";" " recorded checksum field1 = " ULINTPF " recorded" " checksum field2 =" ULINTPF "\n", cur_page_num, crc32, checksum_field1, checksum_field2); @@ -822,26 +822,26 @@ buf_page_is_checksum_valid_innodb( #ifdef UNIV_INNOCHECKSUM if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_INNODB) { - fprintf(log_file, "page::%llu;" + fprintf(log_file, "page::" UINT32PF ";" " old style: calculated =" " " ULINTPF "; recorded = " ULINTPF "\n", cur_page_num, old_checksum, checksum_field2); - fprintf(log_file, "page::%llu;" + fprintf(log_file, "page::" UINT32PF ";" " new style: calculated =" - " " ULINTPF "; crc32 = %u; recorded = " ULINTPF "\n", + " " ULINTPF "; crc32 = " UINT32PF "; recorded = " ULINTPF "\n", cur_page_num, new_checksum, buf_calc_page_crc32(read_buf), checksum_field1); } if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) { - fprintf(log_file, "page::%llu;" + fprintf(log_file, "page::" UINT32PF ";" " old style: calculated =" " " ULINTPF "; recorded checksum = " ULINTPF "\n", cur_page_num, old_checksum, checksum_field2); - fprintf(log_file, "page::%llu;" + fprintf(log_file, "page::" UINT32PF ";" " new style: calculated =" " " ULINTPF "; recorded checksum = " ULINTPF "\n", cur_page_num, new_checksum, @@ -909,7 +909,7 @@ buf_page_is_checksum_valid_none( if (log_file && srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_NONE) { fprintf(log_file, - "page::%llu; none checksum: calculated" + "page::" UINT32PF "; none checksum: calculated" " = %lu; recorded checksum_field1 = " ULINTPF " recorded checksum_field2 = " ULINTPF "\n", cur_page_num, BUF_NO_CHECKSUM_MAGIC, @@ -1110,15 +1110,15 @@ buf_page_is_corrupted( checksum_field1, checksum_field2)) { #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "page::%llu;" + fprintf(log_file, "page::" UINT32PF ";" " old style: calculated = %u;" " recorded = " ULINTPF ";\n", cur_page_num, buf_calc_page_old_checksum(read_buf), checksum_field2); - fprintf(log_file, "page::%llu;" - " new style: calculated = %u;" - " crc32 = %u; recorded = " ULINTPF ";\n", + fprintf(log_file, "page::" UINT32PF ";" + " new style: calculated = " UINT32PF ";" + " crc32 = " UINT32PF "; recorded = " ULINTPF ";\n", cur_page_num, buf_calc_page_new_checksum(read_buf), buf_calc_page_crc32(read_buf), diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 0a7f745d45e..9d0527ff49b 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -458,7 +458,7 @@ in both 32-bit and 64-bit environments. */ #ifdef UNIV_INNOCHECKSUM extern bool strict_verify; extern FILE* log_file; -extern unsigned long long cur_page_num; +extern uint32_t cur_page_num; #endif /* UNIV_INNOCHECKSUM */ typedef int64_t ib_int64_t; diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index 1acbfd2e230..6fe5c62a0b7 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -2,7 +2,7 @@ Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2014, 2020, MariaDB Corporation. +Copyright (c) 2014, 2021, MariaDB Corporation. 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 @@ -4983,9 +4983,9 @@ bool page_zip_verify_checksum(const byte *data, size_t size) #ifdef UNIV_INNOCHECKSUM if (log_file) { - fprintf(log_file, "page::%llu;" - " %s checksum: calculated = %u;" - " recorded = %u\n", cur_page_num, + fprintf(log_file, "page::" UINT32PF ";" + " %s checksum: calculated = " UINT32PF ";" + " recorded = " UINT32PF "\n", cur_page_num, buf_checksum_algorithm_name( static_cast( srv_checksum_algorithm)), @@ -4997,11 +4997,11 @@ bool page_zip_verify_checksum(const byte *data, size_t size) data, size, SRV_CHECKSUM_ALGORITHM_CRC32); if (log_file) { - fprintf(log_file, "page::%llu: crc32 checksum:" - " calculated = %u; recorded = %u\n", + fprintf(log_file, "page::" UINT32PF ": crc32 checksum:" + " calculated = " UINT32PF "; recorded = " UINT32PF "\n", cur_page_num, crc32, stored); - fprintf(log_file, "page::%llu: none checksum:" - " calculated = %lu; recorded = %u\n", + fprintf(log_file, "page::" UINT32PF ": none checksum:" + " calculated = %lu; recorded = " UINT32PF "\n", cur_page_num, BUF_NO_CHECKSUM_MAGIC, stored); } } From 8ad6971a1adbb8d5a1f8d2c1bec96ac6a832345e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 22 Jul 2021 17:54:49 +0300 Subject: [PATCH 63/98] Update libmariadb --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index 7d3d7c5ff4a..490100ccace 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 7d3d7c5ff4a9772cf6c73901757d6e39c6a20e99 +Subproject commit 490100ccacedc7aeb89b634fd3f7648a59d096b4 From efae374efa88ba7c1b2e970e4ef025272b09f2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 22 Jul 2021 17:55:05 +0300 Subject: [PATCH 64/98] MDEV-26203 CREATE INDEX may enforce incorrect maximum column length ha_innobase::prepare_inplace_alter_table(): Unless the table is being rebuilt, determine the maximum column length based on the current ROW_FORMAT of the table. When TABLE_SHARE (and the .frm file) contains no explicit ROW_FORMAT, InnoDB table creation or rebuild will use innodb_default_row_format. Based on mysql/mysql-server@3287d33acdc4260806a2a407ca15e9d1e04dddcb --- .../innodb/r/default_row_format_alter.result | 17 +++++++++- .../innodb/t/default_row_format_alter.test | 33 +++++++++++++++---- storage/innobase/handler/handler0alter.cc | 9 +++-- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/mysql-test/suite/innodb/r/default_row_format_alter.result b/mysql-test/suite/innodb/r/default_row_format_alter.result index fd88fb5a3fe..1c31a287fcd 100644 --- a/mysql-test/suite/innodb/r/default_row_format_alter.result +++ b/mysql-test/suite/innodb/r/default_row_format_alter.result @@ -23,6 +23,7 @@ INSERT INTO t1 VALUES (1, 'abc'); SHOW TABLE STATUS LIKE 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 InnoDB # Compact # # # # # # NULL # # NULL latin1_swedish_ci NULL +CREATE TABLE t2 (b VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL) ENGINE=InnoDB; SET GLOBAL innodb_default_row_format = DYNAMIC; ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; # Here we expect DYNAMIC because there is no explicit ROW_FORMAT and the @@ -31,6 +32,10 @@ SHOW TABLE STATUS LIKE 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 InnoDB # Dynamic # # # # # # NULL # # NULL latin1_swedish_ci NULL DROP TABLE t1; +ALTER TABLE t2 ADD INDEX(b); +ERROR HY000: Index column size too large. The maximum column size is 767 bytes +ALTER TABLE t2 FORCE, ADD INDEX(b); +DROP TABLE t2; #################################### # Check the row_format effect on ALTER, ALGORITHM=COPY SET GLOBAL innodb_default_row_format = REDUNDANT; @@ -39,6 +44,7 @@ INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); SHOW TABLE STATUS LIKE 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 InnoDB # Redundant # # # # # # NULL # # NULL latin1_swedish_ci NULL +CREATE TABLE t2 (b VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL) ENGINE=InnoDB; SET GLOBAL innoDB_default_row_format = COMPACT; ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; # Because of ALGORITHM=COPY, there is TABLE REBUILD and the table isn't @@ -47,9 +53,18 @@ SHOW TABLE STATUS LIKE 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment t1 InnoDB # Compact # # # # # # NULL # # NULL latin1_swedish_ci NULL DROP TABLE t1; +ALTER TABLE t2 ADD INDEX(b); +ERROR HY000: Index column size too large. The maximum column size is 767 bytes +ALTER TABLE t2 FORCE, ADD INDEX(b); +ERROR HY000: Index column size too large. The maximum column size is 767 bytes +SET GLOBAL innodb_default_row_format = DYNAMIC; +ALTER TABLE t2 ADD INDEX(b); +ERROR HY000: Index column size too large. The maximum column size is 767 bytes +ALTER TABLE t2 FORCE, ADD INDEX(b); +DROP TABLE t2; ################################### -# Check the row_format effect on ALTER, ALGORITH=COPY on +# Check the row_format effect on ALTER, ALGORITHM=COPY on # create table with explicit row_format CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=REDUNDANT ENGINE=INNODB; INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); diff --git a/mysql-test/suite/innodb/t/default_row_format_alter.test b/mysql-test/suite/innodb/t/default_row_format_alter.test index 8f7217bcf0c..56ad70e78ca 100644 --- a/mysql-test/suite/innodb/t/default_row_format_alter.test +++ b/mysql-test/suite/innodb/t/default_row_format_alter.test @@ -5,7 +5,7 @@ SET @row_format = @@GLOBAL.innodb_default_row_format; --echo #################################### --echo # Check if table rebuilding alter isn't affect if table is created --echo # with explicit row_format -eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=INNODB; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=INNODB; INSERT INTO t1 VALUES (1, 'abc'); --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # SHOW TABLE STATUS LIKE 't1'; @@ -22,12 +22,14 @@ DROP TABLE t1; --echo # Check if table rebuilding alter is affected when there is no --echo # row_format specified at CREATE TABLE. SET GLOBAL innodb_default_row_format = COMPACT; -eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; INSERT INTO t1 VALUES (1, 'abc'); --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # SHOW TABLE STATUS LIKE 't1'; +CREATE TABLE t2 (b VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL) ENGINE=InnoDB; + SET GLOBAL innodb_default_row_format = DYNAMIC; ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; @@ -37,15 +39,22 @@ ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; SHOW TABLE STATUS LIKE 't1'; DROP TABLE t1; +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t2 ADD INDEX(b); +ALTER TABLE t2 FORCE, ADD INDEX(b); +DROP TABLE t2; + --echo #################################### --echo # Check the row_format effect on ALTER, ALGORITHM=COPY SET GLOBAL innodb_default_row_format = REDUNDANT; -eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # SHOW TABLE STATUS LIKE 't1'; +CREATE TABLE t2 (b VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL) ENGINE=InnoDB; + SET GLOBAL innoDB_default_row_format = COMPACT; ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; @@ -55,11 +64,23 @@ ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; SHOW TABLE STATUS LIKE 't1'; DROP TABLE t1; +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t2 ADD INDEX(b); +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t2 FORCE, ADD INDEX(b); + +SET GLOBAL innodb_default_row_format = DYNAMIC; +--error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE t2 ADD INDEX(b); +ALTER TABLE t2 FORCE, ADD INDEX(b); + +DROP TABLE t2; + --echo --echo ################################### ---echo # Check the row_format effect on ALTER, ALGORITH=COPY on +--echo # Check the row_format effect on ALTER, ALGORITHM=COPY on --echo # create table with explicit row_format -eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=REDUNDANT ENGINE=INNODB; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=REDUNDANT ENGINE=INNODB; INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # @@ -80,7 +101,7 @@ DROP TABLE t1; --echo # Check row_format on ALTER ALGORITHM=INPLACE SET GLOBAL innodb_default_row_format=COMPACT; -eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT, KEY k1(b(10))) ENGINE=INNODB; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT, KEY k1(b(10))) ENGINE=INNODB; INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 3ac4f4fe4c1..24a7c4a74ad 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -5387,7 +5387,6 @@ ha_innobase::prepare_inplace_alter_table( mem_heap_t* heap; const char** col_names; int error; - ulint max_col_len; ulint add_autoinc_col_no = ULINT_UNDEFINED; ulonglong autoinc_col_max_value = 0; ulint fts_doc_col_no = ULINT_UNDEFINED; @@ -5601,7 +5600,13 @@ check_if_ok_to_rename: & 1U << DICT_TF_POS_DATA_DIR); } - max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(info.flags()); + + /* ALGORITHM=INPLACE without rebuild (10.3+ ALGORITHM=NOCOPY) + must use the current ROW_FORMAT of the table. */ + const ulint max_col_len = DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG( + innobase_need_rebuild(ha_alter_info, this->table) + ? info.flags() + : m_prebuilt->table->flags); /* Check each index's column length to make sure they do not exceed limit */ From c4295b9be90df2dd8f9056fec187f3e991f498c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=81opusza=C5=84ski?= Date: Thu, 18 Mar 2021 15:56:36 +0100 Subject: [PATCH 65/98] Bug #32460315 ONLINE RESIZING BUFFER POOL CAN CRASH CONCURRENT BP LOOKUP This patch changes it so that we do not free old BP `page_hash`, but rather modify it's parameters, during resize. RB: 26084 Reviewed-by: Marcin Babij Reviewed-by: Yasufumi Kinoshita mysql/mysql-server@ea3adc6a1192e1bca4b4894fd7037e29fbcf0bd0 --- storage/innobase/buf/buf0buf.cc | 21 +++++++++------------ storage/innobase/include/buf0buf.h | 6 ++---- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index fdd78d19b55..3f399024b13 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2018, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2021, Oracle and/or its affiliates. Copyright (c) 2008, Google Inc. Copyright (c) 2013, 2021, MariaDB Corporation. @@ -1896,8 +1896,6 @@ buf_pool_init_instance( LATCH_ID_HASH_TABLE_RW_LOCK, srv_n_page_hash_locks, MEM_HEAP_FOR_PAGE_HASH); - buf_pool->page_hash_old = NULL; - buf_pool->zip_hash = hash_create(2 * buf_pool->curr_size); buf_pool->last_printout_time = time(NULL); @@ -2556,8 +2554,6 @@ buf_pool_resize_hash( { hash_table_t* new_hash_table; - ut_ad(buf_pool->page_hash_old == NULL); - /* recreate page_hash */ new_hash_table = ib_recreate( buf_pool->page_hash, 2 * buf_pool->curr_size); @@ -2589,8 +2585,14 @@ buf_pool_resize_hash( } } - buf_pool->page_hash_old = buf_pool->page_hash; - buf_pool->page_hash = new_hash_table; + /* Concurrent threads may be accessing + buf_pool->page_hash->n_cells, n_sync_obj and try to latch + sync_obj[i] while we are resizing. Therefore we never + deallocate page_hash, instead we overwrite n_cells (and other + fields) with the new values. The n_sync_obj and sync_obj are + actually same in both. */ + std::swap(*buf_pool->page_hash, *new_hash_table); + hash_table_free(new_hash_table); /* recreate zip_hash */ new_hash_table = hash_create(2 * buf_pool->curr_size); @@ -3031,11 +3033,6 @@ calc_buf_pool_size: hash_unlock_x_all(buf_pool->page_hash); buf_pool_mutex_exit(buf_pool); - - if (buf_pool->page_hash_old != NULL) { - hash_table_free(buf_pool->page_hash_old); - buf_pool->page_hash_old = NULL; - } } UT_DELETE(chunk_map_old); diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 40d2e6b2023..468e6be4def 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2020, MariaDB Corporation. +Copyright (c) 1995, 2021, Oracle and/or its affiliates. +Copyright (c) 2013, 2021, MariaDB Corporation. 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 @@ -2037,8 +2037,6 @@ struct buf_pool_t{ page_hash mutex. Lookups can happen while holding the buf_pool->mutex or the relevant page_hash mutex. */ - hash_table_t* page_hash_old; /*!< old pointer to page_hash to be - freed after resizing buffer pool */ hash_table_t* zip_hash; /*!< hash table of buf_block_t blocks whose frames are allocated to the zip buddy system, From 236f825ebf97636aacee482a4c183196c41239ac Mon Sep 17 00:00:00 2001 From: Sachin Agarwal Date: Wed, 26 May 2021 18:36:16 +0530 Subject: [PATCH 66/98] Bug #31576731 INNODB_FT_TOTAL_CACHE_SIZE NOT CAPPED WHEN SET TO 32000000 Problem: Server throws OOM error when we execute twitter load with SELECTs for UPDATE + UPDATES, and SELECT queries on tables with full-text index. FTS cache->total_memory store count of total memory allocated to FTS cache (for all fulltext indexes on a table). For each word in fts cache, we store doc-id & word position in a node->ilist. we increment cache->total_memory with size of doc-id & word position whereas we allocate ilist in chuck of 16, 32 ,64 bytes or 1.2 times of last size. When we wil insert huge amount of data into the FTS aux index tables then collectively these small chucks for each token become huge unaccounted memory allocated for FTS cache. Fix: Incremented cache->total_memory by size of chunk allocated to node->ilist. RB: 25286 Reviewed by : Rahul Agarkar mysql/mysql-server@7ab5707f1c4482ed050ed9fa739e9ec0e2fc0ffa --- storage/innobase/fts/fts0fts.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 53928cac5dd..b423db71c7d 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2020, MariaDB Corporation. +Copyright (c) 2011, 2021, Oracle and/or its affiliates. +Copyright (c) 2016, 2021, MariaDB Corporation. 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 @@ -1299,6 +1299,9 @@ fts_cache_node_add_positions( ptr = ilist + node->ilist_size; node->ilist_size_alloc = new_size; + if (cache) { + cache->total_size += new_size; + } } ptr_start = ptr; @@ -1325,6 +1328,9 @@ fts_cache_node_add_positions( if (node->ilist_size > 0) { memcpy(ilist, node->ilist, node->ilist_size); ut_free(node->ilist); + if (cache) { + cache->total_size -= node->ilist_size; + } } node->ilist = ilist; @@ -1332,10 +1338,6 @@ fts_cache_node_add_positions( node->ilist_size += enc_len; - if (cache) { - cache->total_size += enc_len; - } - if (node->first_doc_id == FTS_NULL_DOC_ID) { node->first_doc_id = doc_id; } From dba7cd25e1449298f3122286dbf73f1b84bbdc5c Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Mon, 28 Jun 2021 20:59:29 +0300 Subject: [PATCH 67/98] MDEV-25560 Creating table with certain generated column crashes server Fix RPAD() handling without 3rd argument of padding, in which case default padding is used. --- mysql-test/main/func_str.result | 16 ++++++++++++++++ mysql-test/main/func_str.test | 18 ++++++++++++++++++ sql/item_strfunc.cc | 19 +++++++++++++------ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/mysql-test/main/func_str.result b/mysql-test/main/func_str.result index 9e63f6e4580..eccec315a45 100644 --- a/mysql-test/main/func_str.result +++ b/mysql-test/main/func_str.result @@ -5153,5 +5153,21 @@ c1 42 DROP TABLE t1, t2; # +# MDEV-25560 Creating table with certain generated column crashes server +# +CREATE TABLE t1 (i int, b int AS (RPAD(123,1)) stored); +# Original case from the reporter +CREATE TABLE crash_test_2 ( +DATA_VALUE CHAR(10) NULL, +HAS_DATA BIT NOT NULL, +TEST_COLUMN CHAR(10) AS (RPAD(CASE WHEN HAS_DATA = 1 +THEN DATA_VALUE ELSE NULL END, 10)) STORED); +Warnings: +Warning 1901 Function or expression 'rpad(case when `HAS_DATA` = 1 then `DATA_VALUE` else NULL end,10)' cannot be used in the GENERATED ALWAYS AS clause of `TEST_COLUMN` +Warning 1105 Expression depends on the @@sql_mode value PAD_CHAR_TO_FULL_LENGTH +# Cleanup +DROP TABLE t1; +DROP TABLE crash_test_2; +# # End of 10.3 tests # diff --git a/mysql-test/main/func_str.test b/mysql-test/main/func_str.test index 780783e316f..8f8628f7142 100644 --- a/mysql-test/main/func_str.test +++ b/mysql-test/main/func_str.test @@ -2090,6 +2090,24 @@ SELECT c1 FROM t2; DROP TABLE t1, t2; +--echo # +--echo # MDEV-25560 Creating table with certain generated column crashes server +--echo # + +CREATE TABLE t1 (i int, b int AS (RPAD(123,1)) stored); + +--echo # Original case from the reporter +CREATE TABLE crash_test_2 ( + DATA_VALUE CHAR(10) NULL, + HAS_DATA BIT NOT NULL, + TEST_COLUMN CHAR(10) AS (RPAD(CASE WHEN HAS_DATA = 1 + THEN DATA_VALUE ELSE NULL END, 10)) STORED); + +--echo # Cleanup +DROP TABLE t1; +DROP TABLE crash_test_2; + + --echo # --echo # End of 10.3 tests --echo # diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 0e63bb2a50c..361feb9055d 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -3192,6 +3192,14 @@ err: } +static String *default_pad_str(String *pad_str, CHARSET_INFO *collation) +{ + pad_str->set_charset(collation); + pad_str->length(0); + pad_str->append(" ", 1); + return pad_str; +} + bool Item_func_pad::fix_length_and_dec() { if (arg_count == 3) @@ -3207,9 +3215,7 @@ bool Item_func_pad::fix_length_and_dec() { if (agg_arg_charsets_for_string_result(collation, &args[0], 1, 1)) return TRUE; - pad_str.set_charset(collation.collation); - pad_str.length(0); - pad_str.append(" ", 1); + default_pad_str(&pad_str, collation.collation); } DBUG_ASSERT(collation.collation->mbmaxlen > 0); @@ -3232,9 +3238,9 @@ bool Item_func_pad::fix_length_and_dec() Sql_mode_dependency Item_func_rpad::value_depends_on_sql_mode() const { DBUG_ASSERT(fixed); - DBUG_ASSERT(arg_count == 3); + DBUG_ASSERT(arg_count >= 2); if (!args[1]->value_depends_on_sql_mode_const_item() || - !args[2]->value_depends_on_sql_mode_const_item()) + (arg_count == 3 && !args[2]->value_depends_on_sql_mode_const_item())) return Item_func::value_depends_on_sql_mode(); Longlong_hybrid len= args[1]->to_longlong_hybrid(); if (args[1]->null_value || len.neg()) @@ -3242,7 +3248,8 @@ Sql_mode_dependency Item_func_rpad::value_depends_on_sql_mode() const if (len.abs() > 0 && len.abs() < args[0]->max_char_length()) return Item_func::value_depends_on_sql_mode(); StringBuffer<64> padstrbuf; - String *padstr= args[2]->val_str(&padstrbuf); + String *padstr= arg_count == 3 ? args[2]->val_str(&padstrbuf) : + default_pad_str(&padstrbuf, collation.collation); if (!padstr || !padstr->length()) return Sql_mode_dependency(); // will return NULL if (padstr->lengthsp() != 0) From 2820ad1c226bfd3be111eecb8eedc41b8533cc06 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Thu, 22 Jul 2021 17:07:17 -0700 Subject: [PATCH 68/98] MDEV-26202 Unexpected failure with query using indirectly a recursive CTE twice This bug was fixed by the patch for bug MDEV-26025. Only a new test case is added here. --- mysql-test/r/cte_recursive.result | 22 ++++++++++++++++++++++ mysql-test/t/cte_recursive.test | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/mysql-test/r/cte_recursive.result b/mysql-test/r/cte_recursive.result index 1b1fd8b908d..168777f9402 100644 --- a/mysql-test/r/cte_recursive.result +++ b/mysql-test/r/cte_recursive.result @@ -4519,5 +4519,27 @@ drop procedure sp1; drop procedure sp2; drop table t1; # +# MDEV-26202: Recursive CTE used indirectly twice +# (fixed by the patch forMDEV-26025) +# +with recursive +rcte as ( SELECT 1 AS a +UNION ALL +SELECT cast(a + 1 as unsigned int) FROM rcte WHERE a < 3), +cte1 AS (SELECT a FROM rcte), +cte2 AS (SELECT a FROM cte1), +cte3 AS ( SELECT a FROM cte2) +SELECT * FROM cte2, cte3; +a a +1 1 +2 1 +3 1 +1 2 +2 2 +3 2 +1 3 +2 3 +3 3 +# # End of 10.2 tests # diff --git a/mysql-test/t/cte_recursive.test b/mysql-test/t/cte_recursive.test index cdd3a075e21..3c845f9d0e3 100644 --- a/mysql-test/t/cte_recursive.test +++ b/mysql-test/t/cte_recursive.test @@ -2884,6 +2884,20 @@ drop procedure sp2; drop table t1; +--echo # +--echo # MDEV-26202: Recursive CTE used indirectly twice +--echo # (fixed by the patch forMDEV-26025) +--echo # + +with recursive + rcte as ( SELECT 1 AS a + UNION ALL + SELECT cast(a + 1 as unsigned int) FROM rcte WHERE a < 3), + cte1 AS (SELECT a FROM rcte), + cte2 AS (SELECT a FROM cte1), + cte3 AS ( SELECT a FROM cte2) +SELECT * FROM cte2, cte3; + --echo # --echo # End of 10.2 tests --echo # From 4c4237e63fb9d766a99fb1d45049d6955fd7f8f2 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Fri, 23 Jul 2021 08:21:28 +0200 Subject: [PATCH 69/98] MDEV-26080 fixup: fixed .result file for galera_roles test (one word must be enclosed in single quotes). --- mysql-test/suite/galera/r/galera_roles.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_roles.result b/mysql-test/suite/galera/r/galera_roles.result index bef89acfc92..d3654e4d0de 100644 --- a/mysql-test/suite/galera/r/galera_roles.result +++ b/mysql-test/suite/galera/r/galera_roles.result @@ -26,7 +26,7 @@ connect foo_node_2,127.0.0.1,foo,,test,$port_2,; connection foo_node_1; SHOW GRANTS; Grants for foo@localhost -GRANT role1 TO 'foo'@'localhost' +GRANT 'role1' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' FLUSH TABLES; ERROR 42000: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation @@ -62,7 +62,7 @@ pr1 connection foo_node_2; SHOW GRANTS; Grants for foo@localhost -GRANT role1 TO 'foo'@'localhost' +GRANT 'role1' TO 'foo'@'localhost' GRANT USAGE ON *.* TO 'foo'@'localhost' FLUSH TABLES; ERROR 42000: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation From 173e562dc2bd339de32d17de73b720e7ca863ff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 23 Jul 2021 17:20:57 +0300 Subject: [PATCH 70/98] MDEV-26228 ASAN heap-use-after-free with ON UPDATE CASCADE In commit 83d2e0841ee30727c609f23957cc592399a3aca4 (MDEV-24041) we failed to notice that in addition to the bug with DELETE and ON DELETE CASCADE, there is another bug with UPDATE and ON UPDATE CASCADE. row_ins_foreign_fill_virtual(): Use the correct memory heap for everything that will be reachable from the cascade->update that we return to the caller. Note: It is correct to use the shorter-lived cascade->heap for rec_get_offsets(), because that memory will be abandoned when row_ins_foreign_fill_virtual() returns. --- mysql-test/suite/gcol/r/innodb_virtual_fk.result | 3 +++ mysql-test/suite/gcol/t/innodb_virtual_fk.test | 3 +++ storage/innobase/row/row0ins.cc | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/gcol/r/innodb_virtual_fk.result b/mysql-test/suite/gcol/r/innodb_virtual_fk.result index 252274f3e0a..367ed1223f7 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_fk.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_fk.result @@ -809,15 +809,18 @@ generated_email_id int as (email_id), PRIMARY KEY (id), KEY mautic_generated_sent_date_email_id (generated_email_id), FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL +ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE emails_metadata ( email_id int, PRIMARY KEY (email_id), CONSTRAINT FK FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE CASCADE +ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO emails VALUES (1); INSERT INTO email_stats (id, email_id, date_sent) VALUES (1,1,'Jan'); INSERT INTO emails_metadata VALUES (1); +UPDATE emails SET id=2; DELETE FROM emails; DROP TABLE email_stats; DROP TABLE emails_metadata; diff --git a/mysql-test/suite/gcol/t/innodb_virtual_fk.test b/mysql-test/suite/gcol/t/innodb_virtual_fk.test index 24b6a4631e6..c99259531b3 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_fk.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_fk.test @@ -670,6 +670,7 @@ CREATE TABLE email_stats ( PRIMARY KEY (id), KEY mautic_generated_sent_date_email_id (generated_email_id), FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL + ON UPDATE CASCADE ) ENGINE=InnoDB; @@ -677,6 +678,7 @@ CREATE TABLE emails_metadata ( email_id int, PRIMARY KEY (email_id), CONSTRAINT FK FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE CASCADE + ON UPDATE CASCADE ) ENGINE=InnoDB; @@ -684,6 +686,7 @@ INSERT INTO emails VALUES (1); INSERT INTO email_stats (id, email_id, date_sent) VALUES (1,1,'Jan'); INSERT INTO emails_metadata VALUES (1); +UPDATE emails SET id=2; DELETE FROM emails; DROP TABLE email_stats; diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 4dc9c66a536..929d3683ce6 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2020, MariaDB Corporation. +Copyright (c) 2016, 2021, MariaDB Corporation. 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 @@ -969,8 +969,8 @@ row_ins_foreign_fill_virtual( upd_field = update->fields + n_diff; upd_field->old_v_val = static_cast( - mem_heap_alloc(cascade->heap, - sizeof *upd_field->old_v_val)); + mem_heap_alloc(update->heap, + sizeof *upd_field->old_v_val)); dfield_copy(upd_field->old_v_val, vfield); From 73d32cc100fd08a7c563dceca29bb42cbd199a41 Mon Sep 17 00:00:00 2001 From: Yongxin Xu <55976466+yongxin-xu@users.noreply.github.com> Date: Fri, 23 Jul 2021 22:36:27 +0800 Subject: [PATCH 71/98] MDEV-24517: JSON_EXTRACT as conditions triggers syntax error on Spider (#1839) The `item_func::JSON_EXTRACT_FUNC` was not handled correctly in the previous versions on the Spider storage engine, which makes queries like `SELECT * FROM t1 WHERE json_extract(jdoc, '$.Age')=20` failed with syntax error. This patch writes specific code to handle JSON_EXTRACT in the Spider Storage Engine and fix that bug. --- .../bugfix/include/mdev_24517_deinit.inc | 11 +++ .../spider/bugfix/include/mdev_24517_init.inc | 43 ++++++++++ .../spider/bugfix/r/mdev_24517.result | 78 +++++++++++++++++++ .../mysql-test/spider/bugfix/t/mdev_24517.cnf | 3 + .../spider/bugfix/t/mdev_24517.test | 78 +++++++++++++++++++ storage/spider/spd_db_mysql.cc | 17 ++++ 6 files changed, 230 insertions(+) create mode 100644 storage/spider/mysql-test/spider/bugfix/include/mdev_24517_deinit.inc create mode 100644 storage/spider/mysql-test/spider/bugfix/include/mdev_24517_init.inc create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_24517.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24517.cnf create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_deinit.inc new file mode 100644 index 00000000000..1880a1c7bba --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_deinit.inc @@ -0,0 +1,11 @@ +--let $MASTER_1_COMMENT_P_2_1= $MASTER_1_COMMENT_P_2_1_BACKUP +--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP +--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP +--let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_result_log +--enable_query_log +--enable_warnings diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_init.inc new file mode 100644 index 00000000000..b5b77a53798 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_24517_init.inc @@ -0,0 +1,43 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_result_log +--enable_query_log +--enable_warnings +--let $MASTER_1_COMMENT_P_2_1_BACKUP= $MASTER_1_COMMENT_P_2_1 +let $MASTER_1_COMMENT_P_2_1= + PARTITION BY RANGE(i) ( + PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1", table "ta_r2"', + PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r3"', + PARTITION pt3 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", table "ta_r4"' + ); +--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES +let $CHILD2_1_DROP_TABLES= + DROP TABLE IF EXISTS ta_r2 $STR_SEMICOLON + DROP TABLE IF EXISTS ta_r3 $STR_SEMICOLON + DROP TABLE IF EXISTS ta_r4; +--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES +let $CHILD2_1_CREATE_TABLES= + CREATE TABLE ta_r2 ( + i INT, + j JSON, + PRIMARY KEY(i) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON + CREATE TABLE ta_r3 ( + i INT, + j JSON, + PRIMARY KEY(i) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON + CREATE TABLE ta_r4 ( + i INT, + j JSON, + PRIMARY KEY(i) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES +let $CHILD2_1_SELECT_TABLES= + SELECT i, j FROM ta_r2 ORDER BY i $STR_SEMICOLON + SELECT i, j FROM ta_r3 ORDER BY i $STR_SEMICOLON + SELECT i, j FROM ta_r4 ORDER BY i; +let $CHILD2_1_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_24517.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_24517.result new file mode 100644 index 00000000000..f084c967435 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_24517.result @@ -0,0 +1,78 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +this test is for MDEV-24517 + +drop and create databases +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +create table and insert +connection child2_1; +CHILD2_1_CREATE_TABLES +TRUNCATE TABLE mysql.general_log; +connection master_1; +CREATE TABLE tbl_a ( +i INT, +j JSON, +PRIMARY KEY(i) +) ENGINE=Spider PARTITION BY RANGE(i) ( +PARTITION pt1 VALUES LESS THAN (5) COMMENT='srv "s_2_1", table "ta_r2"', +PARTITION pt2 VALUES LESS THAN (10) COMMENT='srv "s_2_1", table "ta_r3"', +PARTITION pt3 VALUES LESS THAN MAXVALUE COMMENT='srv "s_2_1", table "ta_r4"' + ) +INSERT INTO tbl_a (i, j) VALUES +(1, '{"ID": "3", "Name": "Barney", "Age": 18}'), +(2, '{"ID": "4", "Name": "Betty", "Age": 19}'), +(3, '{"ID": "2", "Name": "Wilma", "Age": 20}'), +(4, '[10, 20, [30, 40]]'); + +test 1 +connection child2_1; +TRUNCATE TABLE mysql.general_log; +connection master_1; +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$.Age')=19; +i j +2 {"ID": "4", "Name": "Betty", "Age": 19} +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$.Name')="Betty"; +i j +2 {"ID": "4", "Name": "Betty", "Age": 19} +SELECT i, JSON_EXTRACT(j, "$.ID") +FROM tbl_a +WHERE JSON_EXTRACT(j, "$.ID") > 1 AND i < 4 +ORDER BY JSON_EXTRACT(j, "$.Name"); +i JSON_EXTRACT(j, "$.ID") +1 "3" +2 "4" +3 "2" +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$[1]') = 20; +i j +4 [10, 20, [30, 40]] +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$[2][0]') = 30; +i j +4 [10, 20, [30, 40]] + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +SET GLOBAL log_output = @old_log_output; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +end of test diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test new file mode 100644 index 00000000000..f5e53e03a65 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test @@ -0,0 +1,78 @@ +--source ../include/mdev_24517_init.inc +--echo +--echo this test is for MDEV-24517 +--echo +--echo drop and create databases + +--connection master_1 +--disable_warnings +CREATE DATABASE auto_test_local; +USE auto_test_local; + +--connection child2_1 +SET @old_log_output = @@global.log_output; +SET GLOBAL log_output = 'TABLE,FILE'; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +--enable_warnings + +--echo +--echo create table and insert + +--connection child2_1 +--disable_query_log +echo CHILD2_1_CREATE_TABLES; +eval $CHILD2_1_CREATE_TABLES; +--enable_query_log +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +--disable_query_log +echo CREATE TABLE tbl_a ( + i INT, + j JSON, + PRIMARY KEY(i) +) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1; +eval CREATE TABLE tbl_a ( + i INT, + j JSON, + PRIMARY KEY(i) +) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1; +--enable_query_log +INSERT INTO tbl_a (i, j) VALUES + (1, '{"ID": "3", "Name": "Barney", "Age": 18}'), + (2, '{"ID": "4", "Name": "Betty", "Age": 19}'), + (3, '{"ID": "2", "Name": "Wilma", "Age": 20}'), + (4, '[10, 20, [30, 40]]'); + +--echo +--echo test 1 + +--connection child2_1 +TRUNCATE TABLE mysql.general_log; + +--connection master_1 +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$.Age')=19; +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$.Name')="Betty"; +SELECT i, JSON_EXTRACT(j, "$.ID") + FROM tbl_a + WHERE JSON_EXTRACT(j, "$.ID") > 1 AND i < 4 + ORDER BY JSON_EXTRACT(j, "$.Name"); +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$[1]') = 20; +SELECT * FROM tbl_a WHERE JSON_EXTRACT(j, '$[2][0]') = 30; + +--echo +--echo deinit +--disable_warnings + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; +SET GLOBAL log_output = @old_log_output; + +--enable_warnings +--source ../include/mdev_24517_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 6450506ecc9..85c765a1a27 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -5084,6 +5084,23 @@ int spider_db_mbase_util::open_item_func( #else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); #endif + case Item_func::JSON_EXTRACT_FUNC: + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + if (str) + { + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + } + func_name = SPIDER_SQL_COMMA_STR; + func_name_length = SPIDER_SQL_COMMA_LEN; + separator_str = SPIDER_SQL_COMMA_STR; + separator_str_length = SPIDER_SQL_COMMA_LEN; + last_str = SPIDER_SQL_CLOSE_PAREN_STR; + last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; + break; default: THD *thd = spider->trx->thd; SPIDER_SHARE *share = spider->share; From 9fde2bbacf79557aa7f0a959a77aa4f6226dc8d9 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 23 Jul 2021 06:42:50 -0700 Subject: [PATCH 72/98] MDEV-25484 Crash when parsing query using derived table containing TVC This patch fixes parsing problems concerning derived tables that use table value constructors (TVC) with LIMIT and ORDER BY clauses of the form ((VALUES ... LIMIT ...) ORDER BY ...) as dt The fix has to be applied only to 10.3 as 10.4 that employs a different grammar rules has no such problems. The test cases should be merged upstream. Approved by Oleksandr Byelkin --- mysql-test/main/table_value_constr.result | 38 +++++++++++++++++++++++ mysql-test/main/table_value_constr.test | 22 +++++++++++++ sql/sql_lex.cc | 9 +++++- sql/sql_yacc.yy | 12 ++++--- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/mysql-test/main/table_value_constr.result b/mysql-test/main/table_value_constr.result index ff6d19a8e0e..1d1cd054556 100644 --- a/mysql-test/main/table_value_constr.result +++ b/mysql-test/main/table_value_constr.result @@ -3062,4 +3062,42 @@ a 2 3 drop table t1; +# +# MDEV-25484: Derived table using TVC with LIMIT and ORDER BY +# +create table t1 (a int); +insert into t1 values (3), (7), (1); +select * from ( (select * from t1 limit 2) order by 1 desc) as dt; +a +7 +3 +(values (3), (7), (1) limit 2) order by 1 desc; +3 +7 +3 +select * from ( (values (3), (7), (1) limit 2) order by 1 desc) as dt; +3 +7 +3 +select * from ( select * from t1 order by 1 limit 2 ) as dt; +a +1 +3 +values (3),(7),(1) order by 1 limit 2; +3 +1 +3 +select * from ( values (3),(7),(1) order by 1 limit 2 ) as dt; +3 +1 +3 +values (3),(7),(1) union values (2),(4) order by 1 limit 2; +3 +1 +2 +select * from (values (3),(7),(1) union values (2),(4) order by 1 limit 2) as dt; +3 +1 +2 +drop table t1; End of 10.3 tests diff --git a/mysql-test/main/table_value_constr.test b/mysql-test/main/table_value_constr.test index 3e976f88ed5..d13962579cc 100644 --- a/mysql-test/main/table_value_constr.test +++ b/mysql-test/main/table_value_constr.test @@ -1628,4 +1628,26 @@ select * from t1; drop table t1; + +--echo # +--echo # MDEV-25484: Derived table using TVC with LIMIT and ORDER BY +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1); + +select * from ( (select * from t1 limit 2) order by 1 desc) as dt; +(values (3), (7), (1) limit 2) order by 1 desc; +select * from ( (values (3), (7), (1) limit 2) order by 1 desc) as dt; + + +select * from ( select * from t1 order by 1 limit 2 ) as dt; +values (3),(7),(1) order by 1 limit 2; +select * from ( values (3),(7),(1) order by 1 limit 2 ) as dt; + +values (3),(7),(1) union values (2),(4) order by 1 limit 2; +select * from (values (3),(7),(1) union values (2),(4) order by 1 limit 2) as dt; + +drop table t1; + --echo End of 10.3 tests diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 2a337b0f842..8de645a7197 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -8396,8 +8396,15 @@ bool LEX::tvc_finalize_derived() thd->parse_error(); return true; } + if (unlikely(!(current_select->tvc= + new (thd->mem_root) + table_value_constr(many_values, + current_select, + current_select->options)))) + return true; + restore_values_list_state(); current_select->linkage= DERIVED_TABLE_TYPE; - return tvc_finalize(); + return false; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b915667a239..7d13dd8b0c8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -12855,10 +12855,13 @@ order_clause: created yet. */ SELECT_LEX *first_sl= unit->first_select(); - if (unlikely(!unit->is_unit_op() && - (first_sl->order_list.elements || - first_sl->select_limit) && + if (unlikely(!first_sl->next_select() && first_sl->tvc && unit->add_fake_select_lex(thd))) + MYSQL_YYABORT; + else if (unlikely(!unit->is_unit_op() && + (first_sl->order_list.elements || + first_sl->select_limit) && + unit->add_fake_select_lex(thd))) MYSQL_YYABORT; } if (sel->master_unit()->is_unit_op() && !sel->braces) @@ -12907,7 +12910,8 @@ limit_clause_init: LIMIT { SELECT_LEX *sel= Select; - if (sel->master_unit()->is_unit_op() && !sel->braces) + if (sel->master_unit()->is_unit_op() && !sel->braces && + sel->master_unit()->fake_select_lex) { /* Move LIMIT that belongs to UNION to fake_select_lex */ Lex->current_select= sel->master_unit()->fake_select_lex; From eaae13059f413647f8a406b52f212d70dca69661 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sat, 24 Jul 2021 09:18:50 +0200 Subject: [PATCH 73/98] MDEV-25808 PREPARE/EXECUTE makes signed integer out of unsigned Closes #1844 --- mysql-test/main/prepare.result | 14 ++++++++++++++ mysql-test/main/prepare.test | 12 ++++++++++++ sql/item.cc | 8 +++++--- sql/item.h | 4 ++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/mysql-test/main/prepare.result b/mysql-test/main/prepare.result index c1a2969212b..cfe6603dbbe 100644 --- a/mysql-test/main/prepare.result +++ b/mysql-test/main/prepare.result @@ -50,3 +50,17 @@ t1_first deallocate prepare stmt1; deallocate prepare stmt2; drop table t1; +# +# MDEV-25808 PREPARE/EXECUTE makes signed integer out of unsigned +# +prepare p1 from 'select concat(?)'; +execute p1 using 17864960750176564435; +concat(?) +17864960750176564435 +prepare p1 from 'select SQRT(?) is not null'; +execute p1 using 17864960750176564435; +SQRT(?) is not null +1 +# +# End of 10.3 tests +# diff --git a/mysql-test/main/prepare.test b/mysql-test/main/prepare.test index eaab376a5a2..4d1573eb0c8 100644 --- a/mysql-test/main/prepare.test +++ b/mysql-test/main/prepare.test @@ -40,3 +40,15 @@ execute stmt2; deallocate prepare stmt1; deallocate prepare stmt2; drop table t1; + +--echo # +--echo # MDEV-25808 PREPARE/EXECUTE makes signed integer out of unsigned +--echo # +prepare p1 from 'select concat(?)'; +execute p1 using 17864960750176564435; +prepare p1 from 'select SQRT(?) is not null'; +execute p1 using 17864960750176564435; + +--echo # +--echo # End of 10.3 tests +--echo # diff --git a/sql/item.cc b/sql/item.cc index f91705bfaff..7f00cd2bdc6 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -4592,13 +4592,15 @@ bool Item_param::get_date(MYSQL_TIME *res, ulonglong fuzzydate) } -double Item_param::PValue::val_real() const +double Item_param::PValue::val_real(const Type_std_attributes *attr) const { switch (type_handler()->cmp_type()) { case REAL_RESULT: return real; case INT_RESULT: - return (double) integer; + return attr->unsigned_flag + ? (double) (ulonglong) integer + : (double) integer; case DECIMAL_RESULT: { double result; @@ -4680,7 +4682,7 @@ String *Item_param::PValue::val_str(String *str, str->set_real(real, NOT_FIXED_DEC, &my_charset_bin); return str; case INT_RESULT: - str->set(integer, &my_charset_bin); + str->set_int(integer, attr->unsigned_flag, &my_charset_bin); return str; case DECIMAL_RESULT: if (my_decimal2string(E_DEC_FATAL_ERROR, &m_decimal, 0, 0, 0, str) <= 1) diff --git a/sql/item.h b/sql/item.h index ebea56217a8..4c78ed0ea3d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3565,7 +3565,7 @@ class Item_param :public Item_basic_value, m_string.swap(other.m_string); m_string_ptr.swap(other.m_string_ptr); } - double val_real() const; + double val_real(const Type_std_attributes *attr) const; longlong val_int(const Type_std_attributes *attr) const; my_decimal *val_decimal(my_decimal *dec, const Type_std_attributes *attr); String *val_str(String *str, const Type_std_attributes *attr); @@ -3619,7 +3619,7 @@ public: double val_real() { - return can_return_value() ? value.val_real() : 0e0; + return can_return_value() ? value.val_real(this) : 0e0; } longlong val_int() { From 0f18135ec8f90f5736829fb36cab3da9196fd09f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 24 Jul 2021 16:28:57 +0200 Subject: [PATCH 74/98] - Make user variable prefix recognized by IsArgJson and IsJson modified: storage/connect/bsonudf.cpp modified: storage/connect/jsonudf.cpp - Stringify option is now a ; separated list of columns modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/mongo.h modified: storage/connect/tabbson.cpp modified: storage/connect/tabcmg.cpp modified: storage/connect/tabcmg.h modified: storage/connect/tabjmg.cpp modified: storage/connect/tabjmg.h modified: storage/connect/tabjson.cpp - PrepareColist not a static function anymore (+ typo) modified: storage/connect/taboccur.cpp - JDVC: Recognize schema (database) from a wrapper server modified: storage/connect/tabjdbc.cpp --- storage/connect/bsonudf.cpp | 19 +++++++--- storage/connect/json.cpp | 26 ++++++++++++- storage/connect/json.h | 1 + storage/connect/jsonudf.cpp | 17 +++++++-- storage/connect/mongo.h | 2 +- storage/connect/tabbson.cpp | 5 ++- storage/connect/tabcmg.cpp | 3 +- storage/connect/tabcmg.h | 2 +- storage/connect/tabjdbc.cpp | 3 ++ storage/connect/tabjmg.cpp | 15 +++++--- storage/connect/tabjmg.h | 2 +- storage/connect/tabjson.cpp | 5 ++- storage/connect/taboccur.cpp | 72 ++++++++++++++++++------------------ 13 files changed, 111 insertions(+), 61 deletions(-) diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp index d3174580e7f..783be52602a 100644 --- a/storage/connect/bsonudf.cpp +++ b/storage/connect/bsonudf.cpp @@ -1889,24 +1889,31 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n) /*********************************************************************************/ int IsArgJson(UDF_ARGS *args, uint i) { - int n = 0; + char *pat = args->attributes[i]; + int n = 0; + + if (*pat == '@') { + pat++; + + if (*pat == '\'' || *pat == '"') + pat++; + + } // endif pat if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) { - } else if (!strnicmp(args->attributes[i], "Bson_", 5) || - !strnicmp(args->attributes[i], "Json_", 5)) { + } else if (!strnicmp(pat, "Bson_", 5) || !strnicmp(pat, "Json_", 5)) { if (!args->args[i] || strchr("[{ \t\r\n", *args->args[i])) n = 1; // arg should be is a json item // else // n = 2; // A file name may have been returned - } else if (!strnicmp(args->attributes[i], "Bbin_", 5)) { + } else if (!strnicmp(pat, "Bbin_", 5)) { if (args->lengths[i] == sizeof(BSON)) n = 3; // arg is a binary json item // else // n = 2; // A file name may have been returned - } else if (!strnicmp(args->attributes[i], "Bfile_", 6) || - !strnicmp(args->attributes[i], "Jfile_", 6)) { + } else if (!strnicmp(pat, "Bfile_", 6) || !strnicmp(pat, "Jfile_", 6)) { n = 2; // arg is a json file name #if 0 } else if (args->lengths[i]) { diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 9b7145bb498..b1d4decdcdb 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1,7 +1,7 @@ /*************** json CPP Declares Source Code File (.H) ***************/ -/* Name: json.cpp Version 1.5 */ +/* Name: json.cpp Version 1.6 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2020 */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2021 */ /* */ /* This file contains the JSON classes functions. */ /***********************************************************************/ @@ -55,6 +55,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e); char *GetJsonNull(void); int GetDefaultPrec(void); +int PrepareColist(char*); /***********************************************************************/ /* IsNum: check whether this string is all digits. */ @@ -111,6 +112,27 @@ char* NextChr(PSZ s, char sep) return p2; } // end of NextChr +/***********************************************************************/ +/* Stringified: check that this column is in the stringified list. */ +/***********************************************************************/ +bool Stringified(PCSZ strfy, char *colname) +{ + if (strfy) { + char *p, colist[512]; + int n; + + strncpy(colist, strfy, sizeof(colist) - 1); + n = PrepareColist(colist); + + for (p = colist; n && p; p += (strlen(p) + 1), n--) + if (!stricmp(p, colname)) + return true; + + } // endif strfy + + return false; +} // end of Stringified + #if 0 /***********************************************************************/ /* Allocate a VAL structure, make sure common field and Nd are zeroed. */ diff --git a/storage/connect/json.h b/storage/connect/json.h index 566cb64cc23..53fc5f65e7b 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -67,6 +67,7 @@ PJSON ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL); PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); DllExport bool IsNum(PSZ s); bool IsArray(PSZ s); +bool Stringified(PCSZ strfy, char *colname); /***********************************************************************/ /* Class JDOC. The class for parsing and serializing json documents. */ diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 1f635002e7e..c1df923f0b8 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1524,22 +1524,31 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n) /*********************************************************************************/ int IsJson(UDF_ARGS *args, uint i, bool b) { - int n = 0; + char *pat = args->attributes[i]; + int n = 0; + + if (*pat == '@') { + pat++; + + if (*pat == '\'' || *pat == '"') + pat++; + + } // endif pat if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) { - } else if (!strnicmp(args->attributes[i], "Json_", 5)) { + } else if (!strnicmp(pat, "Json_", 5)) { if (!args->args[i] || strchr("[{ \t\r\n", *args->args[i])) n = 1; // arg should be is a json item else n = 2; // A file name may have been returned - } else if (!strnicmp(args->attributes[i], "Jbin_", 5)) { + } else if (!strnicmp(pat, "Jbin_", 5)) { if (args->lengths[i] == sizeof(BSON)) n = 3; // arg is a binary json item else n = 2; // A file name may have been returned - } else if (!strnicmp(args->attributes[i], "Jfile_", 6)) { + } else if (!strnicmp(pat, "Jfile_", 6)) { n = 2; // arg is a json file name } else if (b) { char *sap; diff --git a/storage/connect/mongo.h b/storage/connect/mongo.h index fddc491f2d0..7e92a7dc8e9 100644 --- a/storage/connect/mongo.h +++ b/storage/connect/mongo.h @@ -82,7 +82,7 @@ protected: PSZ Wrapname; /* Java wrapper name */ PCSZ Colist; /* Options list */ PCSZ Filter; /* Filtering query */ - PCSZ Strfy; /* Stringify column */ + PCSZ Strfy; /* The stringify columns */ int Base; /* The array index base */ int Version; /* The Java driver version */ bool Pipe; /* True is Colist is a pipeline */ diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index 7f5727a9713..3b1f1c84d1a 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -53,6 +53,7 @@ USETEMP UseTemp(void); bool JsonAllPath(void); int GetDefaultDepth(void); char *GetJsonNull(void); +bool Stringified(PCSZ, char*); /***********************************************************************/ /* BSONColumns: construct the result blocks containing the description */ @@ -436,7 +437,7 @@ bool BSONDISC::Find(PGLOBAL g, PBVAL jvp, PCSZ key, int j) jcol.Type = TYPE_UNKNOWN; jcol.Len = jcol.Scale = 0; jcol.Cbn = true; - } else if (j < lvl && !(strfy && !stricmp(strfy, colname))) { + } else if (j < lvl && !Stringified(strfy, colname)) { if (!fmt[bf]) strcat(fmt, colname); @@ -507,7 +508,7 @@ bool BSONDISC::Find(PGLOBAL g, PBVAL jvp, PCSZ key, int j) } // endswitch Type } else if (lvl >= 0) { - if (strfy && !stricmp(strfy, colname)) { + if (Stringified(strfy, colname)) { if (!fmt[bf]) strcat(fmt, colname); diff --git a/storage/connect/tabcmg.cpp b/storage/connect/tabcmg.cpp index 608445bb1ab..56d705f42ca 100644 --- a/storage/connect/tabcmg.cpp +++ b/storage/connect/tabcmg.cpp @@ -27,6 +27,7 @@ #include "filter.h" PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info); +bool Stringified(PCSZ, char*); /* -------------------------- Class CMGDISC -------------------------- */ @@ -397,7 +398,7 @@ MGOCOL::MGOCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBCMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Sgfy = (Tmgp->Strfy && !stricmp(Tmgp->Strfy, Name)); + Sgfy = Stringified(Tmgp->Strfy, Name); if ((Jpath = cdp->GetFmt())) { int n = strlen(Jpath) - 1; diff --git a/storage/connect/tabcmg.h b/storage/connect/tabcmg.h index 0a29a6ce909..9effe714fdd 100644 --- a/storage/connect/tabcmg.h +++ b/storage/connect/tabcmg.h @@ -75,7 +75,7 @@ protected: CMgoConn *Cmgp; // Points to a C Mongo connection class CMGOPARM Pcg; // Parms passed to Cmgp const Item *Cnd; // The first condition - PCSZ Strfy; // The stringified column + PCSZ Strfy; // The stringified columns int Fpos; // The current row index int N; // The current Rownum int B; // Array index base diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index 7a8eedad12b..9721c62be7d 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -188,6 +188,9 @@ int JDBCDEF::ParseURL(PGLOBAL g, char *url, bool b) } else // host is a URL Url = PlugDup(g, server->host); + if (!Tabschema && server->db) + Tabschema = PlugDup(g, server->db); + if (!Username && server->username) Username = PlugDup(g, server->username); diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index 9271873b800..983ee39d65f 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -30,6 +30,7 @@ #define nullptr 0 PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info); +bool Stringified(PCSZ, char*); /* -------------------------- Class JMGDISC -------------------------- */ @@ -423,15 +424,19 @@ JMGCOL::JMGCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : EXTCOL(cdp, tdbp, cprec, i, "MGO") { Tmgp = (PTDBJMG)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Sgfy = (Tmgp->Strfy && !stricmp(Tmgp->Strfy, Name)); + Sgfy = Stringified(Tmgp->Strfy, Name); if ((Jpath = cdp->GetFmt())) { - int n = strlen(Jpath) - 1; + int n = strlen(Jpath); - if (Jpath[n] == '*') { + if (n && Jpath[n - 1] == '*') { Jpath = PlugDup(g, cdp->GetFmt()); - if (Jpath[n - 1] == '.') n--; - Jpath[n] = 0; + + if (--n) { + if (Jpath[n - 1] == '.') n--; + Jpath[n] = 0; + } // endif n + Sgfy = true; } // endif Jpath diff --git a/storage/connect/tabjmg.h b/storage/connect/tabjmg.h index bc89319527a..cf7cff83b68 100644 --- a/storage/connect/tabjmg.h +++ b/storage/connect/tabjmg.h @@ -83,7 +83,7 @@ protected: PCSZ Coll_name; PCSZ Options; // The MongoDB options PCSZ Filter; // The filtering query - PCSZ Strfy; // The stringified column + PCSZ Strfy; // The stringified columns PSZ Wrapname; // Java wrapper name int Fpos; // The current row index int N; // The current Rownum diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 2db42cc8cbf..7eff0a68c4b 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -58,6 +58,7 @@ USETEMP UseTemp(void); bool JsonAllPath(void); int GetDefaultDepth(void); char *GetJsonNull(void); +bool Stringified(PCSZ, char*); /***********************************************************************/ /* JSONColumns: construct the result blocks containing the description */ @@ -447,7 +448,7 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j) jcol.Type = TYPE_UNKNOWN; jcol.Len = jcol.Scale = 0; jcol.Cbn = true; - } else if (j < lvl && !(strfy && !stricmp(strfy, colname))) { + } else if (j < lvl && !Stringified(strfy, colname)) { if (!fmt[bf]) strcat(fmt, colname); @@ -517,7 +518,7 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j) } // endswitch Type } else if (lvl >= 0) { - if (strfy && !stricmp(strfy, colname)) { + if (Stringified(strfy, colname)) { if (!fmt[bf]) strcat(fmt, colname); diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 6bf2bd2b47f..c63972ec7ab 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -1,7 +1,7 @@ /************ TabOccur CPP Declares Source Code File (.CPP) ************/ /* Name: TABOCCUR.CPP Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2013 - 2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2013 - 2021 */ /* */ /* OCCUR: Table that provides a view of a source table where the */ /* contain of several columns of the source table is placed in only */ @@ -52,8 +52,8 @@ /***********************************************************************/ /* Prepare and count columns in the column list. */ /***********************************************************************/ -static int PrepareColist(char *colist) - { +int PrepareColist(char *colist) +{ char *p, *pn; int n = 0; @@ -71,7 +71,7 @@ static int PrepareColist(char *colist) } // endif p return n; - } // end of PrepareColist +} // end of PrepareColist /************************************************************************/ /* OcrColumns: constructs the result blocks containing all the columns */ @@ -79,7 +79,7 @@ static int PrepareColist(char *colist) /************************************************************************/ bool OcrColumns(PGLOBAL g, PQRYRES qrp, const char *col, const char *ocr, const char *rank) - { +{ char *pn, *colist; int i, k, m, n = 0, c = 0, j = qrp->Nblin; bool rk, b = false; @@ -168,7 +168,7 @@ bool OcrColumns(PGLOBAL g, PQRYRES qrp, const char *col, /**********************************************************************/ qrp->Nblin = j; return false; - } // end of OcrColumns +} // end of OcrColumns /************************************************************************/ /* OcrSrcCols: constructs the result blocks containing all the columns */ @@ -176,7 +176,7 @@ bool OcrColumns(PGLOBAL g, PQRYRES qrp, const char *col, /************************************************************************/ bool OcrSrcCols(PGLOBAL g, PQRYRES qrp, const char *col, const char *ocr, const char *rank) - { +{ char *pn, *colist; int i, k, m, n = 0, c = 0; bool rk, b = false; @@ -249,7 +249,7 @@ bool OcrSrcCols(PGLOBAL g, PQRYRES qrp, const char *col, /**********************************************************************/ qrp->Nblin = i; return false; - } // end of OcrSrcCols +} // end of OcrSrcCols /* -------------- Implementation of the OCCUR classes ---------------- */ @@ -257,24 +257,24 @@ bool OcrSrcCols(PGLOBAL g, PQRYRES qrp, const char *col, /* DefineAM: define specific AM block values from OCCUR table. */ /***********************************************************************/ bool OCCURDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) - { +{ Rcol = GetStringCatInfo(g, "RankCol", ""); Colist = GetStringCatInfo(g, "Colist", ""); Xcol = GetStringCatInfo(g, "OccurCol", Colist); return PRXDEF::DefineAM(g, am, poff); - } // end of DefineAM +} // end of DefineAM /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ PTDB OCCURDEF::GetTable(PGLOBAL g, MODE) - { +{ if (Catfunc != FNC_COL) return new(g) TDBOCCUR(this); else return new(g) TDBTBC(this); - } // end of GetTable +} // end of GetTable /* ------------------------------------------------------------------- */ @@ -282,7 +282,7 @@ PTDB OCCURDEF::GetTable(PGLOBAL g, MODE) /* Implementation of the TDBOCCUR class. */ /***********************************************************************/ TDBOCCUR::TDBOCCUR(POCCURDEF tdp) : TDBPRX(tdp) - { +{ //Tdbp = NULL; // Source table (in TDBPRX) Tabname = tdp->Tablep->GetName(); // Name of source table Colist = tdp->Colist; // List of source columns @@ -294,13 +294,13 @@ TDBOCCUR::TDBOCCUR(POCCURDEF tdp) : TDBPRX(tdp) N = 0; // The current table index M = 0; // The occurence rank RowFlag = 0; // 0: Ok, 1: Same, 2: Skip - } // end of TDBOCCUR constructor +} // end of TDBOCCUR constructor /***********************************************************************/ /* Allocate OCCUR/SRC column description block. */ /***********************************************************************/ PCOL TDBOCCUR::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) - { +{ PCOL colp = NULL; if (!stricmp(cdp->GetName(), Rcolumn)) { @@ -321,13 +321,13 @@ PCOL TDBOCCUR::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) } // endif cprec return colp; - } // end of MakeCol +} // end of MakeCol /***********************************************************************/ /* Initializes the table. */ /***********************************************************************/ bool TDBOCCUR::InitTable(PGLOBAL g) - { +{ if (!Tdbp) // Get the table description block of this table if (!(Tdbp = GetSubTable(g, ((POCCURDEF)To_Def)->Tablep, TRUE))) @@ -338,13 +338,13 @@ bool TDBOCCUR::InitTable(PGLOBAL g) return TRUE; return FALSE; - } // end of InitTable +} // end of InitTable /***********************************************************************/ /* Allocate OCCUR column description block. */ /***********************************************************************/ bool TDBOCCUR::MakeColumnList(PGLOBAL g) - { +{ char *pn; int i; PCOL colp; @@ -371,13 +371,13 @@ bool TDBOCCUR::MakeColumnList(PGLOBAL g) } // endfor i return false; - } // end of MakeColumnList +} // end of MakeColumnList /***********************************************************************/ /* Allocate OCCUR column description block for a view. */ /***********************************************************************/ bool TDBOCCUR::ViewColumnList(PGLOBAL g) - { +{ char *pn; int i; PCOL colp, cp; @@ -412,13 +412,13 @@ bool TDBOCCUR::ViewColumnList(PGLOBAL g) } // endif Col return false; - } // end of ViewColumnList +} // end of ViewColumnList /***********************************************************************/ /* OCCUR GetMaxSize: returns the maximum number of rows in the table. */ /***********************************************************************/ int TDBOCCUR::GetMaxSize(PGLOBAL g) - { +{ if (MaxSize < 0) { if (!(Tdbp = GetSubTable(g, ((POCCURDEF)To_Def)->Tablep, TRUE))) return 0; @@ -427,22 +427,22 @@ int TDBOCCUR::GetMaxSize(PGLOBAL g) } // endif MaxSize return MaxSize; - } // end of GetMaxSize +} // end of GetMaxSize /***********************************************************************/ /* In this sample, ROWID will be the (virtual) row number, */ /* while ROWNUM will be the occurence rank in the multiple column. */ /***********************************************************************/ int TDBOCCUR::RowNumber(PGLOBAL, bool b) - { +{ return (b) ? M : N; - } // end of RowNumber +} // end of RowNumber /***********************************************************************/ /* OCCUR Access Method opening routine. */ /***********************************************************************/ bool TDBOCCUR::OpenDB(PGLOBAL g) - { +{ if (Use == USE_OPEN) { /*******************************************************************/ /* Table already open, just replace it at its beginning. */ @@ -491,13 +491,13 @@ bool TDBOCCUR::OpenDB(PGLOBAL g) Use = USE_OPEN; return ViewColumnList(g); - } // end of OpenDB +} // end of OpenDB /***********************************************************************/ /* Data Base read routine for OCCUR access method. */ /***********************************************************************/ int TDBOCCUR::ReadDB(PGLOBAL g) - { +{ int rc = RC_OK; /*********************************************************************/ @@ -518,7 +518,7 @@ int TDBOCCUR::ReadDB(PGLOBAL g) N++; return rc; - } // end of ReadDB +} // end of ReadDB // ------------------------ OCCURCOL functions ---------------------------- @@ -527,17 +527,17 @@ int TDBOCCUR::ReadDB(PGLOBAL g) /***********************************************************************/ OCCURCOL::OCCURCOL(PCOLDEF cdp, PTDBOCCUR tdbp, int n) : COLBLK(cdp, tdbp, n) - { +{ // Set additional OCCUR access method information for column. I = 0; - } // end of OCCURCOL constructor +} // end of OCCURCOL constructor /***********************************************************************/ /* ReadColumn: what this routine does is to access the columns of */ /* list, extract their value and convert it to buffer type. */ /***********************************************************************/ void OCCURCOL::ReadColumn(PGLOBAL g) - { +{ PTDBOCCUR tdbp = (PTDBOCCUR)To_Tdb; PCOL *col = tdbp->Col; @@ -559,7 +559,7 @@ void OCCURCOL::ReadColumn(PGLOBAL g) // Set the OCCUR column value from the Ith source column value Value->SetValue_pval(col[I++]->GetValue()); tdbp->RowFlag = 1; - } // end of ReadColumn +} // end of ReadColumn // ------------------------ RANKCOL functions --------------------------- @@ -569,7 +569,7 @@ void OCCURCOL::ReadColumn(PGLOBAL g) /* list, extract its name and set to it the rank column value. */ /***********************************************************************/ void RANKCOL::ReadColumn(PGLOBAL) - { +{ PTDBOCCUR tdbp = (PTDBOCCUR)To_Tdb; PCOL *col = tdbp->Col; @@ -584,4 +584,4 @@ void RANKCOL::ReadColumn(PGLOBAL) } // endelse - } // end of ReadColumn +} // end of ReadColumn From 5049887c8d425508ad9ceaba18f34a55941337c3 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 24 Jul 2021 18:24:20 +0200 Subject: [PATCH 75/98] Replace Mongo2.jar and Mongo3.jar with ne versions --- storage/connect/Mongo2.jar | Bin 623907 -> 624130 bytes storage/connect/Mongo3.jar | Bin 1705776 -> 1706057 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/storage/connect/Mongo2.jar b/storage/connect/Mongo2.jar index 9be654bd4c8e2a1a3fd159c2a69acb5acc55011c..d51cc5d234554de2544239cc40b7b84a30685c09 100644 GIT binary patch delta 34056 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 {=;Er-3$?bU0v9?M+X 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 aj;?yYo>njqg=ytxWp%S`8C_%gF!O)sA#@Y~ From fc98a6d54a7d72865f8f3e580af588bb6ac5fd57 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 24 Jul 2021 18:31:59 +0200 Subject: [PATCH 76/98] Fix compile error for centos 74 Modified taboccur.cpp --- storage/connect/taboccur.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index c63972ec7ab..28270e77fd9 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -49,6 +49,8 @@ #include "tabmysql.h" #include "ha_connect.h" +int PrepareColist(char *colist); + /***********************************************************************/ /* Prepare and count columns in the column list. */ /***********************************************************************/ From f29b3d6d8239d54e08868912093b16187086e133 Mon Sep 17 00:00:00 2001 From: Elena Stepanova Date: Sat, 24 Jul 2021 21:32:52 +0300 Subject: [PATCH 77/98] Some tests can take very long time when run with valgrind Set tests to non-valgrind: oqgraph.social encryption.innodb-page_encryption binlog_encryption.encrypted_master innodb.innodb-page_compression_lz4 main.lock_multi_bug38499 main.lock_multi_bug38691 --- mysql-test/suite/binlog_encryption/encrypted_master.test | 3 +++ mysql-test/suite/encryption/t/innodb-page_encryption.test | 3 +++ mysql-test/suite/innodb/t/innodb-page_compression_lz4.test | 2 ++ mysql-test/t/lock_multi_bug38499.test | 3 +++ mysql-test/t/lock_multi_bug38691.test | 2 ++ storage/oqgraph/mysql-test/oqgraph/social.test | 3 +++ 6 files changed, 16 insertions(+) diff --git a/mysql-test/suite/binlog_encryption/encrypted_master.test b/mysql-test/suite/binlog_encryption/encrypted_master.test index f67e93ce815..f6fc172c79e 100644 --- a/mysql-test/suite/binlog_encryption/encrypted_master.test +++ b/mysql-test/suite/binlog_encryption/encrypted_master.test @@ -18,6 +18,9 @@ # - with annotated events, default checksums and minimal binlog row image # +# The test can take very long time with valgrind +--source include/not_valgrind.inc + --source include/have_partition.inc --source encryption_algorithms.inc --source include/have_innodb.inc diff --git a/mysql-test/suite/encryption/t/innodb-page_encryption.test b/mysql-test/suite/encryption/t/innodb-page_encryption.test index df2d1d52aaa..d756f07aea0 100644 --- a/mysql-test/suite/encryption/t/innodb-page_encryption.test +++ b/mysql-test/suite/encryption/t/innodb-page_encryption.test @@ -1,6 +1,9 @@ -- source include/have_innodb.inc -- source include/have_file_key_management_plugin.inc +# The test can take very long time with valgrind +--source include/not_valgrind.inc + create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; show warnings; create table innodb_compact(c1 bigint not null, b char(200)) engine=innodb row_format=compact encrypted=yes encryption_key_id=1; diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_lz4.test b/mysql-test/suite/innodb/t/innodb-page_compression_lz4.test index 1b1df674e3c..47d24d638e9 100644 --- a/mysql-test/suite/innodb/t/innodb-page_compression_lz4.test +++ b/mysql-test/suite/innodb/t/innodb-page_compression_lz4.test @@ -1,6 +1,8 @@ -- source include/have_innodb.inc -- source include/have_innodb_lz4.inc -- source include/not_embedded.inc +# The test can take very long time with valgrind +--source include/not_valgrind.inc let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; diff --git a/mysql-test/t/lock_multi_bug38499.test b/mysql-test/t/lock_multi_bug38499.test index b812984e516..c489712e5d8 100644 --- a/mysql-test/t/lock_multi_bug38499.test +++ b/mysql-test/t/lock_multi_bug38499.test @@ -2,6 +2,9 @@ # MySQL >= 5.0 # +# The test can take hours with valgrind +--source include/not_valgrind.inc + # Save the initial number of concurrent sessions --source include/count_sessions.inc diff --git a/mysql-test/t/lock_multi_bug38691.test b/mysql-test/t/lock_multi_bug38691.test index 881a0d8e502..9760c1a873a 100644 --- a/mysql-test/t/lock_multi_bug38691.test +++ b/mysql-test/t/lock_multi_bug38691.test @@ -4,6 +4,8 @@ # MySQL >= 5.0 # +# The test can take hours with valgrind +--source include/not_valgrind.inc # Save the initial number of concurrent sessions --source include/count_sessions.inc diff --git a/storage/oqgraph/mysql-test/oqgraph/social.test b/storage/oqgraph/mysql-test/oqgraph/social.test index 69eb7698bb9..a71b160cc1d 100644 --- a/storage/oqgraph/mysql-test/oqgraph/social.test +++ b/storage/oqgraph/mysql-test/oqgraph/social.test @@ -1,3 +1,6 @@ +# The test can take very long time with valgrind +--source include/not_valgrind.inc + --disable_warnings DROP TABLE IF EXISTS rsb, rsb_graph; --enable_warnings From f52d39369a6e3f1a9ce89189180d142e54299862 Mon Sep 17 00:00:00 2001 From: Nayuta Yanagisawa Date: Sun, 25 Jul 2021 17:51:36 +0000 Subject: [PATCH 78/98] MDEV-24517 follow-up: Fix for test with --ps-protocol Tests for the Spider storage engine often use the following idiom: --let $command=CREATE TABLE t1 (...);CREATE TABLE t2 (...); ... --eval $command However, the idiom seems to work in the normal protocol, but fails in the prepared statement (ps) protocol. As testing CREATE TABLE statements in the ps protocol, we wrap the idiom by --disable_ps_protocol and --enable_ps_protocol. --- storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test index f5e53e03a65..21b9dda4f12 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24517.test @@ -21,8 +21,10 @@ USE auto_test_remote; --connection child2_1 --disable_query_log +--disable_ps_protocol echo CHILD2_1_CREATE_TABLES; eval $CHILD2_1_CREATE_TABLES; +--enable_ps_protocol --enable_query_log TRUNCATE TABLE mysql.general_log; From af0b26f9b7ccdf082ec8a631d45726ef78f173b0 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Tue, 8 Dec 2020 16:05:07 +0530 Subject: [PATCH 79/98] MDEV-23786: Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed for TokuDB engine CREATE TABLE Analysis: Assertion failure happens because the database doesn't exist to create the table but ha_tokudb::create() still returns false. So error is not reported. Fix: Store the error state and report the error. --- storage/tokudb/ha_tokudb.cc | 4 ++-- .../tokudb/mysql-test/tokudb/r/bug-23786.result | 10 ++++++++++ storage/tokudb/mysql-test/tokudb/t/bug-23786.test | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 storage/tokudb/mysql-test/tokudb/r/bug-23786.result create mode 100644 storage/tokudb/mysql-test/tokudb/t/bug-23786.test diff --git a/storage/tokudb/ha_tokudb.cc b/storage/tokudb/ha_tokudb.cc index 12d3a5a060a..6c0e24fc82b 100644 --- a/storage/tokudb/ha_tokudb.cc +++ b/storage/tokudb/ha_tokudb.cc @@ -7260,7 +7260,7 @@ int ha_tokudb::create( // in the database directory, so automatic filename-based // discover_table_names() doesn't work either. So, it must force .frm // file to disk. - form->s->write_frm_image(); + error= form->s->write_frm_image(); #endif #if defined(TOKU_INCLUDE_OPTION_STRUCTS) && TOKU_INCLUDE_OPTION_STRUCTS @@ -7292,8 +7292,8 @@ int ha_tokudb::create( #endif // defined(TOKU_INCLUDE_OPTION_STRUCTS) && TOKU_INCLUDE_OPTION_STRUCTS const toku_compression_method compression_method = row_format_to_toku_compression_method(row_format); - bool create_from_engine = (create_info->table_options & HA_OPTION_CREATE_FROM_ENGINE); + if (error) { goto cleanup; } if (create_from_engine) { // table already exists, nothing to do error = 0; diff --git a/storage/tokudb/mysql-test/tokudb/r/bug-23786.result b/storage/tokudb/mysql-test/tokudb/r/bug-23786.result new file mode 100644 index 00000000000..1b21758b85a --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/bug-23786.result @@ -0,0 +1,10 @@ +# +# 10.2 Test +# +# MDEV-23786: Assertion `!is_set() || (m_status == DA_OK_BULK && +# is_bulk_op())'failed for TokuDB engine CREATE TABLE +# +set default_storage_engine='tokudb'; +CREATE TABLE _uppercase.t (a INT) ENGINE=TokuDB; +ERROR 42000: Unknown database '_uppercase' +# End of 10.2 Test diff --git a/storage/tokudb/mysql-test/tokudb/t/bug-23786.test b/storage/tokudb/mysql-test/tokudb/t/bug-23786.test new file mode 100644 index 00000000000..a8a0c4a1577 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/bug-23786.test @@ -0,0 +1,14 @@ +source include/have_tokudb.inc; + +--echo # +--echo # 10.2 Test +--echo # +--echo # MDEV-23786: Assertion `!is_set() || (m_status == DA_OK_BULK && +--echo # is_bulk_op())'failed for TokuDB engine CREATE TABLE +--echo # + +set default_storage_engine='tokudb'; +--error ER_BAD_DB_ERROR +CREATE TABLE _uppercase.t (a INT) ENGINE=TokuDB; + +--echo # End of 10.2 Test From 0711a53a3320ffd0fed4c945dcc0b2e577adbf23 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Mon, 26 Jul 2021 12:35:48 +0300 Subject: [PATCH 80/98] fix clang build: check alignment the other way --- mysys/mf_qsort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysys/mf_qsort.c b/mysys/mf_qsort.c index 3f91bb35354..b516639a341 100644 --- a/mysys/mf_qsort.c +++ b/mysys/mf_qsort.c @@ -114,7 +114,7 @@ qsort_t my_qsort(void *base_ptr, size_t count, size_t size, qsort_cmp cmp) stack[0].low=stack[0].high=0; #endif pivot = (char *) my_alloca((int) size); - ptr_cmp= size == sizeof(char*) && !((low - (char*) 0)& (sizeof(char*)-1)); + ptr_cmp= size == sizeof(char*) && (intptr_t)low % sizeof(char*) == 0; /* The following loop sorts elements between high and low */ do From ce870b2a2a54a1cab844be40a3fabdc8a2a53ce2 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Mon, 26 Jul 2021 14:19:26 +0530 Subject: [PATCH 81/98] MDEV-25998 InnoDB removes the tablespace from default encrypt list early Problem: ========= As a part of MDEV-14398 patch, InnoDB added and removed the tablespace from default encrypt list. But InnoDB removes the tablespace from the default encrypt list too early due to i) other encryption thread working on the tablespace ii) When tablespace is being flushed at the end of key rotation InnoDB fails to decrypt/encrypt the tablespace since the tablespace removed too early and it leads to test case failure. Solution: ========= Avoid the removal of tablespace from default_encrypt_list only when 1) Another active encryption thread working on tablespace 2) Eligible for tablespace key rotation 3) Tablespace is in flushing phase Removed the workaround in encryption.innodb_encryption_filekeys test case. --- .../t/innodb_encryption_filekeys.test | 18 ----------- storage/innobase/fil/fil0crypt.cc | 30 +++++++++++++++++-- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test index cd5724638b1..03447bbcfa6 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test +++ b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test @@ -48,12 +48,6 @@ while ($cnt) { real_sleep 1; dec $cnt; - if ($cnt == 200) - { - --disable_query_log - set global innodb_encrypt_tables = on; - --enable_query_log - } } } if (!$success) @@ -84,12 +78,6 @@ while ($cnt) { real_sleep 1; dec $cnt; - if ($cnt == 200) - { - --disable_query_log - set global innodb_encrypt_tables = off; - --enable_query_log - } } } if (!$success) @@ -119,12 +107,6 @@ while ($cnt) { real_sleep 1; dec $cnt; - if ($cnt == 200) - { - --disable_query_log - set global innodb_encrypt_tables=on; - --enable_query_log - } } } if (!$success) diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 94899ed0f65..4e710b4bb4f 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1092,6 +1092,33 @@ struct rotate_thread_t { } }; +/** Avoid the removal of the tablespace from +default_encrypt_list only when +1) Another active encryption thread working on tablespace +2) Eligible for tablespace key rotation +3) Tablespace is in flushing phase +@return true if tablespace should be removed from +default encrypt */ +static bool fil_crypt_must_remove(const fil_space_t &space) +{ + ut_ad(space.purpose == FIL_TYPE_TABLESPACE); + fil_space_crypt_t *crypt_data = space.crypt_data; + mutex_own(&fil_system->mutex); + const ulong encrypt_tables= srv_encrypt_tables; + if (!crypt_data) + return !encrypt_tables; + if (!crypt_data->is_key_found()) + return true; + + mutex_enter(&crypt_data->mutex); + const bool remove= (space.is_stopping() || crypt_data->not_encrypted()) && + (!crypt_data->rotate_state.flushing && + !encrypt_tables == !!crypt_data->min_key_version && + !crypt_data->rotate_state.active_threads); + mutex_exit(&crypt_data->mutex); + return remove; +} + /*********************************************************************** Check if space needs rotation given a key_state @param[in,out] state Key rotation state @@ -1429,8 +1456,7 @@ inline fil_space_t *fil_system_t::default_encrypt_next( If there is a change in innodb_encrypt_tables variables value then don't remove the last processed tablespace from the default encrypt list. */ - if (released && (!recheck || space->crypt_data) && - !encrypt == !srv_encrypt_tables) + if (released && !recheck && fil_crypt_must_remove(*space)) { ut_a(!default_encrypt_tables.empty()); default_encrypt_tables.remove(*space); From 2575eaa502b4253181651decfda46beef7f3f026 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 26 Jul 2021 12:39:56 +0200 Subject: [PATCH 82/98] dissapear -> disappear --- mysql-test/include/wait_until_disconnected.inc | 2 +- mysql-test/suite/innodb/t/innodb_sys_semaphore_waits.test | 2 +- mysql-test/suite/rpl/t/rpl_trunc_temp.test | 2 +- .../suite/sys_vars/t/innodb_fatal_semaphore_wait_threshold.test | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/include/wait_until_disconnected.inc b/mysql-test/include/wait_until_disconnected.inc index 15bc6474995..93ada7f11ce 100644 --- a/mysql-test/include/wait_until_disconnected.inc +++ b/mysql-test/include/wait_until_disconnected.inc @@ -15,7 +15,7 @@ while (!$mysql_errno) dec $counter; if (!$counter) { - --die Server failed to dissapear + --die Server failed to disappear } --real_sleep 0.1 } diff --git a/mysql-test/suite/innodb/t/innodb_sys_semaphore_waits.test b/mysql-test/suite/innodb/t/innodb_sys_semaphore_waits.test index ccd9e3d70f4..a0b9fc626f3 100644 --- a/mysql-test/suite/innodb/t/innodb_sys_semaphore_waits.test +++ b/mysql-test/suite/innodb/t/innodb_sys_semaphore_waits.test @@ -88,7 +88,7 @@ while (!$mysql_errno) if (!$counter) { # This will fail this test. - --die Server failed to dissapear + --die Server failed to disappear } --sleep 1 } diff --git a/mysql-test/suite/rpl/t/rpl_trunc_temp.test b/mysql-test/suite/rpl/t/rpl_trunc_temp.test index 0e7d5483f62..1ef0fcedd1d 100644 --- a/mysql-test/suite/rpl/t/rpl_trunc_temp.test +++ b/mysql-test/suite/rpl/t/rpl_trunc_temp.test @@ -42,7 +42,7 @@ truncate t1; sync_slave_with_master; show status like 'Slave_open_temp_tables'; -# Disconnect the master, temp table on slave should dissapear +# Disconnect the master, temp table on slave should disappear disconnect master; connection slave; diff --git a/mysql-test/suite/sys_vars/t/innodb_fatal_semaphore_wait_threshold.test b/mysql-test/suite/sys_vars/t/innodb_fatal_semaphore_wait_threshold.test index e9dd0c71936..4563e9b4469 100644 --- a/mysql-test/suite/sys_vars/t/innodb_fatal_semaphore_wait_threshold.test +++ b/mysql-test/suite/sys_vars/t/innodb_fatal_semaphore_wait_threshold.test @@ -89,7 +89,7 @@ while (!$mysql_errno) if (!$counter) { # This will fail this test. - --die Server failed to dissapear + --die Server failed to disappear } --sleep 1 } From 0bd9f755b798718dab8e354d39238d5e1457fd39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 2 Jul 2021 08:56:23 +0300 Subject: [PATCH 83/98] MDEV-26062 : InnoDB: WSREP: referenced FK check fail: Lock wait index `PRIMARY` table `schema`.`child_table` Problem was that not all normal error codes where not handled after wsrep_row_upd_check_foreign_constraints() call. Furhermore, debug assertion did not contain all normal error cases. Changed ib:: calls to WSREP_ calls to use wsrep instrumentation. --- .../suite/galera/r/galera_fk_lock_wait.result | 52 +++++++++++++ .../suite/galera/t/galera_fk_lock_wait.test | 40 ++++++++++ storage/innobase/row/row0upd.cc | 76 ++++++++++--------- 3 files changed, 133 insertions(+), 35 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_fk_lock_wait.result create mode 100644 mysql-test/suite/galera/t/galera_fk_lock_wait.test diff --git a/mysql-test/suite/galera/r/galera_fk_lock_wait.result b/mysql-test/suite/galera/r/galera_fk_lock_wait.result new file mode 100644 index 00000000000..7bbbf40cb29 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_fk_lock_wait.result @@ -0,0 +1,52 @@ +CREATE TABLE parent(parent_id int not null AUTO_INCREMENT PRIMARY KEY, +parent_name varchar(80)) ENGINE=InnoDB; +CREATE TABLE child(child_id int not null AUTO_INCREMENT PRIMARY KEY, +child_name varchar(80), +child_parent_id int not null, +CONSTRAINT `fk_child_parent` + FOREIGN KEY (child_parent_id) REFERENCES parent (parent_id) +ON DELETE CASCADE +ON UPDATE CASCADE) ENGINE=InnoDB; +INSERT INTO parent VALUES (1, 'first'),(2,'second'),(3,'foo'),(4,'tmp'); +INSERT INTO child VALUES (NULL,'first_child',1); +INSERT INTO child VALUES (NULL,'second_child',1); +INSERT INTO child VALUES (NULL,'first_child2',2); +INSERT INTO child VALUES (NULL,'first_child3',2); +INSERT INTO child VALUES (NULL,'first_child4',3); +BEGIN; +UPDATE parent SET parent_name = 'bar' WHERE parent_id = 2; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET SESSION innodb_lock_wait_timeout=2; +UPDATE child SET child_parent_id = 5 where child_parent_id = 2; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +connection node_1; +COMMIT; +SELECT * FROM parent; +parent_id parent_name +1 first +2 bar +3 foo +4 tmp +SELECT * FROM child; +child_id child_name child_parent_id +1 first_child 1 +3 second_child 1 +5 first_child2 2 +7 first_child3 2 +9 first_child4 3 +connection node_2; +SELECT * FROM parent; +parent_id parent_name +1 first +2 bar +3 foo +4 tmp +SELECT * FROM child; +child_id child_name child_parent_id +1 first_child 1 +3 second_child 1 +5 first_child2 2 +7 first_child3 2 +9 first_child4 3 +DROP TABLE child, parent; +disconnect node_1a; diff --git a/mysql-test/suite/galera/t/galera_fk_lock_wait.test b/mysql-test/suite/galera/t/galera_fk_lock_wait.test new file mode 100644 index 00000000000..150c7397f7e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_lock_wait.test @@ -0,0 +1,40 @@ +--source include/galera_cluster.inc + +CREATE TABLE parent(parent_id int not null AUTO_INCREMENT PRIMARY KEY, +parent_name varchar(80)) ENGINE=InnoDB; + +CREATE TABLE child(child_id int not null AUTO_INCREMENT PRIMARY KEY, +child_name varchar(80), +child_parent_id int not null, +CONSTRAINT `fk_child_parent` + FOREIGN KEY (child_parent_id) REFERENCES parent (parent_id) + ON DELETE CASCADE + ON UPDATE CASCADE) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1, 'first'),(2,'second'),(3,'foo'),(4,'tmp'); +INSERT INTO child VALUES (NULL,'first_child',1); +INSERT INTO child VALUES (NULL,'second_child',1); +INSERT INTO child VALUES (NULL,'first_child2',2); +INSERT INTO child VALUES (NULL,'first_child3',2); +INSERT INTO child VALUES (NULL,'first_child4',3); + +BEGIN; +UPDATE parent SET parent_name = 'bar' WHERE parent_id = 2; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION innodb_lock_wait_timeout=2; +--error ER_LOCK_WAIT_TIMEOUT +UPDATE child SET child_parent_id = 5 where child_parent_id = 2; + +--connection node_1 +COMMIT; +SELECT * FROM parent; +SELECT * FROM child; + +--connection node_2 + +SELECT * FROM parent; +SELECT * FROM child; +DROP TABLE child, parent; + +--disconnect node_1a diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 429282906df..1f3e34d493a 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -52,6 +52,11 @@ Created 12/27/1996 Heikki Tuuri #include #include #include +#ifdef WITH_WSREP +#include "log.h" +#include "wsrep.h" +#endif /* WITH_WSREP */ + /* What kind of latch and lock can we assume when the control comes to ------------------------------------------------------------------- @@ -2461,34 +2466,30 @@ row_upd_sec_index_entry( err = DB_SUCCESS; break; case DB_LOCK_WAIT: - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::warn() << "WSREP: sec index FK lock wait" - << " index " << index->name - << " table " << index->table->name - << " query " << wsrep_thd_query(trx->mysql_thd); - } - break; case DB_DEADLOCK: - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name - << " table " << index->table->name - << " query " << wsrep_thd_query(trx->mysql_thd); - } + case DB_LOCK_WAIT_TIMEOUT: + WSREP_DEBUG("Foreign key check fail: " + "%s on table %s index %s query %s", + ut_strerr(err), index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); break; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name - << " table " << index->table->name - << " query " << wsrep_thd_query(trx->mysql_thd); - + WSREP_ERROR("Foreign key check fail: " + "%s on table %s index %s query %s", + ut_strerr(err), index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); break; } } #endif /* WITH_WSREP */ } +#ifdef WITH_WSREP + ut_ad(err == DB_SUCCESS || err == DB_LOCK_WAIT + || err == DB_DEADLOCK || err == DB_LOCK_WAIT_TIMEOUT); +#else ut_ad(err == DB_SUCCESS); +#endif if (referenced) { @@ -2800,17 +2801,21 @@ check_fk: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; + case DB_LOCK_WAIT: case DB_DEADLOCK: - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name - << " table " << index->table->name; - } + case DB_LOCK_WAIT_TIMEOUT: + WSREP_DEBUG("Foreign key check fail: " + "%s on table %s index %s query %s", + ut_strerr(err), index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); + goto err_exit; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name - << " table " << index->table->name; + WSREP_ERROR("Foreign key check fail: " + "%s on table %s index %s query %s", + ut_strerr(err), index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); + goto err_exit; } #endif /* WITH_WSREP */ @@ -3027,18 +3032,19 @@ row_upd_del_mark_clust_rec( case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; + case DB_LOCK_WAIT: case DB_DEADLOCK: - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::warn() << "WSREP: sec index FK check fail for deadlock" - << " index " << index->name - << " table " << index->table->name; - } + case DB_LOCK_WAIT_TIMEOUT: + WSREP_DEBUG("Foreign key check fail: " + "%d on table %s index %s query %s", + err, index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); break; default: - ib::error() << "WSREP: referenced FK check fail: " << err - << " index " << index->name - << " table " << index->table->name; - + WSREP_ERROR("Foreign key check fail: " + "%d on table %s index %s query %s", + err, index->name, index->table->name, + wsrep_thd_query(trx->mysql_thd)); break; } #endif /* WITH_WSREP */ From cf1fc59856daa4c5730737541126d5492a091722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 27 Jul 2021 08:52:01 +0300 Subject: [PATCH 84/98] MDEV-25594: Improve debug checks trx_t::will_lock: Changed the type to bool. trx_t::is_autocommit_non_locking(): Replaces trx_is_autocommit_non_locking(). trx_is_ac_nl_ro(): Remove (replaced with equivalent assertion expressions). assert_trx_nonlocking_or_in_list(): Remove. Replaced with at least as strict checks in each place. check_trx_state(): Moved to a static function; partially replaced with individual debug assertions implementing equivalent or stricter checks. This is a backport of commit 7b51d11cca8898f319ddde5d7048cb81b43fef06 from 10.5. --- storage/innobase/handler/ha_innodb.cc | 70 ++++-------- storage/innobase/handler/handler0alter.cc | 3 +- storage/innobase/include/trx0i_s.h | 6 +- storage/innobase/include/trx0sys.ic | 6 +- storage/innobase/include/trx0trx.h | 124 +++++----------------- storage/innobase/include/trx0trx.ic | 19 ++-- storage/innobase/lock/lock0lock.cc | 39 +++++-- storage/innobase/read/read0read.cc | 4 +- storage/innobase/trx/trx0i_s.cc | 20 +++- storage/innobase/trx/trx0roll.cc | 39 +++++-- storage/innobase/trx/trx0sys.cc | 7 +- storage/innobase/trx/trx0trx.cc | 84 +++++++-------- 12 files changed, 184 insertions(+), 237 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 81f1dae85b6..00c9595aa87 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4503,7 +4503,7 @@ innobase_commit_low( if (trx_is_started(trx)) { trx_commit_for_mysql(trx); } else { - trx->will_lock = 0; + trx->will_lock = false; #ifdef WITH_WSREP trx->wsrep = false; #endif /* WITH_WSREP */ @@ -4860,7 +4860,7 @@ innobase_rollback_trx( lock_unlock_table_autoinc(trx); if (!trx->has_logged()) { - trx->will_lock = 0; + trx->will_lock = false; #ifdef WITH_WSREP trx->wsrep = false; #endif @@ -8176,20 +8176,12 @@ ha_innobase::write_row( if (high_level_read_only) { ib_senderrf(ha_thd(), IB_LOG_LEVEL_WARN, ER_READ_ONLY_MODE); DBUG_RETURN(HA_ERR_TABLE_READONLY); - } else if (UNIV_UNLIKELY(m_prebuilt->trx != trx)) { - ib::error() << "The transaction object for the table handle is" - " at " << static_cast(m_prebuilt->trx) - << ", but for the current thread it is at " - << static_cast(trx); + } - fputs("InnoDB: Dump of 200 bytes around m_prebuilt: ", stderr); - ut_print_buf(stderr, ((const byte*) m_prebuilt) - 100, 200); - fputs("\nInnoDB: Dump of 200 bytes around ha_data: ", stderr); - ut_print_buf(stderr, ((const byte*) trx) - 100, 200); - putc('\n', stderr); - ut_error; - } else if (!trx_is_started(trx)) { - ++trx->will_lock; + ut_a(m_prebuilt->trx == trx); + + if (!trx_is_started(trx)) { + trx->will_lock = true; } #ifdef WITH_WSREP @@ -8964,7 +8956,7 @@ ha_innobase::update_row( ib_senderrf(ha_thd(), IB_LOG_LEVEL_WARN, ER_READ_ONLY_MODE); DBUG_RETURN(HA_ERR_TABLE_READONLY); } else if (!trx_is_started(trx)) { - ++trx->will_lock; + trx->will_lock = true; } if (m_upd_buf == NULL) { @@ -9110,7 +9102,7 @@ ha_innobase::delete_row( ib_senderrf(ha_thd(), IB_LOG_LEVEL_WARN, ER_READ_ONLY_MODE); DBUG_RETURN(HA_ERR_TABLE_READONLY); } else if (!trx_is_started(trx)) { - ++trx->will_lock; + trx->will_lock = true; } if (!m_prebuilt->upd_node) { @@ -9990,7 +9982,7 @@ ha_innobase::ft_init() them as regular read only transactions for now. */ if (!trx_is_started(trx)) { - ++trx->will_lock; + trx->will_lock = true; } DBUG_RETURN(rnd_init(false)); @@ -10056,7 +10048,7 @@ ha_innobase::ft_init_ext( them as regular read only transactions for now. */ if (!trx_is_started(trx)) { - ++trx->will_lock; + trx->will_lock = true; } dict_table_t* ft_table = m_prebuilt->table; @@ -13081,7 +13073,7 @@ create_table_info_t::allocate_trx() { m_trx = innobase_trx_allocate(m_thd); - m_trx->will_lock++; + m_trx->will_lock = true; m_trx->ddl = true; } @@ -13372,13 +13364,7 @@ inline int ha_innobase::delete_table(const char* name, enum_sql_command sqlcom) ut_a(name_len < 1000); - /* Either the transaction is already flagged as a locking transaction - or it hasn't been started yet. */ - - ut_a(!trx_is_started(trx) || trx->will_lock > 0); - - /* We are doing a DDL operation. */ - ++trx->will_lock; + trx->will_lock = true; /* Drop the table in InnoDB */ @@ -13555,14 +13541,7 @@ innobase_drop_database( #endif /* _WIN32 */ trx_t* trx = innobase_trx_allocate(thd); - - /* Either the transaction is already flagged as a locking transaction - or it hasn't been started yet. */ - - ut_a(!trx_is_started(trx) || trx->will_lock > 0); - - /* We are doing a DDL operation. */ - ++trx->will_lock; + trx->will_lock = true; ulint dummy; @@ -13606,7 +13585,7 @@ inline dberr_t innobase_rename_table(trx_t *trx, const char *from, DEBUG_SYNC_C("innodb_rename_table_ready"); trx_start_if_not_started(trx, true); - ut_ad(trx->will_lock > 0); + ut_ad(trx->will_lock); if (commit) { /* Serialize data dictionary operations with dictionary mutex: @@ -13651,7 +13630,7 @@ inline dberr_t innobase_rename_table(trx_t *trx, const char *from, /* Transaction must be flagged as a locking transaction or it hasn't been started yet. */ - ut_a(trx->will_lock > 0); + ut_a(trx->will_lock); error = row_rename_table_for_mysql(norm_from, norm_to, trx, commit, commit); @@ -13737,7 +13716,7 @@ int ha_innobase::truncate() if (!srv_safe_truncate) { if (!trx_is_started(m_prebuilt->trx)) { - ++m_prebuilt->trx->will_lock; + m_prebuilt->trx->will_lock = true; } dberr_t err = row_truncate_table_for_mysql( @@ -13791,8 +13770,7 @@ int ha_innobase::truncate() heap, ib_table->name.m_name, ib_table->id); const char* name = mem_heap_strdup(heap, ib_table->name.m_name); trx_t* trx = innobase_trx_allocate(m_user_thd); - - ++trx->will_lock; + trx->will_lock = true; trx_set_dict_operation(trx, TRX_DICT_OP_TABLE); row_mysql_lock_data_dictionary(trx); dict_stats_wait_bg_to_stop_using_table(ib_table, trx); @@ -13877,9 +13855,7 @@ ha_innobase::rename_table( } trx_t* trx = innobase_trx_allocate(thd); - - /* We are doing a DDL operation. */ - ++trx->will_lock; + trx->will_lock = true; trx_set_dict_operation(trx, TRX_DICT_OP_INDEX); dberr_t error = innobase_rename_table(trx, from, to, true); @@ -15880,7 +15856,7 @@ ha_innobase::start_stmt( innobase_register_trx(ht, thd, trx); if (!trx_is_started(trx)) { - ++trx->will_lock; + trx->will_lock = true; } DBUG_RETURN(0); @@ -16103,7 +16079,7 @@ ha_innobase::external_lock( && (m_prebuilt->select_lock_type != LOCK_NONE || m_prebuilt->stored_select_lock_type != LOCK_NONE)) { - ++trx->will_lock; + trx->will_lock = true; } DBUG_RETURN(0); @@ -16150,7 +16126,7 @@ ha_innobase::external_lock( && (m_prebuilt->select_lock_type != LOCK_NONE || m_prebuilt->stored_select_lock_type != LOCK_NONE)) { - ++trx->will_lock; + trx->will_lock = true; } DBUG_RETURN(0); @@ -16829,7 +16805,7 @@ ha_innobase::store_lock( && (m_prebuilt->select_lock_type != LOCK_NONE || m_prebuilt->stored_select_lock_type != LOCK_NONE)) { - ++trx->will_lock; + trx->will_lock = true; } return(to); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 24a7c4a74ad..88e02ee4e32 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -967,7 +967,7 @@ ha_innobase::check_if_supported_inplace_alter( } } - m_prebuilt->trx->will_lock++; + m_prebuilt->trx->will_lock = true; if (!online) { /* We already determined that only a non-locking @@ -8954,7 +8954,6 @@ foreign_fail: m_prebuilt = ctx->prebuilt; } trx_start_if_not_started(user_trx, true); - user_trx->will_lock++; m_prebuilt->trx = user_trx; } DBUG_INJECT_CRASH("ib_commit_inplace_crash", diff --git a/storage/innobase/include/trx0i_s.h b/storage/innobase/include/trx0i_s.h index 7e766072272..ca65e053502 100644 --- a/storage/innobase/include/trx0i_s.h +++ b/storage/innobase/include/trx0i_s.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2021, MariaDB Corporation. 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 @@ -164,8 +164,8 @@ struct i_s_trx_row_t { /*!< detailed_error in trx_t */ ulint trx_is_read_only; /*!< trx_t::read_only */ - ulint trx_is_autocommit_non_locking; - /*!< trx_is_autocommit_non_locking(trx) + bool trx_is_autocommit_non_locking; + /*!< trx:t::is_autocommit_non_locking() */ }; diff --git a/storage/innobase/include/trx0sys.ic b/storage/innobase/include/trx0sys.ic index c85695630f0..8518934e94f 100644 --- a/storage/innobase/include/trx0sys.ic +++ b/storage/innobase/include/trx0sys.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2018, 2019, MariaDB Corporation. +Copyright (c) 2018, 2021, MariaDB Corporation. 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 @@ -251,7 +251,9 @@ trx_rw_min_trx_id_low(void) if (trx == NULL) { id = trx_sys->max_trx_id; } else { - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); id = trx->id; } diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index a7591fa1b19..90365400d72 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -502,99 +502,6 @@ from innodb_lock_wait_timeout via trx_t::mysql_thd. ? thd_lock_wait_timeout((t)->mysql_thd) \ : 0) -/** -Determine if the transaction is a non-locking autocommit select -(implied read-only). -@param t transaction -@return true if non-locking autocommit select transaction. */ -#define trx_is_autocommit_non_locking(t) \ -((t)->auto_commit && (t)->will_lock == 0) - -/** -Determine if the transaction is a non-locking autocommit select -with an explicit check for the read-only status. -@param t transaction -@return true if non-locking autocommit read-only transaction. */ -#define trx_is_ac_nl_ro(t) \ -((t)->read_only && trx_is_autocommit_non_locking((t))) - -/** -Assert that the transaction is in the trx_sys_t::rw_trx_list */ -#define assert_trx_in_rw_list(t) do { \ - ut_ad(!(t)->read_only); \ - ut_ad((t)->in_rw_trx_list \ - == !((t)->read_only || !(t)->rsegs.m_redo.rseg)); \ - check_trx_state(t); \ -} while (0) - -/** -Check transaction state */ -#define check_trx_state(t) do { \ - ut_ad(!trx_is_autocommit_non_locking((t))); \ - switch ((t)->state) { \ - case TRX_STATE_PREPARED: \ - case TRX_STATE_PREPARED_RECOVERED: \ - case TRX_STATE_ACTIVE: \ - case TRX_STATE_COMMITTED_IN_MEMORY: \ - continue; \ - case TRX_STATE_NOT_STARTED: \ - break; \ - } \ - ut_error; \ -} while (0) - -/** Check if transaction is free so that it can be re-initialized. -@param t transaction handle */ -#define assert_trx_is_free(t) do { \ - ut_ad(trx_state_eq((t), TRX_STATE_NOT_STARTED)); \ - ut_ad(!(t)->id); \ - ut_ad(!(t)->has_logged()); \ - ut_ad(!(t)->is_referenced()); \ - ut_ad(!(t)->is_wsrep()); \ - ut_ad(!MVCC::is_view_active((t)->read_view)); \ - ut_ad((t)->lock.wait_thr == NULL); \ - ut_ad(UT_LIST_GET_LEN((t)->lock.trx_locks) == 0); \ - ut_ad((t)->lock.table_locks.empty()); \ - ut_ad(!(t)->autoinc_locks \ - || ib_vector_is_empty((t)->autoinc_locks)); \ - ut_ad((t)->dict_operation == TRX_DICT_OP_NONE); \ -} while(0) - -/** Check if transaction is in-active so that it can be freed and put back to -transaction pool. -@param t transaction handle */ -#define assert_trx_is_inactive(t) do { \ - assert_trx_is_free((t)); \ - ut_ad((t)->dict_operation_lock_mode == 0); \ -} while(0) - -#ifdef UNIV_DEBUG -/*******************************************************************//** -Assert that an autocommit non-locking select cannot be in the -rw_trx_list and that it is a read-only transaction. -The tranasction must be in the mysql_trx_list. */ -# define assert_trx_nonlocking_or_in_list(t) \ - do { \ - if (trx_is_autocommit_non_locking(t)) { \ - trx_state_t t_state = (t)->state; \ - ut_ad((t)->read_only); \ - ut_ad(!(t)->is_recovered); \ - ut_ad(!(t)->in_rw_trx_list); \ - ut_ad((t)->in_mysql_trx_list); \ - ut_ad(t_state == TRX_STATE_NOT_STARTED \ - || t_state == TRX_STATE_ACTIVE); \ - } else { \ - check_trx_state(t); \ - } \ - } while (0) -#else /* UNIV_DEBUG */ -/*******************************************************************//** -Assert that an autocommit non-locking slect cannot be in the -rw_trx_list and that it is a read-only transaction. -The tranasction must be in the mysql_trx_list. */ -# define assert_trx_nonlocking_or_in_list(trx) ((void)0) -#endif /* UNIV_DEBUG */ - typedef std::vector > lock_list; /*******************************************************************//** @@ -1070,16 +977,15 @@ public: /*------------------------------*/ bool read_only; /*!< true if transaction is flagged as a READ-ONLY transaction. - if auto_commit && will_lock == 0 + if auto_commit && !will_lock then it will be handled as a AC-NL-RO-SELECT (Auto Commit Non-Locking Read Only Select). A read only transaction will not be assigned an UNDO log. */ bool auto_commit; /*!< true if it is an autocommit */ - ib_uint32_t will_lock; /*!< Will acquire some locks. Increment - each time we determine that a lock will - be acquired by the MySQL layer. */ + bool will_lock; /*!< set to inform trx_start_low() that + the transaction may acquire locks */ /*------------------------------*/ fts_trx_t* fts_trx; /*!< FTS information, or NULL if transaction hasn't modified tables @@ -1199,10 +1105,28 @@ public: inline void free(); + void assert_freed() const + { + ut_ad(state == TRX_STATE_NOT_STARTED); + ut_ad(!id); + ut_ad(!has_logged()); + ut_ad(!const_cast(this)->is_referenced()); + ut_ad(!is_wsrep()); + ut_ad(!trx_get_read_view(this)); + ut_ad(!lock.wait_thr); + ut_ad(UT_LIST_GET_LEN(lock.trx_locks) == 0); + ut_ad(lock.table_locks.empty()); + ut_ad(!autoinc_locks || ib_vector_is_empty(autoinc_locks)); + ut_ad(dict_operation == TRX_DICT_OP_NONE); + } + + /** @return whether this is a non-locking autocommit transaction */ + bool is_autocommit_non_locking() const { return auto_commit && !will_lock; } + private: - /** Assign a rollback segment for modifying temporary tables. - @return the assigned rollback segment */ - trx_rseg_t* assign_temp_rseg(); + /** Assign a rollback segment for modifying temporary tables. + @return the assigned rollback segment */ + trx_rseg_t *assign_temp_rseg(); }; /** diff --git a/storage/innobase/include/trx0trx.ic b/storage/innobase/include/trx0trx.ic index 4a5b1ba717f..2a53509b206 100644 --- a/storage/innobase/include/trx0trx.ic +++ b/storage/innobase/include/trx0trx.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2019, MariaDB Corporation. +Copyright (c) 2016, 2021, MariaDB Corporation. 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 @@ -50,17 +50,18 @@ trx_state_eq( switch (trx->state) { case TRX_STATE_PREPARED: case TRX_STATE_PREPARED_RECOVERED: - ut_ad(!trx_is_autocommit_non_locking(trx)); + case TRX_STATE_COMMITTED_IN_MEMORY: + ut_ad(!trx->is_autocommit_non_locking()); return(trx->state == state); case TRX_STATE_ACTIVE: - - assert_trx_nonlocking_or_in_list(trx); - return(state == trx->state); - - case TRX_STATE_COMMITTED_IN_MEMORY: - - check_trx_state(trx); + if (trx->is_autocommit_non_locking()) { + ut_ad(!trx->is_recovered); + ut_ad(trx->read_only); + ut_ad(trx->mysql_thd); + ut_ad(!trx->in_rw_trx_list); + ut_ad(trx->in_mysql_trx_list); + } return(state == trx->state); case TRX_STATE_NOT_STARTED: diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 506106a2269..4daf4fb07b8 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -1376,6 +1376,19 @@ wsrep_print_wait_locks( } #endif /* WITH_WSREP */ +#ifdef UNIV_DEBUG +/** Check transaction state */ +static void check_trx_state(const trx_t *trx) +{ + ut_ad(!trx->auto_commit || trx->will_lock); + const trx_state_t state= trx->state; + ut_ad(state == TRX_STATE_ACTIVE || + state == TRX_STATE_PREPARED_RECOVERED || + state == TRX_STATE_PREPARED || + state == TRX_STATE_COMMITTED_IN_MEMORY); +} +#endif + /** Create a new record lock and inserts it to the lock queue, without checking for deadlocks or conflicts. @param[in] type_mode lock mode and wait flag; type will be replaced @@ -3589,8 +3602,8 @@ lock_table_create( ut_ad(table && trx); ut_ad(lock_mutex_own()); ut_ad(trx_mutex_own(trx)); - - check_trx_state(trx); + ut_ad(trx->is_recovered || trx->state == TRX_STATE_ACTIVE); + ut_ad(!trx->auto_commit || trx->will_lock); if ((type_mode & LOCK_MODE_MASK) == LOCK_AUTO_INC) { ++table->n_waiting_or_granted_auto_inc_locks; @@ -4545,7 +4558,10 @@ lock_remove_recovered_trx_record_locks( trx != NULL; trx = UT_LIST_GET_NEXT(trx_list, trx)) { - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); + ut_ad(trx->state != TRX_STATE_NOT_STARTED); if (!trx->is_recovered) { continue; @@ -5181,7 +5197,8 @@ lock_rec_queue_validate( ut_ad(!index || lock->index == index); trx_mutex_enter(lock->trx); - ut_ad(!trx_is_ac_nl_ro(lock->trx)); + ut_ad(!lock->trx->read_only + || !lock->trx->is_autocommit_non_locking()); ut_ad(trx_state_eq(lock->trx, TRX_STATE_COMMITTED_IN_MEMORY) || !lock_get_wait(lock) @@ -5260,8 +5277,7 @@ lock_rec_queue_validate( for (lock = lock_rec_get_first(lock_sys->rec_hash, block, heap_no); lock != NULL; lock = lock_rec_get_next_const(heap_no, lock)) { - - ut_ad(!trx_is_ac_nl_ro(lock->trx)); + ut_ad(!lock->trx->is_autocommit_non_locking()); if (index) { ut_a(lock->index == index); @@ -5357,7 +5373,8 @@ loop: } } - ut_ad(!trx_is_ac_nl_ro(lock->trx)); + ut_ad(!lock->trx->read_only + || !lock->trx->is_autocommit_non_locking()); /* Only validate the record queues when this thread is not holding a space->latch. */ @@ -5465,7 +5482,7 @@ lock_rec_validate( ib_uint64_t current; - ut_ad(!trx_is_ac_nl_ro(lock->trx)); + ut_ad(!lock->trx->is_autocommit_non_locking()); ut_ad(lock_get_type(lock) == LOCK_REC); current = ut_ull_create( @@ -7075,7 +7092,8 @@ DeadlockChecker::search() ut_ad(m_start != NULL); ut_ad(m_wait_lock != NULL); - check_trx_state(m_wait_lock->trx); + ut_ad(!m_wait_lock->trx->auto_commit || m_wait_lock->trx->will_lock); + ut_d(check_trx_state(m_wait_lock->trx)); ut_ad(m_mark_start <= s_lock_mark_counter); /* Look at the locks ahead of wait_lock in the lock queue. */ @@ -7235,7 +7253,8 @@ DeadlockChecker::check_and_resolve(const lock_t* lock, trx_t* trx) { ut_ad(lock_mutex_own()); ut_ad(trx_mutex_own(trx)); - check_trx_state(trx); + ut_ad(trx->state == TRX_STATE_ACTIVE); + ut_ad(!trx->auto_commit || trx->will_lock); ut_ad(!srv_read_only_mode); if (!innobase_deadlock_detect) { diff --git a/storage/innobase/read/read0read.cc b/storage/innobase/read/read0read.cc index 3fd52d5d6dd..a115672a8a6 100644 --- a/storage/innobase/read/read0read.cc +++ b/storage/innobase/read/read0read.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2019, MariaDB Corporation. +Copyright (c) 2019, 2021, MariaDB Corporation. 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 @@ -574,7 +574,7 @@ MVCC::view_open(ReadView*& view, trx_t* trx) Therefore we must set the low limit id after we reset the closed status after the check. */ - if (trx_is_autocommit_non_locking(trx) && view->empty()) { + if (trx->is_autocommit_non_locking() && view->empty()) { view->m_closed = false; diff --git a/storage/innobase/trx/trx0i_s.cc b/storage/innobase/trx/trx0i_s.cc index 2b9d6c96acd..05579aeb223 100644 --- a/storage/innobase/trx/trx0i_s.cc +++ b/storage/innobase/trx/trx0i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2021, MariaDB Corporation. 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 @@ -577,7 +577,7 @@ thd_done: row->trx_is_read_only = trx->read_only; - row->trx_is_autocommit_non_locking = trx_is_autocommit_non_locking(trx); + row->trx_is_autocommit_non_locking = trx->is_autocommit_non_locking(); return(TRUE); } @@ -1259,7 +1259,21 @@ fetch_data_into_cache_low( continue; } - assert_trx_nonlocking_or_in_list(trx); + +#ifdef UNIV_DEBUG + if (trx->is_autocommit_non_locking()) { + ut_ad(trx->read_only); + ut_ad(!trx->is_recovered); + ut_ad(trx->mysql_thd); + ut_ad(trx->in_mysql_trx_list); + const trx_state_t state = trx->state; + ut_ad(state == TRX_STATE_NOT_STARTED + || state == TRX_STATE_ACTIVE); + } + else { + ut_ad(trx->state != TRX_STATE_NOT_STARTED); + } +#endif /* UNIV_DEBUG */ ut_ad(trx->in_rw_trx_list == rw_trx_list); diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index c986a866fe2..ec2d3c1d03f 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2020, MariaDB Corporation. +Copyright (c) 2016, 2021, MariaDB Corporation. 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 @@ -81,12 +81,19 @@ trx_rollback_to_savepoint_low( heap = mem_heap_create(512); roll_node = roll_node_create(heap); + ut_ad(!trx->in_rollback); if (savept != NULL) { roll_node->savept = savept; - check_trx_state(trx); + ut_ad(trx->mysql_thd); + ut_ad(trx->in_mysql_trx_list); + ut_ad(!trx->is_recovered); + ut_ad(trx->state == TRX_STATE_ACTIVE); } else { - assert_trx_nonlocking_or_in_list(trx); + ut_d(trx_state_t state = trx->state); + ut_ad(state == TRX_STATE_ACTIVE + || state == TRX_STATE_PREPARED + || state == TRX_STATE_PREPARED_RECOVERED); } trx->error_state = DB_SUCCESS; @@ -187,7 +194,8 @@ dberr_t trx_rollback_for_mysql(trx_t* trx) switch (trx->state) { case TRX_STATE_NOT_STARTED: - trx->will_lock = 0; + trx->will_lock = false; + ut_ad(trx->mysql_thd); ut_ad(trx->in_mysql_trx_list); #ifdef WITH_WSREP trx->wsrep = false; @@ -196,12 +204,14 @@ dberr_t trx_rollback_for_mysql(trx_t* trx) case TRX_STATE_ACTIVE: ut_ad(trx->in_mysql_trx_list); - assert_trx_nonlocking_or_in_list(trx); + ut_ad(trx->mysql_thd); + ut_ad(!trx->is_recovered); + ut_ad(!trx->is_autocommit_non_locking() || trx->read_only); return(trx_rollback_for_mysql_low(trx)); case TRX_STATE_PREPARED: case TRX_STATE_PREPARED_RECOVERED: - ut_ad(!trx_is_autocommit_non_locking(trx)); + ut_ad(!trx->is_autocommit_non_locking()); if (trx->has_logged_persistent()) { /* The XA ROLLBACK of a XA PREPARE transaction will consist of multiple mini-transactions. @@ -245,7 +255,7 @@ dberr_t trx_rollback_for_mysql(trx_t* trx) return(trx_rollback_for_mysql_low(trx)); case TRX_STATE_COMMITTED_IN_MEMORY: - check_trx_state(trx); + ut_ad(!trx->is_autocommit_non_locking()); break; } @@ -274,7 +284,9 @@ trx_rollback_last_sql_stat_for_mysql( return(DB_SUCCESS); case TRX_STATE_ACTIVE: - assert_trx_nonlocking_or_in_list(trx); + ut_ad(trx->mysql_thd); + ut_ad(!trx->is_recovered); + ut_ad(!trx->is_autocommit_non_locking() || trx->read_only); trx->op_info = "rollback of SQL statement"; @@ -768,7 +780,11 @@ trx_roll_must_shutdown() t != NULL; t = UT_LIST_GET_NEXT(trx_list, t)) { - assert_trx_in_rw_list(t); + ut_ad(!t->read_only); + ut_ad(t->in_rw_trx_list); + ut_ad(!t->is_autocommit_non_locking()); + ut_ad(t->state != TRX_STATE_NOT_STARTED); + if (t->is_recovered && trx_state_eq(t, TRX_STATE_ACTIVE)) { n_trx++; @@ -831,7 +847,10 @@ trx_rollback_or_clean_recovered( trx != NULL; trx = UT_LIST_GET_NEXT(trx_list, trx)) { - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); + ut_ad(trx->state != TRX_STATE_NOT_STARTED); /* If this function does a cleanup or rollback then it will release the trx_sys->mutex, therefore diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 9138e9475bf..c8c68c37333 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -513,7 +513,9 @@ trx_sys_init_at_db_start() trx = UT_LIST_GET_NEXT(trx_list, trx)) { ut_ad(trx->is_recovered); - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); if (trx_state_eq(trx, TRX_STATE_ACTIVE)) { rows_to_undo += trx->undo_no; @@ -1026,7 +1028,8 @@ trx_sys_validate_trx_list_low( trx != NULL; prev_trx = trx, trx = UT_LIST_GET_NEXT(trx_list, prev_trx)) { - check_trx_state(trx); + ut_ad(!trx->is_autocommit_non_locking()); + ut_ad(trx->state != TRX_STATE_NOT_STARTED); ut_a(prev_trx == NULL || prev_trx->id > trx->id); } diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index d1b35bd84a3..3e558a7181d 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -133,7 +133,7 @@ trx_init( trx->auto_commit = false; - trx->will_lock = 0; + trx->will_lock = false; trx->ddl = false; @@ -336,13 +336,13 @@ trx_t *trx_allocate_for_background() MEM_MAKE_DEFINED(trx, sizeof *trx); #endif - assert_trx_is_free(trx); + trx->assert_freed(); mem_heap_t* heap; ib_alloc_t* alloc; /* We just got trx from pool, it should be non locking */ - ut_ad(trx->will_lock == 0); + ut_ad(!trx->will_lock); ut_ad(trx->state == TRX_STATE_NOT_STARTED); DBUG_LOG("trx", "Create: " << trx); @@ -369,7 +369,8 @@ trx_t *trx_allocate_for_background() /** Free the memory to trx_pools */ inline void trx_t::free() { - assert_trx_is_inactive(this); + assert_freed(); + ut_ad(!dict_operation_lock_mode); MEM_CHECK_DEFINED(this, sizeof *this); @@ -539,7 +540,8 @@ trx_validate_state_before_free(trx_t* trx) } trx->dict_operation = TRX_DICT_OP_NONE; - assert_trx_is_inactive(trx); + trx->assert_freed(); + ut_ad(!trx->dict_operation_lock_mode); } /** Free and initialize a transaction object instantinated during recovery. @@ -636,7 +638,9 @@ trx_free_prepared( trx->release_locks(); trx_undo_free_prepared(trx); - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); ut_a(!trx->read_only); @@ -685,7 +689,7 @@ trx_disconnect_from_mysql( trx->is_recovered = true; trx->mysql_thd = NULL; /* todo/fixme: suggest to do it at innodb prepare */ - trx->will_lock = 0; + trx->will_lock = false; } trx_sys_mutex_exit(); @@ -1177,11 +1181,10 @@ void trx_t::remove_flush_observer() /** Assign a rollback segment for modifying temporary tables. @return the assigned rollback segment */ -trx_rseg_t* -trx_t::assign_temp_rseg() +trx_rseg_t *trx_t::assign_temp_rseg() { ut_ad(!rsegs.m_noredo.rseg); - ut_ad(!trx_is_autocommit_non_locking(this)); + ut_ad(!is_autocommit_non_locking()); compile_time_assert(ut_is_2pow(TRX_SYS_N_RSEGS)); /* Choose a temporary rollback segment between 0 and 127 @@ -1235,8 +1238,8 @@ trx_start_low( && thd_trx_is_read_only(trx->mysql_thd)); if (!trx->auto_commit) { - ++trx->will_lock; - } else if (trx->will_lock == 0) { + trx->will_lock = true; + } else if (!trx->will_lock) { trx->read_only = true; } @@ -1305,7 +1308,7 @@ trx_start_low( trx_sys_mutex_exit(); } else { - if (!trx_is_autocommit_non_locking(trx)) { + if (!trx->is_autocommit_non_locking()) { /* If this is a read-only transaction that is writing to a temporary table then it needs a transaction id @@ -1691,12 +1694,16 @@ trx_commit_in_memory( { trx->must_flush_log_later = false; - if (trx_is_autocommit_non_locking(trx)) { + if (trx->is_autocommit_non_locking()) { ut_ad(trx->id == 0); ut_ad(trx->read_only); + ut_ad(!trx->will_lock); ut_a(!trx->is_recovered); ut_ad(trx->rsegs.m_redo.rseg == NULL); ut_ad(!trx->in_rw_trx_list); + ut_ad(trx->in_mysql_trx_list); + ut_ad(trx->mysql_thd); + ut_ad(trx->state == TRX_STATE_ACTIVE); /* Note: We are asserting without holding the lock mutex. But that is OK because this transaction is not waiting and cannot @@ -1712,8 +1719,6 @@ trx_commit_in_memory( and it cannot be removed from the mysql_trx_list and freed without first acquiring the trx_sys_t::mutex. */ - ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); - if (trx->read_view != NULL) { trx_sys->mvcc->view_close(trx->read_view, false); } @@ -1866,7 +1871,7 @@ trx_commit_in_memory( /* trx->in_mysql_trx_list would hold between trx_allocate_for_mysql() and trx_free_for_mysql(). It does not hold for recovered transactions or system transactions. */ - assert_trx_is_free(trx); + trx->assert_freed(); trx_init(trx); @@ -1885,30 +1890,20 @@ trx_commit_low( mtr_t* mtr) /*!< in/out: mini-transaction (will be committed), or NULL if trx made no modifications */ { - assert_trx_nonlocking_or_in_list(trx); - ut_ad(!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY)); ut_ad(!mtr || mtr->is_active()); ut_ad(!mtr == !trx->has_logged()); /* undo_no is non-zero if we're doing the final commit. */ if (trx->fts_trx != NULL && trx->undo_no != 0) { - dberr_t error; - - ut_a(!trx_is_autocommit_non_locking(trx)); - - error = fts_commit(trx); + ut_a(!trx->is_autocommit_non_locking()); /* FTS-FIXME: Temporarily tolerate DB_DUPLICATE_KEY instead of dying. This is a possible scenario if there is a crash between insert to DELETED table committing and transaction committing. The fix would be able to return error from this function */ - if (error != DB_SUCCESS && error != DB_DUPLICATE_KEY) { - /* FTS-FIXME: once we can return values from this - function, we should do so and signal an error - instead of just dying. */ - - ut_error; + if (dberr_t error = fts_commit(trx)) { + ut_a(error == DB_DUPLICATE_KEY); } } @@ -2279,7 +2274,6 @@ trx_print_low( /*!< in: mem_heap_get_size(trx->lock.lock_heap) */ { ibool newline; - const char* op_info; ut_ad(trx_sys_mutex_own()); @@ -2308,9 +2302,7 @@ trx_print_low( fprintf(f, ", state %lu", (ulong) trx->state); ut_ad(0); state_ok: - - /* prevent a race condition */ - op_info = trx->op_info; + const char* op_info = trx->op_info; if (*op_info) { putc(' ', f); @@ -2549,7 +2541,7 @@ trx_assert_started( /* Non-locking autocommits should not hold any locks and this function is only called from the locking code. */ - check_trx_state(trx); + ut_ad(!trx->is_autocommit_non_locking()); /* trx->state can change from or to NOT_STARTED while we are holding trx_sys->mutex for non-locking autocommit selects but not for other @@ -2754,7 +2746,9 @@ trx_recover_for_mysql( trx != NULL; trx = UT_LIST_GET_NEXT(trx_list, trx)) { - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); /* The state of a read-write transaction cannot change from or to NOT_STARTED while we are holding the @@ -2821,7 +2815,9 @@ trx_t* trx_get_trx_by_xid_low(const XID* xid) trx != NULL; trx = UT_LIST_GET_NEXT(trx_list, trx)) { trx_mutex_enter(trx); - assert_trx_in_rw_list(trx); + ut_ad(!trx->read_only); + ut_ad(trx->in_rw_trx_list); + ut_ad(!trx->is_autocommit_non_locking()); /* Compare two X/Open XA transaction id's: their length should be the same and binary comparison @@ -2948,7 +2944,7 @@ trx_start_internal_low( /* Ensure it is not flagged as an auto-commit-non-locking transaction. */ - trx->will_lock = 1; + trx->will_lock = true; trx->internal = true; @@ -2964,7 +2960,7 @@ trx_start_internal_read_only_low( /* Ensure it is not flagged as an auto-commit-non-locking transaction. */ - trx->will_lock = 1; + trx->will_lock = true; trx->internal = true; @@ -2985,13 +2981,7 @@ trx_start_for_ddl_low( the data dictionary will be locked in crash recovery. */ trx_set_dict_operation(trx, op); - - /* Ensure it is not flagged as an auto-commit-non-locking - transation. */ - trx->will_lock = 1; - trx->ddl= true; - trx_start_internal_low(trx); return; @@ -3002,7 +2992,7 @@ trx_start_for_ddl_low( trx->ddl = true; ut_ad(trx->dict_operation != TRX_DICT_OP_NONE); - ut_ad(trx->will_lock > 0); + ut_ad(trx->will_lock); return; case TRX_STATE_PREPARED: @@ -3028,7 +3018,7 @@ trx_set_rw_mode( { ut_ad(trx->rsegs.m_redo.rseg == 0); ut_ad(!trx->in_rw_trx_list); - ut_ad(!trx_is_autocommit_non_locking(trx)); + ut_ad(!trx->is_autocommit_non_locking()); ut_ad(!trx->read_only); if (high_level_read_only) { From da094188f60bf67e3d90227304a4ea256fe2630f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 27 Jul 2021 08:52:59 +0300 Subject: [PATCH 85/98] MDEV-24393 InnoDB disregards --skip-external-locking On POSIX systems, InnoDB would unconditionally acquire advisory locks on the files that it opens. On Linux, this would be observable by a large number of entries in /proc/locks. Other storage engines would only acquire advisory locks on files based on the Boolean configuration parameter external_locking. Let InnoDB do the same. NOTE: The --skip-external-locking is activated by default. To have InnoDB acquire advisory locks, --external-locking must be specified. Reviewed by: Sergei Golubchik --- include/my_sys.h | 5 +++-- storage/innobase/os/os0file.cc | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/my_sys.h b/include/my_sys.h index ac1730eeaff..1d2fff0e476 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB Corporation. + Copyright (c) 2010, 2021, MariaDB Corporation. 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 @@ -279,7 +279,8 @@ extern int my_umask_dir, extern my_bool my_use_symdir; extern ulong my_default_record_cache_size; -extern my_bool my_disable_locking, my_disable_async_io, +extern MYSQL_PLUGIN_IMPORT my_bool my_disable_locking; +extern my_bool my_disable_async_io, my_disable_flush_key_blocks, my_disable_symlinks; extern my_bool my_disable_sync, my_disable_copystat_in_redel; extern char wild_many,wild_one,wild_prefix; diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 884cadaf9f6..a793f9b30cb 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -1122,6 +1122,10 @@ os_file_lock( int fd, const char* name) { + if (my_disable_locking) { + return 0; + } + struct flock lk; lk.l_type = F_WRLCK; From e11cae71feb853dc6f2917a2b7ad2f41b294a9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 27 Jul 2021 09:26:24 +0300 Subject: [PATCH 86/98] MDEV-25998 fixup: Assert that a mutex is being held --- storage/innobase/fil/fil0crypt.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 4e710b4bb4f..310693dd02f 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (c) 2014, 2020, MariaDB Corporation. +Copyright (c) 2014, 2021, MariaDB Corporation. 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 @@ -1103,7 +1103,7 @@ static bool fil_crypt_must_remove(const fil_space_t &space) { ut_ad(space.purpose == FIL_TYPE_TABLESPACE); fil_space_crypt_t *crypt_data = space.crypt_data; - mutex_own(&fil_system->mutex); + ut_ad(mutex_own(&fil_system->mutex)); const ulong encrypt_tables= srv_encrypt_tables; if (!crypt_data) return !encrypt_tables; From afe00bb7cce7de279e48a83ededc71b3f8cfafcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 27 Jul 2021 10:44:01 +0300 Subject: [PATCH 87/98] MDEV-25998 fixup: Avoid a hang btr_scrub_start_space(): Avoid an unnecessary tablespace lookup and related acquisition of fil_system->mutex. In MariaDB Server 10.3 we would get deadlocks between that mutex and a crypt_data mutex. The fix was developed by Thirunarayanan Balathandayuthapani. --- storage/innobase/btr/btr0scrub.cc | 16 ++++------------ storage/innobase/fil/fil0crypt.cc | 2 +- storage/innobase/include/btr0scrub.h | 7 +------ 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/storage/innobase/btr/btr0scrub.cc b/storage/innobase/btr/btr0scrub.cc index 60d9c90c310..685e98909db 100644 --- a/storage/innobase/btr/btr0scrub.cc +++ b/storage/innobase/btr/btr0scrub.cc @@ -1,5 +1,5 @@ // Copyright (c) 2014, Google Inc. -// Copyright (c) 2017, MariaDB Corporation. +// Copyright (c) 2017, 2021, MariaDB Corporation. /**************************************************//** @file btr/btr0scrub.cc @@ -835,20 +835,12 @@ btr_scrub_page( /**************************************************************//** Start iterating a space */ -UNIV_INTERN -bool -btr_scrub_start_space( -/*===================*/ - ulint space, /*!< in: space */ - btr_scrub_t* scrub_data) /*!< in/out: scrub data */ +bool btr_scrub_start_space(const fil_space_t &space, btr_scrub_t *scrub_data) { - bool found; - scrub_data->space = space; + scrub_data->space = space.id; scrub_data->current_table = NULL; scrub_data->current_index = NULL; - const page_size_t page_size = fil_space_get_page_size(space, &found); - - scrub_data->compressed = page_size.is_compressed(); + scrub_data->compressed = FSP_FLAGS_GET_ZIP_SSIZE(space.flags) != 0; scrub_data->scrubbing = check_scrub_setting(scrub_data); return scrub_data->scrubbing; } diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 310693dd02f..ff6294e85b7 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1200,7 +1200,7 @@ fil_crypt_space_needs_rotation( key_state->rotate_key_age); crypt_data->rotate_state.scrubbing.is_active = - btr_scrub_start_space(space->id, &state->scrub_data); + btr_scrub_start_space(*space, &state->scrub_data); time_t diff = time(0) - crypt_data->rotate_state.scrubbing. last_scrub_completed; diff --git a/storage/innobase/include/btr0scrub.h b/storage/innobase/include/btr0scrub.h index feaf61784d0..0f17467fb70 100644 --- a/storage/innobase/include/btr0scrub.h +++ b/storage/innobase/include/btr0scrub.h @@ -141,12 +141,7 @@ btr_scrub_skip_page( /**************************************************************** Start iterating a space * @return true if scrubbing is turned on */ -UNIV_INTERN -bool -btr_scrub_start_space( -/*===================*/ - ulint space, /*!< in: space */ - btr_scrub_t* scrub_data); /*!< in/out: scrub data */ +bool btr_scrub_start_space(const fil_space_t &space, btr_scrub_t *scrub_data); /** Complete iterating a space. @param[in,out] scrub_data scrub data */ From c6bff46958faa745f529ac17101a63377925dbd8 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Thu, 18 Jul 2019 23:11:16 +1000 Subject: [PATCH 88/98] MDEV-16026 MDEV-16481 refactor Sys_var_vers_asof MDEV-16026: Forbid global system_versioning_asof in non-default time zone * store `system_versioning_asof` in unix time; * both session and global vars are processed in session timezone; * setting `default` does not copy global variable anymore. Instead, it sets system_time to SYSTEM_TIME_UNSPECIFIED, which means that no 'AS OF' time is applied and `now()` can be assumed As a regression, we cannot assign values below 1970 (UTC) anymore MDEV-16481: set global system_versioning_asof=sf() crashes in specific case * sys_vars.h: add `MYSQL_TIME` field to `set_var::save_result` * sys_vars.ic: get rid of calling `var->value->get_date()` from `Sys_var_vers_asof::update()` * versioning.sysvars: add test; remove double warning refactor Sys_var_vers_asof * inherit from sys_var rather than Sys_var_enum * remove junk "DEFAULT" keyword. There is DEFAULT in SQL grammar for it. * make all conversions in check() to avoid possible errors * avoid double var->value evaluation, which could consequence in undefined behavior --- .../r/sysvars_server_notembedded.result | 2 +- mysql-test/suite/versioning/r/sysvars.result | 129 ++++++++++++++---- mysql-test/suite/versioning/t/sysvars.test | 89 ++++++++++-- sql/mysqld.h | 3 +- sql/set_var.h | 11 ++ sql/sql_select.cc | 6 +- sql/sys_vars.cc | 3 +- sql/sys_vars.ic | 91 +++++++----- 8 files changed, 259 insertions(+), 75 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 6e3792ddaca..e5910608cb4 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -3959,7 +3959,7 @@ VARIABLE_COMMENT Default value for the FOR SYSTEM_TIME AS OF clause NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST DEFAULT +ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TABLE_DEFINITION_CACHE diff --git a/mysql-test/suite/versioning/r/sysvars.result b/mysql-test/suite/versioning/r/sysvars.result index cd858d6cf69..e3af236a7fa 100644 --- a/mysql-test/suite/versioning/r/sysvars.result +++ b/mysql-test/suite/versioning/r/sysvars.result @@ -1,5 +1,7 @@ create table t (a int) with system versioning; +set @before= UNIX_TIMESTAMP(now(6)); insert into t values (1); +set @after= UNIX_TIMESTAMP(now(6)); update t set a= 2; show global variables like 'system_versioning_asof'; Variable_name Value @@ -56,65 +58,71 @@ ERROR 42000: Variable 'system_versioning_asof' can't be set to the value of '201 set system_versioning_asof= '0000-00-00 00:00'; ERROR 42000: Variable 'system_versioning_asof' can't be set to the value of '0000-00-00 00:00' # GLOBAL @@system_versioning_asof -set global system_versioning_asof= '1911-11-11 11:11:11.1111119'; +set global system_versioning_asof= '1991-11-11 11:11:11.1111119'; Warnings: -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' +Note 1292 Truncated incorrect datetime value: '1991-11-11 11:11:11.1111119' show global variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1911-11-11 11:11:11.111111 -set global system_versioning_asof= '1900-01-01 00:00:00'; +system_versioning_asof 1991-11-11 11:11:11.111111 +set global system_versioning_asof= '1990-01-01 00:00:00'; show global variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1900-01-01 00:00:00.000000 -set global system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119'; +system_versioning_asof 1990-01-01 00:00:00.000000 +set global system_versioning_asof= timestamp'1991-11-11 11:11:11.1111119'; Warnings: -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' +Note 1292 Truncated incorrect datetime value: '1991-11-11 11:11:11.1111119' show global variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1911-11-11 11:11:11.111111 -set @ts= timestamp'1900-01-01 00:00:00'; +system_versioning_asof 1991-11-11 11:11:11.111111 +set @ts= timestamp'1990-01-01 00:00:00'; set global system_versioning_asof= @ts; show global variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1900-01-01 00:00:00.000000 +system_versioning_asof 1990-01-01 00:00:00.000000 set global system_versioning_asof= default; select @@global.system_versioning_asof; @@global.system_versioning_asof DEFAULT # SESSION @@system_versioning_asof -set system_versioning_asof= '1911-11-11 11:11:11.1111119'; +set system_versioning_asof= '1991-11-11 11:11:11.1111119'; Warnings: -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' +Note 1292 Truncated incorrect datetime value: '1991-11-11 11:11:11.1111119' show variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1911-11-11 11:11:11.111111 -set system_versioning_asof= '1900-01-01 00:00:00'; +system_versioning_asof 1991-11-11 11:11:11.111111 +set system_versioning_asof= '1990-01-01 00:00:00'; show variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1900-01-01 00:00:00.000000 -set system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119'; +system_versioning_asof 1990-01-01 00:00:00.000000 +set system_versioning_asof= timestamp'1991-11-11 11:11:11.1111119'; Warnings: -Note 1292 Truncated incorrect datetime value: '1911-11-11 11:11:11.1111119' +Note 1292 Truncated incorrect datetime value: '1991-11-11 11:11:11.1111119' show variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1911-11-11 11:11:11.111111 -set @ts= timestamp'1900-01-01 00:00:00'; +system_versioning_asof 1991-11-11 11:11:11.111111 +set @ts= timestamp'1990-01-01 00:00:00'; set system_versioning_asof= @ts; show variables like 'system_versioning_asof'; Variable_name Value -system_versioning_asof 1900-01-01 00:00:00.000000 +system_versioning_asof 1990-01-01 00:00:00.000000 # DEFAULT: value is copied from GLOBAL to SESSION -set global system_versioning_asof= timestamp'1911-11-11 11:11:11.111111'; -set system_versioning_asof= '1900-01-01 00:00:00'; +set global time_zone= "+03:00"; +set time_zone= "+10:00"; +set global system_versioning_asof= timestamp'1991-11-11 11:11:11.111111'; +set system_versioning_asof= '1990-01-01 00:00:00'; select @@global.system_versioning_asof != @@system_versioning_asof as different; different 1 set system_versioning_asof= default; +select @@global.system_versioning_asof != @@system_versioning_asof as different; +different +1 +set global system_versioning_asof= default; select @@global.system_versioning_asof = @@system_versioning_asof as equal; equal 1 +set global time_zone= DEFAULT; +set time_zone= DEFAULT; set global system_versioning_asof= DEFAULT; set system_versioning_asof= DEFAULT; select @@global.system_versioning_asof, @@system_versioning_asof; @@ -142,6 +150,77 @@ select * from t for system_time between '1970-01-01 00:00' and current_timestamp a 2 1 +# MDEV-16026: Global system_versioning_asof must not be used if client sessions can have non-default time zone +# changing time zone should not abuse `system_versioning_asof` +set session time_zone = '+10:00'; +set global system_versioning_asof = '1999-09-08 00:00:00.000000'; +show global variables like 'system_versioning_asof'; +Variable_name Value +system_versioning_asof 1999-09-08 00:00:00.000000 +set session time_zone = '+03:00'; +show global variables like 'system_versioning_asof'; +Variable_name Value +system_versioning_asof 1999-09-07 17:00:00.000000 +set session time_zone = '+03:00'; +set session system_versioning_asof = '2000-09-08 00:00:00.000000'; +show session variables like 'system_versioning_asof'; +Variable_name Value +system_versioning_asof 2000-09-08 00:00:00.000000 +set session time_zone = '+10:00'; +show session variables like 'system_versioning_asof'; +Variable_name Value +system_versioning_asof 2000-09-08 07:00:00.000000 +# global and local time zones should not interfere +show global variables like 'system_versioning_asof'; +Variable_name Value +system_versioning_asof 1999-09-08 00:00:00.000000 +set time_zone= "+10:00"; +set system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as empty; +a +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; +a +1 +set time_zone= "+03:00"; +set system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as empty; +a +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; +a +1 +set global system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; +a +1 +connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; +connection subcon; +select * from t as nonempty; +a +1 +disconnect subcon; +connection default; +set global system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as nonempty; +a +1 +connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; +connection subcon; +select * from t as empty; +a +disconnect subcon; +connection default; +# MDEV-16481: set global system_versioning_asof=sf() crashes in specific case +# Using global variable inside a stored function should not crash +create or replace function now_global() returns timestamp +return CONVERT_TZ(now(), @@session.time_zone, @@global.time_zone); +set global system_versioning_asof= now_global(); +drop function now_global; +set global time_zone= "SYSTEM"; +set time_zone= "SYSTEM"; +set global system_versioning_asof= default; +set system_versioning_asof= default; show status like "Feature_system_versioning"; Variable_name Value Feature_system_versioning 2 @@ -153,7 +232,7 @@ create or replace table t1 (x int) with system versioning; create or replace table t2 (y int); insert into t1 values (1); insert into t2 values (1); -set system_versioning_asof= '1970-01-01 00:00:00'; +set system_versioning_asof= '1970-01-02 00:00:00'; delete t1, t2 from t1 join t2 where t1.x = t2.y; select * from t1 for system_time as of timestamp now(6); x diff --git a/mysql-test/suite/versioning/t/sysvars.test b/mysql-test/suite/versioning/t/sysvars.test index 2f62262fc8e..248020010b6 100644 --- a/mysql-test/suite/versioning/t/sysvars.test +++ b/mysql-test/suite/versioning/t/sysvars.test @@ -1,5 +1,7 @@ create table t (a int) with system versioning; +set @before= UNIX_TIMESTAMP(now(6)); insert into t values (1); +set @after= UNIX_TIMESTAMP(now(6)); update t set a= 2; show global variables like 'system_versioning_asof'; @@ -51,16 +53,16 @@ set system_versioning_asof= '2011-00-28 00:00'; set system_versioning_asof= '0000-00-00 00:00'; --echo # GLOBAL @@system_versioning_asof -set global system_versioning_asof= '1911-11-11 11:11:11.1111119'; +set global system_versioning_asof= '1991-11-11 11:11:11.1111119'; show global variables like 'system_versioning_asof'; -set global system_versioning_asof= '1900-01-01 00:00:00'; +set global system_versioning_asof= '1990-01-01 00:00:00'; show global variables like 'system_versioning_asof'; -set global system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119'; +set global system_versioning_asof= timestamp'1991-11-11 11:11:11.1111119'; show global variables like 'system_versioning_asof'; -set @ts= timestamp'1900-01-01 00:00:00'; +set @ts= timestamp'1990-01-01 00:00:00'; set global system_versioning_asof= @ts; show global variables like 'system_versioning_asof'; @@ -68,26 +70,32 @@ set global system_versioning_asof= default; select @@global.system_versioning_asof; --echo # SESSION @@system_versioning_asof -set system_versioning_asof= '1911-11-11 11:11:11.1111119'; +set system_versioning_asof= '1991-11-11 11:11:11.1111119'; show variables like 'system_versioning_asof'; -set system_versioning_asof= '1900-01-01 00:00:00'; +set system_versioning_asof= '1990-01-01 00:00:00'; show variables like 'system_versioning_asof'; -set system_versioning_asof= timestamp'1911-11-11 11:11:11.1111119'; +set system_versioning_asof= timestamp'1991-11-11 11:11:11.1111119'; show variables like 'system_versioning_asof'; -set @ts= timestamp'1900-01-01 00:00:00'; +set @ts= timestamp'1990-01-01 00:00:00'; set system_versioning_asof= @ts; show variables like 'system_versioning_asof'; --echo # DEFAULT: value is copied from GLOBAL to SESSION -set global system_versioning_asof= timestamp'1911-11-11 11:11:11.111111'; -set system_versioning_asof= '1900-01-01 00:00:00'; +set global time_zone= "+03:00"; +set time_zone= "+10:00"; +set global system_versioning_asof= timestamp'1991-11-11 11:11:11.111111'; +set system_versioning_asof= '1990-01-01 00:00:00'; select @@global.system_versioning_asof != @@system_versioning_asof as different; set system_versioning_asof= default; +select @@global.system_versioning_asof != @@system_versioning_asof as different; +set global system_versioning_asof= default; select @@global.system_versioning_asof = @@system_versioning_asof as equal; +set global time_zone= DEFAULT; +set time_zone= DEFAULT; set global system_versioning_asof= DEFAULT; set system_versioning_asof= DEFAULT; select @@global.system_versioning_asof, @@system_versioning_asof; @@ -100,6 +108,65 @@ select * from t for system_time all; select * from t for system_time from '1970-01-01 00:00' to current_timestamp(6); select * from t for system_time between '1970-01-01 00:00' and current_timestamp(6); +-- echo # MDEV-16026: Global system_versioning_asof must not be used if client sessions can have non-default time zone +-- echo # changing time zone should not abuse `system_versioning_asof` + +set session time_zone = '+10:00'; +set global system_versioning_asof = '1999-09-08 00:00:00.000000'; +show global variables like 'system_versioning_asof'; +set session time_zone = '+03:00'; +show global variables like 'system_versioning_asof'; + +set session time_zone = '+03:00'; +set session system_versioning_asof = '2000-09-08 00:00:00.000000'; +show session variables like 'system_versioning_asof'; +set session time_zone = '+10:00'; +show session variables like 'system_versioning_asof'; +-- echo # global and local time zones should not interfere +show global variables like 'system_versioning_asof'; + +set time_zone= "+10:00"; +set system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as empty; +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; + +set time_zone= "+03:00"; +set system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as empty; +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; + +set global system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; + +--connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) +--connection subcon +select * from t as nonempty; +--disconnect subcon +--connection default + +set global system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as nonempty; + +--connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) +--connection subcon +select * from t as empty; +--disconnect subcon +--connection default + +--echo # MDEV-16481: set global system_versioning_asof=sf() crashes in specific case +--echo # Using global variable inside a stored function should not crash +create or replace function now_global() returns timestamp + return CONVERT_TZ(now(), @@session.time_zone, @@global.time_zone); +set global system_versioning_asof= now_global(); +drop function now_global; + +set global time_zone= "SYSTEM"; +set time_zone= "SYSTEM"; +set global system_versioning_asof= default; +set system_versioning_asof= default; + show status like "Feature_system_versioning"; drop table t; @@ -111,7 +178,7 @@ create or replace table t1 (x int) with system versioning; create or replace table t2 (y int); insert into t1 values (1); insert into t2 values (1); -set system_versioning_asof= '1970-01-01 00:00:00'; +set system_versioning_asof= '1970-01-02 00:00:00'; delete t1, t2 from t1 join t2 where t1.x = t2.y; select * from t1 for system_time as of timestamp now(6); diff --git a/sql/mysqld.h b/sql/mysqld.h index 4f6709f37f4..d40e1d170d0 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -197,7 +197,8 @@ enum vers_system_time_t struct vers_asof_timestamp_t { ulong type; - MYSQL_TIME ltime; + my_time_t unix_time; + ulong second_part; }; enum vers_alter_history_enum diff --git a/sql/set_var.h b/sql/set_var.h index 12e025e4696..6e84c0bd09c 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -278,6 +278,16 @@ public: }; +/** + Structure for holding unix timestamp and high precision second part. + */ +typedef struct my_time_t_hires +{ + my_time_t unix_time; + ulong second_part; +} my_time_t_hires; + + /** set_var_base descendant for assignments to the system variables. */ @@ -296,6 +306,7 @@ public: plugin_ref *plugins; ///< for Sys_var_pluginlist Time_zone *time_zone; ///< for Sys_var_tz LEX_STRING string_value; ///< for Sys_var_charptr and others + my_time_t_hires timestamp; ///< for Sys_var_vers_asof const void *ptr; ///< for Sys_var_struct } save_result; LEX_CSTRING base; /**< for structured variables, like keycache_name.variable_name */ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 29e229adf3c..09d890161f6 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -696,8 +696,12 @@ bool vers_select_conds_t::init_from_sysvar(THD *thd) if (type != SYSTEM_TIME_UNSPECIFIED && type != SYSTEM_TIME_ALL) { DBUG_ASSERT(type == SYSTEM_TIME_AS_OF); + MYSQL_TIME ltime; + thd->variables.time_zone->gmt_sec_to_TIME(<ime, in.unix_time); + ltime.second_part = in.second_part; + start.item= new (thd->mem_root) - Item_datetime_literal(thd, &in.ltime, TIME_SECOND_PART_DIGITS); + Item_datetime_literal(thd, <ime, TIME_SECOND_PART_DIGITS); if (!start.item) return true; } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 43e175887ef..554591cea4b 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -438,11 +438,10 @@ static Sys_var_charptr Sys_my_bind_addr( READ_ONLY GLOBAL_VAR(my_bind_addr_str), CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT(0)); -const char *Sys_var_vers_asof::asof_keywords[]= {"DEFAULT", NULL}; static Sys_var_vers_asof Sys_vers_asof_timestamp( "system_versioning_asof", "Default value for the FOR SYSTEM_TIME AS OF clause", SESSION_VAR(vers_asof_timestamp.type), NO_CMD_LINE, - Sys_var_vers_asof::asof_keywords, DEFAULT(SYSTEM_TIME_UNSPECIFIED)); + DEFAULT(SYSTEM_TIME_UNSPECIFIED)); static const char *vers_alter_history_keywords[]= {"ERROR", "KEEP", NullS}; static Sys_var_enum Sys_vers_alter_history( diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic index 3e35820adef..bcdfaf5697b 100644 --- a/sql/sys_vars.ic +++ b/sql/sys_vars.ic @@ -2631,63 +2631,82 @@ public: }; -class Sys_var_vers_asof: public Sys_var_enum +class Sys_var_vers_asof: public sys_var { -public: - static const char *asof_keywords[]; - public: Sys_var_vers_asof(const char *name_arg, const char *comment, int flag_args, ptrdiff_t off, size_t size, - CMD_LINE getopt, const char *values[], - uint def_val) - : Sys_var_enum(name_arg, comment, flag_args, off, size, - getopt, values, def_val) + CMD_LINE getopt, uint def_val, + PolyLock *lock= NO_MUTEX_GUARD, + binlog_status_enum binlog_status_arg= VARIABLE_NOT_IN_BINLOG, + on_check_function on_check_func= NULL, + on_update_function on_update_func= NULL, + const char *substitute= NULL) + : sys_var(&all_sys_vars, name_arg, comment, flag_args, off, + getopt.id, getopt.arg_type, SHOW_CHAR, def_val, lock, + binlog_status_arg, on_check_func, on_update_func, substitute) { - // setval() accepts string rather enum option.var_type= GET_STR; } virtual bool do_check(THD *thd, set_var *var) { - if (!Sys_var_enum::do_check(thd, var)) + if (!var->value) return false; + MYSQL_TIME ltime; - bool res= var->value->get_date(<ime, TIME_NO_ZERO_IN_DATE|TIME_NO_ZERO_DATE); + bool res= var->value->get_date(<ime, + TIME_NO_ZERO_IN_DATE | TIME_NO_ZERO_DATE); if (!res) { - var->save_result.ulonglong_value= SYSTEM_TIME_AS_OF; + uint error; + var->save_result.timestamp.unix_time= + thd->variables.time_zone->TIME_to_gmt_sec(<ime, &error); + var->save_result.timestamp.second_part= ltime.second_part; + res= error != 0; } return res; } private: - bool update(set_var *var, vers_asof_timestamp_t &out) + static bool update(THD *thd, set_var *var, vers_asof_timestamp_t *out) { - bool res= false; - out.type= static_cast(var->save_result.ulonglong_value); - if (out.type == SYSTEM_TIME_AS_OF) + if (var->value) { - if (var->value) - { - res= var->value->get_date(&out.ltime, TIME_NO_ZERO_IN_DATE|TIME_NO_ZERO_DATE); - } - else // set DEFAULT from global var - { - out= global_var(vers_asof_timestamp_t); - res= false; - } + out->type = SYSTEM_TIME_AS_OF; + out->unix_time = var->save_result.timestamp.unix_time; + out->second_part= var->save_result.timestamp.second_part; } - return res; + return 0; + } + + static void save_default(set_var *var, vers_asof_timestamp_t *out) + { + out->type= SYSTEM_TIME_UNSPECIFIED; } public: virtual bool global_update(THD *thd, set_var *var) { - return update(var, global_var(vers_asof_timestamp_t)); + return update(thd, var, &global_var(vers_asof_timestamp_t)); } virtual bool session_update(THD *thd, set_var *var) { - return update(var, session_var(thd, vers_asof_timestamp_t)); + return update(thd, var, &session_var(thd, vers_asof_timestamp_t)); + } + + virtual bool session_is_default(THD *thd) + { + const vers_asof_timestamp_t &var= session_var(thd, vers_asof_timestamp_t); + return var.type == SYSTEM_TIME_UNSPECIFIED; + } + + virtual void session_save_default(THD *thd, set_var *var) + { + save_default(var, &session_var(thd, vers_asof_timestamp_t)); + } + virtual void global_save_default(THD *thd, set_var *var) + { + save_default(var, &global_var(vers_asof_timestamp_t)); } private: @@ -2696,15 +2715,19 @@ private: switch (val.type) { case SYSTEM_TIME_UNSPECIFIED: - case SYSTEM_TIME_ALL: - return (uchar*) thd->strdup(asof_keywords[val.type]); + return (uchar*)"DEFAULT"; + break; case SYSTEM_TIME_AS_OF: { uchar *buf= (uchar*) thd->alloc(MAX_DATE_STRING_REP_LENGTH); - if (buf &&!my_datetime_to_str(&val.ltime, (char*) buf, 6)) + MYSQL_TIME ltime; + + thd->variables.time_zone->gmt_sec_to_TIME(<ime, val.unix_time); + ltime.second_part= val.second_part; + + if (buf && !my_datetime_to_str(<ime, (char*) buf, 6)) { - // TODO: figure out variable name - my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "system_versioning_asof_timestamp", "NULL (wrong datetime)"); + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.str, "NULL (wrong datetime)"); return (uchar*) thd->strdup("Error: wrong datetime"); } return buf; @@ -2712,7 +2735,7 @@ private: default: break; } - my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "system_versioning_asof_timestamp", "NULL (wrong range type)"); + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.str, "NULL (wrong range type)"); return (uchar*) thd->strdup("Error: wrong range type"); } From 6ed47508c86b7d1761ae325f11aefe27cac31e38 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Thu, 18 Jul 2019 03:15:55 +1000 Subject: [PATCH 89/98] add const qualifiers to sys_var::value_ptr functions and fix const casts This is important since Sys_var_typelib and its descendants return pointers to constant symbols from *_value_ptr, which are situated in write-protected-memory. * functions const-qualified: - value_ptr - session_value_ptr - global_value_ptr - default_value_ptr - Sys_var_vers_asof::value_ptr - other minor private ones * remove C-style typecasts when it discards qualifiers --- sql/item_func.cc | 16 ++-- sql/set_var.cc | 16 ++-- sql/set_var.h | 16 ++-- sql/sql_plugin.cc | 24 +++--- sql/sql_show.cc | 70 ++++++++++++------ sql/sys_vars.cc | 36 +++++---- sql/sys_vars.ic | 184 +++++++++++++++++++++++----------------------- 7 files changed, 198 insertions(+), 164 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index a6d9ecc1d2f..8f55e2c266b 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -5657,7 +5657,7 @@ void Item_func_get_system_var::update_null_value() bool Item_func_get_system_var::fix_length_and_dec() { - char *cptr; + const char *cptr; maybe_null= TRUE; max_length= 0; @@ -5691,9 +5691,12 @@ bool Item_func_get_system_var::fix_length_and_dec() case SHOW_CHAR: case SHOW_CHAR_PTR: mysql_mutex_lock(&LOCK_global_system_variables); - cptr= var->show_type() == SHOW_CHAR ? - (char*) var->value_ptr(current_thd, var_type, &component) : - *(char**) var->value_ptr(current_thd, var_type, &component); + cptr= var->show_type() == SHOW_CHAR ? + reinterpret_cast(var->value_ptr(current_thd, var_type, + &component)) : + *reinterpret_cast(var->value_ptr(current_thd, + var_type, + &component)); if (cptr) max_length= (uint32)system_charset_info->cset->numchars(system_charset_info, cptr, @@ -5706,7 +5709,10 @@ bool Item_func_get_system_var::fix_length_and_dec() case SHOW_LEX_STRING: { mysql_mutex_lock(&LOCK_global_system_variables); - LEX_STRING *ls= ((LEX_STRING*)var->value_ptr(current_thd, var_type, &component)); + const LEX_STRING *ls= + reinterpret_cast(var->value_ptr(current_thd, + var_type, + &component)); max_length= (uint32)system_charset_info->cset->numchars(system_charset_info, ls->str, ls->str + ls->length); diff --git a/sql/set_var.cc b/sql/set_var.cc index 58b6b392449..cc44dbe401b 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -233,12 +233,12 @@ bool sys_var::update(THD *thd, set_var *var) } } -uchar *sys_var::session_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar *sys_var::session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return session_var_ptr(thd); } -uchar *sys_var::global_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar *sys_var::global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return global_var_ptr(); } @@ -271,8 +271,8 @@ bool sys_var::check(THD *thd, set_var *var) return false; } -uchar *sys_var::value_ptr(THD *thd, enum_var_type type, - const LEX_CSTRING *base) +const uchar *sys_var::value_ptr(THD *thd, enum_var_type type, + const LEX_CSTRING *base) const { DBUG_ASSERT(base); if (type == OPT_GLOBAL || scope() == GLOBAL) @@ -510,7 +510,7 @@ bool throw_bounds_warning(THD *thd, const char *name, bool fixed, double v) return false; } -CHARSET_INFO *sys_var::charset(THD *thd) +CHARSET_INFO *sys_var::charset(THD *thd) const { return is_os_charset ? thd->variables.character_set_filesystem : system_charset_info; @@ -1047,7 +1047,7 @@ int set_var_collation_client::update(THD *thd) INFORMATION_SCHEMA.SYSTEM_VARIABLES *****************************************************************************/ static void store_value_ptr(Field *field, sys_var *var, String *str, - uchar *value_ptr) + const uchar *value_ptr) { field->set_notnull(); str= var->val_str_nolock(str, field->table->in_use, value_ptr); @@ -1115,8 +1115,8 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond) fields[3]->store(origin->str, origin->length, scs); // DEFAULT_VALUE - uchar *def= var->is_readonly() && var->option.id < 0 - ? 0 : var->default_value_ptr(thd); + const uchar *def= var->is_readonly() && var->option.id < 0 + ? 0 : var->default_value_ptr(thd); if (def) store_value_ptr(fields[4], var, &strbuf, def); diff --git a/sql/set_var.h b/sql/set_var.h index 6e84c0bd09c..1c02cdcc6e5 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -112,7 +112,7 @@ public: virtual sys_var_pluginvar *cast_pluginvar() { return 0; } bool check(THD *thd, set_var *var); - uchar *value_ptr(THD *thd, enum_var_type type, const LEX_CSTRING *base); + const uchar *value_ptr(THD *thd, enum_var_type type, const LEX_CSTRING *base) const; /** Update the system variable with the default value from either @@ -127,9 +127,9 @@ public: String *val_str(String *str, THD *thd, enum_var_type type, const LEX_CSTRING *base); double val_real(bool *is_null, THD *thd, enum_var_type type, const LEX_CSTRING *base); - SHOW_TYPE show_type() { return show_val_type; } + SHOW_TYPE show_type() const { return show_val_type; } int scope() const { return flags & SCOPE_MASK; } - CHARSET_INFO *charset(THD *thd); + CHARSET_INFO *charset(THD *thd) const; bool is_readonly() const { return flags & READONLY; } /** the following is only true for keycache variables, @@ -208,7 +208,7 @@ public: */ virtual bool session_is_default(THD *thd) { return false; } - virtual uchar *default_value_ptr(THD *thd) + virtual const uchar *default_value_ptr(THD *thd) const { return (uchar*)&option.def_value; } private: @@ -230,18 +230,18 @@ protected: It must be of show_val_type type (my_bool for SHOW_MY_BOOL, int for SHOW_INT, longlong for SHOW_LONGLONG, etc). */ - virtual uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base); - virtual uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); + virtual const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const; + virtual const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; /** A pointer to a storage area of the variable, to the raw data. Typically it's the same as session_value_ptr(), but it's different, for example, for ENUM, that is printed as a string, but stored as a number. */ - uchar *session_var_ptr(THD *thd) + uchar *session_var_ptr(THD *thd) const { return ((uchar*)&(thd->variables)) + offset; } - uchar *global_var_ptr() + uchar *global_var_ptr() const { return ((uchar*)&global_system_variables) + offset; } void *max_var_ptr() diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index ffb7d747537..32ba1d1ea6a 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -293,14 +293,14 @@ public: sys_var_pluginvar(sys_var_chain *chain, const char *name_arg, st_plugin_int *p, st_mysql_sys_var *plugin_var_arg); sys_var_pluginvar *cast_pluginvar() { return this; } - uchar* real_value_ptr(THD *thd, enum_var_type type); - TYPELIB* plugin_var_typelib(void); - uchar* do_value_ptr(THD *thd, enum_var_type type, const LEX_CSTRING *base); - uchar* session_value_ptr(THD *thd, const LEX_CSTRING *base) + uchar* real_value_ptr(THD *thd, enum_var_type type) const; + TYPELIB* plugin_var_typelib(void) const; + const uchar* do_value_ptr(THD *thd, enum_var_type type, const LEX_CSTRING *base) const; + const uchar* session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return do_value_ptr(thd, OPT_SESSION, base); } - uchar* global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar* global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return do_value_ptr(thd, OPT_GLOBAL, base); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return do_value_ptr(thd, OPT_DEFAULT, 0); } bool do_check(THD *thd, set_var *var); virtual void session_save_default(THD *thd, set_var *var) {} @@ -3349,7 +3349,7 @@ sys_var_pluginvar::sys_var_pluginvar(sys_var_chain *chain, const char *name_arg, plugin_opt_set_limits(&option, pv); } -uchar* sys_var_pluginvar::real_value_ptr(THD *thd, enum_var_type type) +uchar* sys_var_pluginvar::real_value_ptr(THD *thd, enum_var_type type) const { if (type == OPT_DEFAULT) { @@ -3423,7 +3423,7 @@ bool sys_var_pluginvar::session_is_default(THD *thd) } -TYPELIB* sys_var_pluginvar::plugin_var_typelib(void) +TYPELIB* sys_var_pluginvar::plugin_var_typelib(void) const { switch (plugin_var->flags & (PLUGIN_VAR_TYPEMASK | PLUGIN_VAR_THDLOCAL)) { case PLUGIN_VAR_ENUM: @@ -3441,12 +3441,10 @@ TYPELIB* sys_var_pluginvar::plugin_var_typelib(void) } -uchar* sys_var_pluginvar::do_value_ptr(THD *thd, enum_var_type type, - const LEX_CSTRING *base) +const uchar* sys_var_pluginvar::do_value_ptr(THD *thd, enum_var_type type, + const LEX_CSTRING *base) const { - uchar* result; - - result= real_value_ptr(thd, type); + const uchar* result= real_value_ptr(thd, type); if ((plugin_var->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_ENUM) result= (uchar*) get_type(plugin_var_typelib(), *(ulong*)result); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 094d7964801..35e0c7364f5 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3568,6 +3568,28 @@ void remove_status_vars(SHOW_VAR *list) } } +/** + A union holding a pointer to a type that can be referred by a status variable. + */ +union Any_pointer { + const void *as_void; + const uchar *as_uchar; + const char *as_char; + const char ** as_charptr; + const double *as_double; + const int * as_int; + const uint * as_uint; + const long *as_long; + const longlong *as_longlong; + const bool *as_bool; + const my_bool *as_my_bool; + const sys_var *as_sys_var; + const system_status_var *as_system_status_var; + const ha_rows *as_ha_rows; + const LEX_STRING *as_lex_cstring; + const SHOW_COMP_OPTION *as_show_comp_options; + intptr as_intptr; +}; /** @brief Returns the value of a system or a status variable. @@ -3592,16 +3614,18 @@ const char* get_one_variable(THD *thd, const CHARSET_INFO **charset, char *buff, size_t *length) { - void *value= variable->value; + Any_pointer value, status_var_value; + value.as_void= variable->value; + status_var_value.as_system_status_var= status_var; const char *pos= buff; const char *end= buff; if (show_type == SHOW_SYS) { - sys_var *var= (sys_var *) value; + const sys_var *var= value.as_sys_var; show_type= var->show_type(); - value= var->value_ptr(thd, value_type, &null_clex_str); + value.as_uchar= var->value_ptr(thd, value_type, &null_clex_str); *charset= var->charset(thd); } @@ -3611,66 +3635,65 @@ const char* get_one_variable(THD *thd, */ switch (show_type) { case SHOW_DOUBLE_STATUS: - value= ((char *) status_var + (intptr) value); + value.as_char= status_var_value.as_char + value.as_intptr; /* fall through */ case SHOW_DOUBLE: /* 6 is the default precision for '%f' in sprintf() */ - end= buff + my_fcvt(*(double *) value, 6, buff, NULL); + end= buff + my_fcvt(*value.as_double, 6, buff, NULL); break; case SHOW_LONG_STATUS: - value= ((char *) status_var + (intptr) value); + value.as_char= status_var_value.as_char + value.as_intptr; /* fall through */ case SHOW_ULONG: case SHOW_LONG_NOFLUSH: // the difference lies in refresh_status() - end= int10_to_str(*(long*) value, buff, 10); + end= int10_to_str(*value.as_long, buff, 10); break; case SHOW_LONGLONG_STATUS: - value= ((char *) status_var + (intptr) value); + value.as_char= status_var_value.as_char + value.as_intptr; /* fall through */ case SHOW_ULONGLONG: - end= longlong10_to_str(*(longlong*) value, buff, 10); + end= longlong10_to_str(*value.as_longlong, buff, 10); break; case SHOW_HA_ROWS: - end= longlong10_to_str((longlong) *(ha_rows*) value, buff, 10); + end= longlong10_to_str((longlong) *value.as_ha_rows, buff, 10); break; case SHOW_BOOL: - end= strmov(buff, *(bool*) value ? "ON" : "OFF"); + end= strmov(buff, *value.as_bool ? "ON" : "OFF"); break; case SHOW_MY_BOOL: - end= strmov(buff, *(my_bool*) value ? "ON" : "OFF"); + end= strmov(buff, *value.as_my_bool ? "ON" : "OFF"); break; case SHOW_UINT32_STATUS: - value= ((char *) status_var + (intptr) value); + value.as_char= status_var_value.as_char + value.as_intptr; /* fall through */ case SHOW_UINT: - end= int10_to_str((long) *(uint*) value, buff, 10); + end= int10_to_str((long) *value.as_uint, buff, 10); break; case SHOW_SINT: - end= int10_to_str((long) *(int*) value, buff, -10); + end= int10_to_str((long) *value.as_int, buff, -10); break; case SHOW_SLONG: - end= int10_to_str(*(long*) value, buff, -10); + end= int10_to_str(*value.as_long, buff, -10); break; case SHOW_SLONGLONG: - end= longlong10_to_str(*(longlong*) value, buff, -10); + end= longlong10_to_str(*value.as_longlong, buff, -10); break; case SHOW_HAVE: { - SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) value; - pos= show_comp_option_name[(int) tmp]; + pos= show_comp_option_name[(int) *value.as_show_comp_options]; end= strend(pos); break; } case SHOW_CHAR: { - if (!(pos= (char*)value)) + if (!(pos= value.as_char)) pos= ""; end= strend(pos); break; } case SHOW_CHAR_PTR: { - if (!(pos= *(char**) value)) + if (!(pos= *value.as_charptr)) pos= ""; end= strend(pos); @@ -3678,11 +3701,10 @@ const char* get_one_variable(THD *thd, } case SHOW_LEX_STRING: { - LEX_STRING *ls=(LEX_STRING*)value; - if (!(pos= ls->str)) + if (!(pos= value.as_lex_cstring->str)) end= pos= ""; else - end= pos + ls->length; + end= pos + value.as_lex_cstring->length; break; } case SHOW_UNDEF: diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 554591cea4b..f873fd224fc 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1702,8 +1702,9 @@ static Sys_var_gtid_binlog_pos Sys_gtid_binlog_pos( READ_ONLY GLOBAL_VAR(opt_gtid_binlog_pos_dummy), NO_CMD_LINE); -uchar * -Sys_var_gtid_binlog_pos::global_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar * +Sys_var_gtid_binlog_pos::global_value_ptr(THD *thd, + const LEX_CSTRING *base) const { char buf[128]; String str(buf, sizeof(buf), system_charset_info); @@ -1730,8 +1731,9 @@ static Sys_var_gtid_current_pos Sys_gtid_current_pos( READ_ONLY GLOBAL_VAR(opt_gtid_current_pos_dummy), NO_CMD_LINE); -uchar * -Sys_var_gtid_current_pos::global_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar * +Sys_var_gtid_current_pos::global_value_ptr(THD *thd, + const LEX_CSTRING *base) const { String str; char *p; @@ -1811,8 +1813,9 @@ Sys_var_gtid_slave_pos::global_update(THD *thd, set_var *var) } -uchar * -Sys_var_gtid_slave_pos::global_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar * +Sys_var_gtid_slave_pos::global_value_ptr(THD *thd, + const LEX_CSTRING *base) const { String str; char *p; @@ -1932,8 +1935,9 @@ Sys_var_gtid_binlog_state::global_update(THD *thd, set_var *var) } -uchar * -Sys_var_gtid_binlog_state::global_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar * +Sys_var_gtid_binlog_state::global_value_ptr(THD *thd, + const LEX_CSTRING *base) const { char buf[512]; String str(buf, sizeof(buf), system_charset_info); @@ -1967,8 +1971,8 @@ static Sys_var_last_gtid Sys_last_gtid( export sys_var *Sys_last_gtid_ptr= &Sys_last_gtid; // for check changing -uchar * -Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_CSTRING *base) +const uchar * +Sys_var_last_gtid::session_value_ptr(THD *thd, const LEX_CSTRING *base) const { char buf[10+1+10+1+20+1]; String str(buf, sizeof(buf), system_charset_info); @@ -2119,9 +2123,10 @@ Sys_var_slave_parallel_mode::global_update(THD *thd, set_var *var) } -uchar * +const uchar * Sys_var_slave_parallel_mode::global_value_ptr(THD *thd, - const LEX_CSTRING *base_name) + const + LEX_CSTRING *base_name) const { Master_info *mi; enum_slave_parallel_mode val= @@ -4950,8 +4955,9 @@ bool Sys_var_rpl_filter::set_filter_value(const char *value, Master_info *mi) return status; } -uchar *Sys_var_rpl_filter::global_value_ptr(THD *thd, - const LEX_CSTRING *base_name) +const uchar * +Sys_var_rpl_filter::global_value_ptr(THD *thd, + const LEX_CSTRING *base_name) const { char buf[256]; String tmp(buf, sizeof(buf), &my_charset_bin); @@ -5063,7 +5069,7 @@ static Sys_var_uint Sys_slave_net_timeout( */ ulonglong Sys_var_multi_source_ulonglong:: -get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset) +get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset) const { Master_info *mi; ulonglong res= 0; // Default value diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic index bcdfaf5697b..5757186e6f2 100644 --- a/sql/sys_vars.ic +++ b/sql/sys_vars.ic @@ -223,7 +223,7 @@ public: { var->save_result.ulonglong_value= option.def_value; } private: T get_max_var() { return *((T*) max_var_ptr()); } - uchar *default_value_ptr(THD *thd) { return (uchar*) &option.def_value; } + const uchar *default_value_ptr(THD *thd) const { return (uchar*) &option.def_value; } }; typedef Sys_var_integer Sys_var_int; @@ -234,25 +234,25 @@ typedef Sys_var_integer Sys_var_ulonglong; typedef Sys_var_integer Sys_var_long; -template<> uchar *Sys_var_int::default_value_ptr(THD *thd) +template<> const uchar *Sys_var_int::default_value_ptr(THD *thd) const { thd->sys_var_tmp.int_value= (int)option.def_value; return (uchar*) &thd->sys_var_tmp.int_value; } -template<> uchar *Sys_var_uint::default_value_ptr(THD *thd) +template<> const uchar *Sys_var_uint::default_value_ptr(THD *thd) const { thd->sys_var_tmp.uint_value= (uint)option.def_value; return (uchar*) &thd->sys_var_tmp.uint_value; } -template<> uchar *Sys_var_long::default_value_ptr(THD *thd) +template<> const uchar *Sys_var_long::default_value_ptr(THD *thd) const { thd->sys_var_tmp.long_value= (long)option.def_value; return (uchar*) &thd->sys_var_tmp.long_value; } -template<> uchar *Sys_var_ulong::default_value_ptr(THD *thd) +template<> const uchar *Sys_var_ulong::default_value_ptr(THD *thd) const { thd->sys_var_tmp.ulong_value= (ulong)option.def_value; return (uchar*) &thd->sys_var_tmp.ulong_value; @@ -382,13 +382,13 @@ public: { var->save_result.ulonglong_value= global_var(ulong); } void global_save_default(THD *thd, set_var *var) { var->save_result.ulonglong_value= option.def_value; } - uchar *valptr(THD *thd, ulong val) - { return (uchar*)typelib.type_names[val]; } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *valptr(THD *thd, ulong val) const + { return reinterpret_cast(typelib.type_names[val]); } + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, ulong)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(ulong)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, (ulong)option.def_value); } ulong get_max_var() { return *((ulong *) max_var_ptr()); } @@ -436,7 +436,7 @@ public: { var->save_result.ulonglong_value= (ulonglong)*(my_bool *)global_value_ptr(thd, 0); } void global_save_default(THD *thd, set_var *var) { var->save_result.ulonglong_value= option.def_value; } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { thd->sys_var_tmp.my_bool_value=(my_bool) option.def_value; return (uchar*) &thd->sys_var_tmp.my_bool_value; @@ -681,7 +681,7 @@ public: void global_save_default(THD *thd, set_var *var) { DBUG_ASSERT(FALSE); } protected: - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return thd->security_ctx->proxy_user[0] ? (uchar *) &(thd->security_ctx->proxy_user[0]) : NULL; @@ -697,7 +697,7 @@ public: {} protected: - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return (uchar*)thd->security_ctx->external_user; } @@ -741,7 +741,7 @@ public: bool global_update(THD *thd, set_var *var); protected: - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; bool set_filter_value(const char *value, Master_info *mi); }; @@ -859,7 +859,7 @@ public: { DBUG_ASSERT(FALSE); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(FALSE); return NULL; @@ -937,19 +937,19 @@ public: var->save_result.string_value.str= ptr; var->save_result.string_value.length= safe_strlen(ptr); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { char buf[256]; DBUG_EXPLAIN(buf, sizeof(buf)); return (uchar*) thd->strdup(buf); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { char buf[256]; DBUG_EXPLAIN_INITIAL(buf, sizeof(buf)); return (uchar*) thd->strdup(buf); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return (uchar*)""; } }; #endif @@ -1025,7 +1025,7 @@ public: return keycache_update(thd, key_cache, offset, new_value); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { KEY_CACHE *key_cache= get_key_cache(base); if (!key_cache) @@ -1210,7 +1210,7 @@ public: lock, binlog_status_arg, on_check_func, on_update_func, substitute) { } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { if (thd->user_connect && thd->user_connect->user_resources.user_conn) return (uchar*) &(thd->user_connect->user_resources.user_conn); @@ -1322,13 +1322,13 @@ public: { var->save_result.ulonglong_value= global_var(ulonglong); } void global_save_default(THD *thd, set_var *var) { var->save_result.ulonglong_value= option.def_value; } - uchar *valptr(THD *thd, ulonglong val) + const uchar *valptr(THD *thd, ulonglong val) const { return (uchar*)flagset_to_string(thd, 0, val, typelib.type_names); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, ulonglong)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(ulonglong)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, option.def_value); } }; @@ -1436,13 +1436,13 @@ public: { var->save_result.ulonglong_value= global_var(ulonglong); } void global_save_default(THD *thd, set_var *var) { var->save_result.ulonglong_value= option.def_value; } - uchar *valptr(THD *thd, ulonglong val) - { return (uchar*)set_to_string(thd, 0, val, typelib.type_names); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *valptr(THD *thd, ulonglong val) const + { return reinterpret_cast(set_to_string(thd, 0, val, typelib.type_names)); } + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, ulonglong)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(ulonglong)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, option.def_value); } ulonglong get_max_var() { return *((ulonglong*) max_var_ptr()); } @@ -1539,7 +1539,7 @@ public: plugin_ref plugin= global_var(plugin_ref); var->save_result.plugin= plugin ? my_plugin_lock(thd, plugin) : 0; } - plugin_ref get_default(THD *thd) + plugin_ref get_default(THD *thd) const { char *default_value= *reinterpret_cast(option.def_value); if (!default_value) @@ -1561,16 +1561,16 @@ public: var->save_result.plugin= get_default(thd); } - uchar *valptr(THD *thd, plugin_ref plugin) + uchar *valptr(THD *thd, plugin_ref plugin) const { return (uchar*)(plugin ? thd->strmake(plugin_name(plugin)->str, plugin_name(plugin)->length) : 0); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, plugin_ref)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(plugin_ref)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, get_default(thd)); } }; @@ -1657,7 +1657,7 @@ public: plugin_ref* plugins= global_var(plugin_ref *); var->save_result.plugins= plugins ? temp_copy_engine_list(thd, plugins) : 0; } - plugin_ref *get_default(THD *thd) + plugin_ref *get_default(THD *thd) const { char *default_value= *reinterpret_cast(option.def_value); if (!default_value) @@ -1671,15 +1671,15 @@ public: var->save_result.plugins= get_default(thd); } - uchar *valptr(THD *thd, plugin_ref *plugins) + uchar *valptr(THD *thd, plugin_ref *plugins) const { - return (uchar*)pretty_print_engine_list(thd, plugins); + return reinterpret_cast(pretty_print_engine_list(thd, plugins)); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, plugin_ref*)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(plugin_ref*)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, get_default(thd)); } }; @@ -1743,16 +1743,16 @@ public: { DBUG_ASSERT(FALSE); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return debug_sync_value_ptr(thd); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(FALSE); return 0; } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return (uchar*)""; } }; #endif /* defined(ENABLED_DEBUG_SYNC) */ @@ -1828,16 +1828,16 @@ public: void global_save_default(THD *thd, set_var *var) { var->save_result.ulonglong_value= option.def_value; } - uchar *valptr(THD *thd, ulonglong val) + uchar *valptr(THD *thd, ulonglong val) const { thd->sys_var_tmp.my_bool_value= (reverse_semantics == !(val & bitmask)); return (uchar*) &thd->sys_var_tmp.my_bool_value; } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, ulonglong)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(ulonglong)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { thd->sys_var_tmp.my_bool_value= option.def_value != 0; return (uchar*) &thd->sys_var_tmp.my_bool_value; @@ -1896,17 +1896,17 @@ public: { var->value= 0; } void global_save_default(THD *thd, set_var *var) { DBUG_ASSERT(FALSE); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { thd->sys_var_tmp.ulonglong_value= read_func(thd); return (uchar*) &thd->sys_var_tmp.ulonglong_value; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(FALSE); return 0; } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { thd->sys_var_tmp.ulonglong_value= 0; return (uchar*) &thd->sys_var_tmp.ulonglong_value; @@ -1962,18 +1962,18 @@ public: { var->value= 0; } void global_save_default(THD *thd, set_var *var) { DBUG_ASSERT(FALSE); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { thd->sys_var_tmp.double_value= thd->start_time + thd->start_time_sec_part/(double)TIME_SECOND_PART_FACTOR; return (uchar*) &thd->sys_var_tmp.double_value; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(FALSE); return 0; } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { thd->sys_var_tmp.double_value= 0; return (uchar*) &thd->sys_var_tmp.double_value; @@ -2032,12 +2032,12 @@ public: } void session_save_default(THD *thd, set_var *var) { } void global_save_default(THD *thd, set_var *var) { } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(FALSE); return 0; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return (uchar*)show_comp_option_name[global_var(enum SHOW_COMP_OPTION)]; } @@ -2107,13 +2107,13 @@ public: void **default_value= reinterpret_cast(option.def_value); var->save_result.ptr= *default_value; } - uchar *valptr(THD *thd, uchar *val) + uchar *valptr(THD *thd, uchar *val) const { return val ? *(uchar**)(val+name_offset) : 0; } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, session_var(thd, uchar*)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(uchar*)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, *(uchar**)option.def_value); } }; @@ -2183,9 +2183,9 @@ public: var->save_result.time_zone= *(Time_zone**)(intptr)option.def_value; } - uchar *valptr(THD *thd, Time_zone *val) - { return (uchar *)(val->get_name()->ptr()); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *valptr(THD *thd, Time_zone *val) const + { return reinterpret_cast(val->get_name()->ptr()); } + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { /* This is an ugly fix for replication: we don't replicate properly queries @@ -2198,9 +2198,9 @@ public: thd->time_zone_used= 1; return valptr(thd, session_var(thd, Time_zone *)); } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return valptr(thd, global_var(Time_zone*)); } - uchar *default_value_ptr(THD *thd) + const uchar *default_value_ptr(THD *thd) const { return valptr(thd, *(Time_zone**)option.def_value); } }; @@ -2359,7 +2359,7 @@ public: /* Use value given in variable declaration */ global_save_default(thd, var); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { ulonglong *tmp, res; tmp= (ulonglong*) (((uchar*)&(thd->variables)) + offset); @@ -2367,11 +2367,11 @@ public: *tmp= res; return (uchar*) tmp; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return session_value_ptr(thd, base); } - ulonglong get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset); + ulonglong get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset) const; bool update_variable(THD *thd, Master_info *mi) { return update_multi_source_variable_func(this, thd, mi); @@ -2419,12 +2419,12 @@ public: { DBUG_ASSERT(false); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(false); return NULL; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; }; @@ -2468,12 +2468,12 @@ public: { DBUG_ASSERT(false); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(false); return NULL; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; }; @@ -2508,13 +2508,13 @@ public: /* Record the attempt to use default so we can error. */ var->value= 0; } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(false); return NULL; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); - uchar *default_value_ptr(THD *thd) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; + const uchar *default_value_ptr(THD *thd) const { return 0; } }; @@ -2550,13 +2550,13 @@ public: /* Record the attempt to use default so we can error. */ var->value= 0; } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(false); return NULL; } - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); - uchar *default_value_ptr(THD *thd) + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; + const uchar *default_value_ptr(THD *thd) const { return 0; } }; @@ -2600,8 +2600,8 @@ public: { DBUG_ASSERT(false); } - uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base); - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const; + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { DBUG_ASSERT(false); return NULL; @@ -2627,7 +2627,7 @@ public: SYSVAR_ASSERT(scope() == GLOBAL); } bool global_update(THD *thd, set_var *var); - uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base); + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; }; @@ -2710,8 +2710,9 @@ public: } private: - uchar *value_ptr(THD *thd, vers_asof_timestamp_t &val) + const uchar *value_ptr(THD *thd, vers_asof_timestamp_t &val) const { + const char *value; switch (val.type) { case SYSTEM_TIME_UNSPECIFIED: @@ -2719,29 +2720,30 @@ private: break; case SYSTEM_TIME_AS_OF: { - uchar *buf= (uchar*) thd->alloc(MAX_DATE_STRING_REP_LENGTH); + char *buf= (char*) thd->alloc(MAX_DATE_STRING_REP_LENGTH); MYSQL_TIME ltime; thd->variables.time_zone->gmt_sec_to_TIME(<ime, val.unix_time); ltime.second_part= val.second_part; - if (buf && !my_datetime_to_str(<ime, (char*) buf, 6)) + value= buf; + if (buf && !my_datetime_to_str(<ime, buf, 6)) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.str, "NULL (wrong datetime)"); - return (uchar*) thd->strdup("Error: wrong datetime"); + value= thd->strdup("Error: wrong datetime"); } - return buf; - } - default: break; } - my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.str, "NULL (wrong range type)"); - return (uchar*) thd->strdup("Error: wrong range type"); + default: + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.str, "NULL (wrong range type)"); + value= thd->strdup("Error: wrong range type"); + } + return reinterpret_cast(value); } public: - virtual uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) + virtual const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const { return value_ptr(thd, session_var(thd, vers_asof_timestamp_t)); } - virtual uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) + virtual const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const { return value_ptr(thd, global_var(vers_asof_timestamp_t)); } }; From 4683ce82d200d4457ca59006bd47a2a5ec0129c6 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 27 Jul 2021 18:45:35 +0200 Subject: [PATCH 90/98] 8.45 --- pcre/AUTHORS | 10 +- pcre/CMakeLists.txt | 73 +- pcre/ChangeLog | 21 +- pcre/LICENCE | 10 +- pcre/Makefile.in | 52 +- pcre/NEWS | 10 +- pcre/NON-AUTOTOOLS-BUILD | 10 +- pcre/README | 11 +- pcre/aclocal.m4 | 61 +- pcre/ar-lib | 17 +- pcre/compile | 6 +- pcre/config.guess | 578 +- pcre/config.h.generic | 16 +- pcre/config.h.in | 10 +- pcre/config.sub | 2814 ++++----- pcre/configure | 8216 ++++++++++++++----------- pcre/configure.ac | 10 +- pcre/depcomp | 2 +- pcre/doc/html/NON-AUTOTOOLS-BUILD.txt | 10 +- pcre/doc/html/README.txt | 11 +- pcre/doc/html/pcre.html | 17 +- pcre/doc/html/pcreapi.html | 10 +- pcre/doc/html/pcredemo.html | 4 +- pcre/doc/html/pcrejit.html | 2 +- pcre/doc/html/pcrepattern.html | 6 +- pcre/doc/html/pcresyntax.html | 2 +- pcre/doc/pcre.3 | 19 +- pcre/doc/pcre.txt | 38 +- pcre/doc/pcreapi.3 | 10 +- pcre/doc/pcredemo.3 | 4 +- pcre/doc/pcrejit.3 | 2 +- pcre/doc/pcrepattern.3 | 6 +- pcre/doc/pcresyntax.3 | 2 +- pcre/install-sh | 157 +- pcre/ltmain.sh | 8 +- pcre/m4/ltversion.m4 | 4 +- pcre/missing | 2 +- pcre/pcre.h.generic | 4 +- pcre/pcre_compile.c | 9 +- pcre/pcre_exec.c | 4 +- pcre/pcredemo.c | 4 +- pcre/test-driver | 10 +- pcre/testdata/testinput1 | 3 + pcre/testdata/testoutput1 | 5 + 44 files changed, 6842 insertions(+), 5438 deletions(-) diff --git a/pcre/AUTHORS b/pcre/AUTHORS index bb8b32835bd..b3398bbc477 100644 --- a/pcre/AUTHORS +++ b/pcre/AUTHORS @@ -2,13 +2,13 @@ THE MAIN PCRE LIBRARY --------------------- Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk +Email local part: Philip.Hazel +Email domain: gmail.com University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2020 University of Cambridge +Copyright (c) 1997-2021 University of Cambridge All rights reserved @@ -19,7 +19,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2020 Zoltan Herczeg +Copyright(c) 2010-2021 Zoltan Herczeg All rights reserved. @@ -30,7 +30,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2020 Zoltan Herczeg +Copyright(c) 2009-2021 Zoltan Herczeg All rights reserved. diff --git a/pcre/CMakeLists.txt b/pcre/CMakeLists.txt index 858a34bd063..16d89ff2365 100644 --- a/pcre/CMakeLists.txt +++ b/pcre/CMakeLists.txt @@ -67,16 +67,23 @@ # 2013-11-05 PH added support for PARENS_NEST_LIMIT # 2016-03-01 PH applied Chris Wilson's patch for MSVC static build # 2016-06-24 PH applied Chris Wilson's revised patch (adds a separate option) +# 2021-06-14 PH changed CMAKE_MODULE_PATH definition to add, not replace +# 2021-06-14 PH applied Wolfgang Stöggl's patch for generating pcre-config and +# libpcre*.pc files (Bugzilla #2583) PROJECT(PCRE C CXX) -# Increased minimum to 2.8.0 to support newer add_test features. Set policy +# Increased minimum to 2.8.5 to support GNUInstallDirs. Set policy # CMP0026 to avoid warnings for the use of LOCATION in GET_TARGET_PROPERTY. -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5) CMAKE_POLICY(SET CMP0026 OLD) -SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake +# For FindReadline.cmake. This was changed to allow setting CMAKE_MODULE_PATH +# on the command line. +# SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake + +LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # external packages FIND_PACKAGE( BZip2 ) @@ -90,6 +97,7 @@ INCLUDE(CheckIncludeFile) INCLUDE(CheckIncludeFileCXX) INCLUDE(CheckFunctionExists) INCLUDE(CheckTypeSize) +INCLUDE(GNUInstallDirs) # for CMAKE_INSTALL_LIBDIR CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) @@ -406,7 +414,7 @@ foreach(configure_line ${configure_lines}) foreach(_substitution_variable ${SEARCHED_VARIABLES}) string(TOUPPER ${_substitution_variable} _substitution_variable_upper) if (NOT ${_substitution_variable_upper}) - string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MACTHED_STRING ${configure_line}) + string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MATCHED_STRING ${configure_line}) if (CMAKE_MATCH_1) set(${_substitution_variable_upper} ${CMAKE_MATCH_1}) endif() @@ -418,8 +426,6 @@ CONFIGURE_FILE(pcre.h.in ${PROJECT_BINARY_DIR}/pcre.h @ONLY) -# What about pcre-config and libpcre.pc? - IF(PCRE_BUILD_PCRECPP) CONFIGURE_FILE(pcre_stringpiece.h.in ${PROJECT_BINARY_DIR}/pcre_stringpiece.h @@ -430,6 +436,49 @@ IF(PCRE_BUILD_PCRECPP) @ONLY) ENDIF(PCRE_BUILD_PCRECPP) +# Generate pkg-config files +SET(PACKAGE_VERSION "${PCRE_MAJOR}.${PCRE_MINOR}") +SET(prefix "${CMAKE_INSTALL_PREFIX}") +SET(exec_prefix "\${prefix}") +SET(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") +SET(includedir "\${prefix}/include") +IF(NOT BUILD_SHARED_LIBS) + SET(PCRE_STATIC_CFLAG "-DPCRE_STATIC") +ENDIF(NOT BUILD_SHARED_LIBS) +# TO-DO: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ + +CONFIGURE_FILE(libpcreposix.pc.in ${PROJECT_BINARY_DIR}/libpcreposix.pc @ONLY) + +IF(PCRE_BUILD_PCRE8) + CONFIGURE_FILE(libpcre.pc.in ${PROJECT_BINARY_DIR}/libpcre.pc @ONLY) + SET(enable_pcre8 "yes") +ELSE() + SET(enable_pcre8 "no") +ENDIF() + +IF(PCRE_BUILD_PCRE16) + CONFIGURE_FILE(libpcre16.pc.in ${PROJECT_BINARY_DIR}/libpcre16.pc @ONLY) + SET(enable_pcre16 "yes") +ELSE() + SET(enable_pcre16 "no") +ENDIF() + +IF(PCRE_BUILD_PCRE32) + CONFIGURE_FILE(libpcre32.pc.in ${PROJECT_BINARY_DIR}/libpcre32.pc @ONLY) + SET(enable_pcre32 "yes") +ELSE() + SET(enable_pcre32 "no") +ENDIF() + +IF(PCRE_BUILD_PCRECPP) + CONFIGURE_FILE(libpcrecpp.pc.in ${PROJECT_BINARY_DIR}/libpcrecpp.pc @ONLY) + SET(enable_cpp "yes") +ELSE() + SET(enable_cpp "no") +ENDIF() + +CONFIGURE_FILE(pcre-config.in pcre-config @ONLY) + # Character table generation OPTION(PCRE_REBUILD_CHARTABLES "Rebuild char tables" OFF) @@ -887,14 +936,15 @@ SET(CMAKE_INSTALL_ALWAYS 1) INSTALL(TARGETS ${targets} RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) INSTALL(FILES ${PCRE_HEADERS} ${PCREPOSIX_HEADERS} DESTINATION include) FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html) FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1) FILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3) +FILE(GLOB pc ${PROJECT_BINARY_DIR}/*.pc) IF(PCRE_BUILD_PCRECPP) INSTALL(FILES ${PCRECPP_HEADERS} DESTINATION include) @@ -912,6 +962,11 @@ ENDIF(PCRE_BUILD_PCRECPP) INSTALL(FILES ${man1} DESTINATION man/man1) INSTALL(FILES ${man3} DESTINATION man/man3) INSTALL(FILES ${html} DESTINATION share/doc/pcre/html) +INSTALL(FILES ${pc} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pcre-config" + DESTINATION bin + # Set 0755 permissions + PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) IF(MSVC AND INSTALL_MSVC_PDB) INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre.pdb @@ -941,7 +996,7 @@ IF(PCRE_SHOW_REPORT) ENDIF(CMAKE_CXX_FLAGS) MESSAGE(STATUS "") MESSAGE(STATUS "") - MESSAGE(STATUS "PCRE configuration summary:") + MESSAGE(STATUS "PCRE-${PCRE_MAJOR}.${PCRE_MINOR} configuration summary:") MESSAGE(STATUS "") MESSAGE(STATUS " Install prefix .................. : ${CMAKE_INSTALL_PREFIX}") MESSAGE(STATUS " C compiler ...................... : ${CMAKE_C_COMPILER}") diff --git a/pcre/ChangeLog b/pcre/ChangeLog index 04d1ef5b2c4..86acd7be68c 100644 --- a/pcre/ChangeLog +++ b/pcre/ChangeLog @@ -1,8 +1,25 @@ ChangeLog for PCRE ------------------ -Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All -development is happening in the PCRE2 10.xx series. +Note that the PCRE 8.xx series (PCRE1) is now at end of life. All development +is happening in the PCRE2 10.xx series. + + +Version 8.45 15-June-2021 +------------------------- + +This is the final release of PCRE1. A few minor tidies are included. + +1. CMakeLists.txt has two user-supplied patches applied, one to allow for the +setting of MODULE_PATH, and the other to support the generation of pcre-config +file and libpcre*.pc files. + +2. There was a memory leak if a compile error occurred when there were more +than 20 named groups (Bugzilla #2613). + +3. Fixed some typos in code and documentation. + +4. Fixed a small (*MARK) bug in the interpreter (Bugzilla #2771). Version 8.44 12 February-2020 diff --git a/pcre/LICENCE b/pcre/LICENCE index 57a544814c8..803b4119e50 100644 --- a/pcre/LICENCE +++ b/pcre/LICENCE @@ -19,13 +19,13 @@ THE BASIC LIBRARY FUNCTIONS --------------------------- Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk +Email local part: Philip.Hazel +Email domain: gmail.com University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2020 University of Cambridge +Copyright (c) 1997-2021 University of Cambridge All rights reserved. @@ -36,7 +36,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2010-2020 Zoltan Herczeg +Copyright(c) 2010-2021 Zoltan Herczeg All rights reserved. @@ -47,7 +47,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2009-2020 Zoltan Herczeg +Copyright(c) 2009-2021 Zoltan Herczeg All rights reserved. diff --git a/pcre/Makefile.in b/pcre/Makefile.in index dd9df7f662c..422161f703c 100644 --- a/pcre/Makefile.in +++ b/pcre/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2020 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -607,8 +607,8 @@ DATA = $(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \ $(html_DATA) $(pkgconfig_DATA) am__include_HEADERS_DIST = pcreposix.h pcrecpp.h pcre_scanner.h HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)config.h.in +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. @@ -784,6 +784,7 @@ am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test @@ -827,6 +828,8 @@ am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-bzip2 dist-gzip dist-zip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -843,7 +846,6 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ @@ -984,6 +986,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -2788,7 +2791,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS) test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ - echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ @@ -2936,6 +2939,10 @@ dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @@ -2977,6 +2984,8 @@ distcheck: dist eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) @@ -2992,7 +3001,7 @@ distcheck: dist $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -3058,7 +3067,8 @@ installdirs: done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -3093,8 +3103,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -@WITH_GCOV_FALSE@clean-local: @WITH_GCOV_FALSE@distclean-local: +@WITH_GCOV_FALSE@clean-local: clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ @@ -3340,24 +3350,24 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-man: uninstall-man1 uninstall-man3 .MAKE: all check check-am install install-am install-data-am \ - install-strip + install-exec install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS clean-cscope \ clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-compile \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-local distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-binSCRIPTS \ - install-data install-data-am install-data-hook \ - install-dist_docDATA install-dist_htmlDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-htmlDATA install-includeHEADERS \ - install-info install-info-am install-libLTLIBRARIES \ - install-man install-man1 install-man3 \ + dist-xz dist-zip dist-zstd distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-data install-data-am \ + install-data-hook install-dist_docDATA install-dist_htmlDATA \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-htmlDATA \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-man1 install-man3 \ install-nodist_includeHEADERS install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ diff --git a/pcre/NEWS b/pcre/NEWS index 3d91b67dfa9..bec4d4b3d39 100644 --- a/pcre/NEWS +++ b/pcre/NEWS @@ -1,8 +1,14 @@ News about PCRE releases ------------------------ -Note that this library (now called PCRE1) is now being maintained for bug fixes -only. New projects are advised to use the new PCRE2 libraries. +Note that this library (now called PCRE1) is no longer being maintained. New +projects are advised to use the PCRE2 libraries. + + +Release 8.45 15-June-2021 +----------------------------- + +This is the final PCRE1 release. A very few small issues have been fixed. Release 8.44 12-February-2020 diff --git a/pcre/NON-AUTOTOOLS-BUILD b/pcre/NON-AUTOTOOLS-BUILD index 37f6164475b..23c4e64f84a 100644 --- a/pcre/NON-AUTOTOOLS-BUILD +++ b/pcre/NON-AUTOTOOLS-BUILD @@ -5,8 +5,8 @@ NOTE: This document relates to PCRE releases that use the original API, with library names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of a new API, known as PCRE2, with release numbers starting at 10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries -(now called PCRE1) are still being maintained for bug fixes, but there will be -no new development. New projects are advised to use the new PCRE2 libraries. +(now called PCRE1) are now at end of life, and 8.45 is the final release. New +projects are advised to use the new PCRE2 libraries. This document contains the following sections: @@ -768,6 +768,6 @@ Everything, source and executable, is in EBCDIC and native z/OS file formats. However, this software is not maintained and will not be upgraded. If you are new to PCRE you should be looking at PCRE2 (version 10.30 or later). -=============================== -Last Updated: 13 September 2017 -=============================== +========================== +Last Updated: 15 June 2021 +========================== diff --git a/pcre/README b/pcre/README index 334362b3e53..65f5e19ef69 100644 --- a/pcre/README +++ b/pcre/README @@ -5,9 +5,8 @@ NOTE: This set of files relates to PCRE releases that use the original API, with library names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of a new API, known as PCRE2, with release numbers starting at 10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. +libraries (now called PCRE1) are now at end of life, and 8.45 is the final +release. New projects are advised to use the new PCRE2 libraries. The latest release of PCRE1 is always available in three alternative formats @@ -998,6 +997,6 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. RunTest.bat a script for running tests under Windows Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 12 February 2020 +Email local part: Philip.Hazel +Email domain: gmail.com +Last updated: 15 June 2021 diff --git a/pcre/aclocal.m4 b/pcre/aclocal.m4 index 85368ab8791..2b2fc4a2fc6 100644 --- a/pcre/aclocal.m4 +++ b/pcre/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.3 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,8 +14,8 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) @@ -364,7 +364,7 @@ AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES -# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# Copyright (C) 2002-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -379,7 +379,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.16.1], [], +m4_if([$1], [1.16.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -395,12 +395,12 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.16.1])dnl +[AM_AUTOMAKE_VERSION([1.16.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# Copyright (C) 2011-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -462,7 +462,7 @@ AC_SUBST([AR])dnl # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -514,7 +514,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -545,7 +545,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -736,7 +736,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -775,7 +775,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi @@ -802,7 +804,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -999,7 +1001,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1020,7 +1022,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# Copyright (C) 2003-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1041,7 +1043,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1084,7 +1086,7 @@ AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# Copyright (C) 1997-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1105,12 +1107,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then @@ -1123,7 +1120,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1152,7 +1149,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1199,7 +1196,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1218,7 +1215,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1299,7 +1296,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# Copyright (C) 2009-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1359,7 +1356,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# Copyright (C) 2001-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1387,7 +1384,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# Copyright (C) 2006-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1406,7 +1403,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# Copyright (C) 2004-2020 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/pcre/ar-lib b/pcre/ar-lib index 0baa4f60760..1e9388e2ae3 100755 --- a/pcre/ar-lib +++ b/pcre/ar-lib @@ -2,9 +2,9 @@ # Wrapper for Microsoft lib.exe me=ar-lib -scriptversion=2012-03-01.08; # UTC +scriptversion=2019-07-04.01; # UTC -# Copyright (C) 2010-2018 Free Software Foundation, Inc. +# Copyright (C) 2010-2020 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify @@ -53,7 +53,7 @@ func_file_conv () MINGW*) file_conv=mingw ;; - CYGWIN*) + CYGWIN* | MSYS*) file_conv=cygwin ;; *) @@ -65,7 +65,7 @@ func_file_conv () mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; - cygwin) + cygwin | msys) file=`cygpath -m "$file" || echo "$file"` ;; wine) @@ -224,10 +224,11 @@ elif test -n "$extract"; then esac done else - $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member - do - $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? - done + $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \ + | while read member + do + $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? + done fi elif test -n "$quick$replace"; then diff --git a/pcre/compile b/pcre/compile index 99e50524b3b..23fcba01132 100755 --- a/pcre/compile +++ b/pcre/compile @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -53,7 +53,7 @@ func_file_conv () MINGW*) file_conv=mingw ;; - CYGWIN*) + CYGWIN* | MSYS*) file_conv=cygwin ;; *) @@ -67,7 +67,7 @@ func_file_conv () mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; - cygwin/*) + cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) diff --git a/pcre/config.guess b/pcre/config.guess index 256083a70d3..0fc11edb2d1 100755 --- a/pcre/config.guess +++ b/pcre/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2018-03-08' +timestamp='2020-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ timestamp='2018-03-08' # Please send patches to . -me=`echo "$0" | sed -e 's,.*/,,'` +me=$(echo "$0" | sed -e 's,.*/,,') usage="\ Usage: $0 [OPTION] @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,8 +84,6 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 - # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -96,41 +94,47 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > "$dummy.c" ; - for c in cc gcc c89 c99 ; do - if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown +UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown +UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown +UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) @@ -138,7 +142,7 @@ Linux|GNU|GNU/*) # We could probably try harder. LIBC=gnu - eval "$set_cc_for_build" + set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) @@ -146,17 +150,15 @@ Linux|GNU|GNU/*) #elif defined(__dietlibc__) LIBC=dietlibc #else + #include + #ifdef __DEFINED_va_list + LIBC=musl + #else LIBC=gnu #endif + #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" - - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl - fi + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')" ;; esac @@ -175,19 +177,20 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ - echo unknown)` + echo unknown)) case "$UNAME_MACHINE_ARCH" in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,') + endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p') machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; @@ -199,7 +202,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval "$set_cc_for_build" + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -218,7 +221,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr") ;; esac # The OS release @@ -231,24 +234,24 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in release='-gnu' ;; *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2) ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi}" + echo "$machine-${os}${release}${abi-}" exit ;; *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//') echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//') echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//') echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) @@ -260,6 +263,9 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; @@ -269,26 +275,29 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + echo mips-dec-osf1 + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}') ;; *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}') ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1) case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; @@ -326,7 +335,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -360,7 +369,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then + if test "$( (/bin/universe) 2>/dev/null)" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd @@ -373,28 +382,28 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in + case $(/usr/bin/uname -p) in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval "$set_cc_for_build" + set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null @@ -402,30 +411,30 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in SUN_ARCH=x86_64 fi fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case "$(/usr/bin/arch -k)" in Series*|S4*) - UNAME_RELEASE=`uname -v` + UNAME_RELEASE=$(uname -v) ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null) test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in + case "$(/bin/arch)" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; @@ -482,7 +491,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ @@ -505,8 +514,8 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && + dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') && + SYSTEM_NAME=$("$dummy" "$dummyarg") && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; @@ -533,11 +542,11 @@ EOF exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + UNAME_PROCESSOR=$(/usr/bin/uname -p) + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then echo m88k-dg-dgux"$UNAME_RELEASE" else @@ -561,17 +570,17 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if test -x /usr/bin/oslevel ; then + IBM_REV=$(/usr/bin/oslevel) else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi @@ -579,7 +588,7 @@ EOF exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include @@ -591,7 +600,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") then echo "$SYSTEM_NAME" else @@ -604,15 +613,15 @@ EOF fi exit ;; *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }') if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + if test -x /usr/bin/lslpp ; then + IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/) else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi @@ -640,14 +649,14 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + if test -x /usr/bin/getconf; then + sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null) + sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null) case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 @@ -659,8 +668,8 @@ EOF esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then - eval "$set_cc_for_build" + if test "$HP_ARCH" = ""; then + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE @@ -694,13 +703,13 @@ EOF exit (0); } EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy") test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if test "$HP_ARCH" = hppa2.0w then - eval "$set_cc_for_build" + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -722,11 +731,11 @@ EOF echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval "$set_cc_for_build" + set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int @@ -752,7 +761,7 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; @@ -772,7 +781,7 @@ EOF echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then + if test -x /usr/sbin/sysversion ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 @@ -821,14 +830,14 @@ EOF echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/') echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/') echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -840,15 +849,26 @@ EOF *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=$(uname -p) + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf + fi + exit ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=$(/usr/bin/uname -p) case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin @@ -881,21 +901,21 @@ EOF echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin + echo x86_64-pc-cygwin exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" exit ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC" exit ;; - i*86:Minix:*:*) - echo "$UNAME_MACHINE"-pc-minix + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -905,7 +925,7 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -922,7 +942,7 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then @@ -971,23 +991,51 @@ EOF echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) - eval "$set_cc_for_build" + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" - test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -1006,7 +1054,7 @@ EOF exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; @@ -1046,7 +1094,17 @@ EOF echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -1086,7 +1144,7 @@ EOF echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//') if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else @@ -1095,19 +1153,19 @@ EOF exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in + case $(/bin/uname -X | grep "^Machine") in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //')) (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 @@ -1157,7 +1215,7 @@ EOF 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1168,7 +1226,7 @@ EOF NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ @@ -1201,7 +1259,7 @@ EOF exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` + UNAME_MACHINE=$( (uname -p) 2>/dev/null) echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv @@ -1235,7 +1293,7 @@ EOF echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then + if test -d /usr/nec; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" @@ -1283,44 +1341,48 @@ EOF *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval "$set_cc_for_build" - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc + UNAME_PROCESSOR=$(uname -p) + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build fi - if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` + UNAME_PROCESSOR=$(uname -p) if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc @@ -1358,6 +1420,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. + # shellcheck disable=SC2154 if test "$cputype" = 386; then UNAME_MACHINE=i386 else @@ -1387,10 +1450,10 @@ EOF echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" exit ;; *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` + UNAME_MACHINE=$( (uname -p) 2>/dev/null) case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; @@ -1400,7 +1463,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos @@ -1414,8 +1477,148 @@ EOF amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; esac +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null); + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in @@ -1438,6 +1641,12 @@ copies of config.guess and config.sub with the latest versions from: https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess and https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +EOF + +year=$(echo $timestamp | sed 's,-.*,,') +# shellcheck disable=SC2003 +if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then + cat >&2 </dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` +uname -m = $( (uname -m) 2>/dev/null || echo unknown) +uname -r = $( (uname -r) 2>/dev/null || echo unknown) +uname -s = $( (uname -s) 2>/dev/null || echo unknown) +uname -v = $( (uname -v) 2>/dev/null || echo unknown) -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` +/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null) +/bin/uname -X = $( (/bin/uname -X) 2>/dev/null) -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` +hostinfo = $( (hostinfo) 2>/dev/null) +/bin/universe = $( (/bin/universe) 2>/dev/null) +/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null) +/bin/arch = $( (/bin/arch) 2>/dev/null) +/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null) +/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null) UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 diff --git a/pcre/config.h.generic b/pcre/config.h.generic index 1da2ac16002..b0d46f71a3e 100644 --- a/pcre/config.h.generic +++ b/pcre/config.h.generic @@ -84,9 +84,6 @@ sure both macros are undefined; an emulation function will then be used. */ /* Define to 1 if you have the `memmove' function. */ /* #undef HAVE_MEMMOVE */ -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MEMORY_H */ - /* Define if you have POSIX threads libraries and header files. */ /* #undef HAVE_PTHREAD */ @@ -102,6 +99,9 @@ sure both macros are undefined; an emulation function will then be used. */ /* Define to 1 if you have the header file. */ /* #undef HAVE_STDINT_H */ +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDIO_H */ + /* Define to 1 if you have the header file. */ /* #undef HAVE_STDLIB_H */ @@ -235,7 +235,7 @@ sure both macros are undefined; an emulation function will then be used. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "PCRE 8.44" +#define PACKAGE_STRING "PCRE 8.45" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" @@ -244,7 +244,7 @@ sure both macros are undefined; an emulation function will then be used. */ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "8.44" +#define PACKAGE_VERSION "8.45" /* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested parentheses (of any kind) in a pattern. This limits the amount of system @@ -291,7 +291,9 @@ sure both macros are undefined; an emulation function will then be used. */ your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ /* #undef STDC_HEADERS */ /* Define to any value to enable support for Just-In-Time compiling. */ @@ -336,7 +338,7 @@ sure both macros are undefined; an emulation function will then be used. */ /* #undef SUPPORT_VALGRIND */ /* Version number of package */ -#define VERSION "8.44" +#define VERSION "8.45" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ diff --git a/pcre/config.h.in b/pcre/config.h.in index 0b2f45d4d51..9fde4021f56 100644 --- a/pcre/config.h.in +++ b/pcre/config.h.in @@ -84,9 +84,6 @@ sure both macros are undefined; an emulation function will then be used. */ /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD @@ -102,6 +99,9 @@ sure both macros are undefined; an emulation function will then be used. */ /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H @@ -289,7 +289,9 @@ sure both macros are undefined; an emulation function will then be used. */ your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define to any value to enable support for Just-In-Time compiling. */ diff --git a/pcre/config.sub b/pcre/config.sub index 9ccf09a7a33..c874b7a9df8 100755 --- a/pcre/config.sub +++ b/pcre/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2018 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2018-03-08' +timestamp='2020-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ timestamp='2018-03-08' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. -me=`echo "$0" | sed -e 's,.*/,,'` +me=$(echo "$0" | sed -e 's,.*/,,') usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS @@ -67,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -89,7 +89,7 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) @@ -110,1223 +110,1167 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | cloudabi*-eabi* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo "$1" | sed 's/-[^-]*$//'` - if [ "$basic_machine" != "$1" ] - then os=`echo "$1" | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -bluegene*) - os=-cnk + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | ba \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pru \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | wasm32 \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - c54x) - basic_machine=tic54x-unknown + op50n) + cpu=hppa1.1 + vendor=oki ;; - c55x) - basic_machine=tic55x-unknown + op60c) + cpu=hppa1.1 + vendor=oki ;; - c6x) - basic_machine=tic6x-unknown + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none ;; leon|leon[3-9]) - basic_machine=sparc-$basic_machine + cpu=sparc + vendor=$basic_machine ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) - ;; - ms1) - basic_machine=mt-unknown + leon-*|leon[3-9]-*) + cpu=sparc + vendor=$(echo "$basic_machine" | sed 's/-.*//') ;; - strongarm | thumb | xscale) - basic_machine=arm-unknown + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | ba-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pru-* \ - | pyramid-* \ - | riscv32-* | riscv64-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | wasm32-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-pc - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2*) - basic_machine=m68k-bull - os=-sysv3 - ;; - e500v[12]) - basic_machine=powerpc-unknown - os=$os"spe" - ;; - e500v[12]-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=$os"spe" - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - moxiebox) - basic_machine=moxie-unknown - os=-moxiebox - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i686-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - nsv-tandem) - basic_machine=nsv-tandem - ;; - nsx-tandem) - basic_machine=nsx-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 + cpu=$basic_machine + vendor=pc ;; + # These rules are duplicated from below for sake of the special case above; + # i.e. things that normalized to x86 arches should also default to "pc" pc98) - basic_machine=i386-pc + cpu=i386 + vendor=pc ;; - pc98-*) - basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + x64 | amd64) + cpu=x86_64 + vendor=pc ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc + # Recognize the basic CPU types without company name. + *) + cpu=$basic_machine + vendor=unknown ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc +esac + +unset -v basic_machine + +# Decode basic machines in the full and proper CPU-Company form. +case $cpu-$vendor in + # Here we handle the default manufacturer of certain CPU types in canonical form. It is in + # some cases the only manufacturer, in others, it is the most popular. + craynv-unknown) + vendor=cray + basic_os=${basic_os:-unicosmp} ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc + c90-unknown | c90-cray) + vendor=cray + basic_os=${Basic_os:-unicos} ;; - pentium4) - basic_machine=i786-pc + fx80-unknown) + vendor=alliant ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + romp-unknown) + vendor=ibm ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + mmix-unknown) + vendor=knuth ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + microblaze-unknown | microblazeel-unknown) + vendor=xilinx ;; - pentium4-*) - basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + rs6000-unknown) + vendor=ibm ;; - pn) - basic_machine=pn-gould + vax-unknown) + vendor=dec ;; - power) basic_machine=power-ibm + pdp11-unknown) + vendor=dec ;; - ppc | ppcbe) basic_machine=powerpc-unknown + we32k-unknown) + vendor=att ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + cydra-unknown) + vendor=cydrome ;; - ppcle | powerpclittle) - basic_machine=powerpcle-unknown + i370-ibm*) + vendor=ibm ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + orion-unknown) + vendor=highlevel ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - x64) - basic_machine=x86_64-pc - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - none) - basic_machine=none-none - os=-none + xps-unknown | xps100-unknown) + cpu=xps100 + vendor=honeywell ;; -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond + # Here we normalize CPU types with a missing or matching vendor + dpx20-unknown | dpx20-bull) + cpu=rs6000 + vendor=bull + basic_os=${basic_os:-bosx} ;; - op50n) - basic_machine=hppa1.1-oki + + # Here we normalize CPU types irrespective of the vendor + amd64-*) + cpu=x86_64 ;; - op60c) - basic_machine=hppa1.1-oki + blackfin-*) + cpu=bfin + basic_os=linux ;; - romp) - basic_machine=romp-ibm + c54x-*) + cpu=tic54x ;; - mmix) - basic_machine=mmix-knuth + c55x-*) + cpu=tic55x ;; - rs6000) - basic_machine=rs6000-ibm + c6x-*) + cpu=tic6x ;; - vax) - basic_machine=vax-dec + e500v[12]-*) + cpu=powerpc + basic_os=${basic_os}"spe" ;; - pdp11) - basic_machine=pdp11-dec + mips3*-*) + cpu=mips64 ;; - we32k) - basic_machine=we32k-att + ms1-*) + cpu=mt ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown + m68knommu-*) + cpu=m68k + basic_os=linux ;; - cydra) - basic_machine=cydra-cydrome + m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) + cpu=s12z ;; - orion) - basic_machine=orion-highlevel + openrisc-*) + cpu=or32 ;; - orion105) - basic_machine=clipper-highlevel + parisc-*) + cpu=hppa + basic_os=linux ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + cpu=i586 ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + cpu=i686 ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + cpu=i686 ;; + pentium4-*) + cpu=i786 + ;; + pc98-*) + cpu=i386 + ;; + ppc-* | ppcbe-*) + cpu=powerpc + ;; + ppcle-* | powerpclittle-*) + cpu=powerpcle + ;; + ppc64-*) + cpu=powerpc64 + ;; + ppc64le-* | powerpc64little-*) + cpu=powerpc64le + ;; + sb1-*) + cpu=mipsisa64sb1 + ;; + sb1el-*) + cpu=mipsisa64sb1el + ;; + sh5e[lb]-*) + cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/') + ;; + spur-*) + cpu=spur + ;; + strongarm-* | thumb-*) + cpu=arm + ;; + tx39-*) + cpu=mipstx39 + ;; + tx39el-*) + cpu=mipstx39el + ;; + x64-*) + cpu=x86_64 + ;; + xscale-* | xscalee[bl]-*) + cpu=$(echo "$cpu" | sed 's/^xscale/arm/') + ;; + arm64-*) + cpu=aarch64 + ;; + + # Recognize the canonical CPU Types that limit and/or modify the + # company names they are paired with. + cr16-*) + basic_os=${basic_os:-elf} + ;; + crisv32-* | etraxfs*-*) + cpu=crisv32 + vendor=axis + ;; + cris-* | etrax*-*) + cpu=cris + vendor=axis + ;; + crx-*) + basic_os=${basic_os:-elf} + ;; + neo-tandem) + cpu=neo + vendor=tandem + ;; + nse-tandem) + cpu=nse + vendor=tandem + ;; + nsr-tandem) + cpu=nsr + vendor=tandem + ;; + nsv-tandem) + cpu=nsv + vendor=tandem + ;; + nsx-tandem) + cpu=nsx + vendor=tandem + ;; + mipsallegrexel-sony) + cpu=mipsallegrexel + vendor=sony + ;; + tile*-*) + basic_os=${basic_os:-linux-gnu} + ;; + *) - echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv64 \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1334,203 +1278,213 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x$basic_os != x then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|') + ;; + os2-emx) + kernel=os2 + os=$(echo $basic_os | sed -e 's|os2-emx|emx|') + ;; + nto-qnx*) + kernel=nto + os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|') + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1543,254 +1497,352 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +kernel= +case $cpu-$vendor in score-*) - os=-elf + os=elf ;; spu-*) - os=-elf + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os=aout ;; c4x-* | tic4x-*) - os=-coff + os=coff ;; c8051-*) - os=-elf + os=elf + ;; + clipper-intergraph) + os=clix ;; hexagon-*) - os=-elf + os=elf ;; tic54x-*) - os=-coff + os=coff ;; tic55x-*) - os=-coff + os=coff ;; tic6x-*) - os=-coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; mep-*) - os=-elf + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 ;; pru-*) - os=-elf + os=elf ;; *-be) - os=-beos + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna + os=luna ;; *-next) - os=-nextstep + os=nextstep ;; *-sequent) - os=-ptx + os=ptx ;; *-crds) - os=-unos + os=unos ;; *-ns) - os=-genix + os=genix ;; i370-*) - os=-mvs + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-abi", so those need to count as OSes. + musl* | newlib* | uclibc*) + ;; + # Likewise for "kernel-libc" + eabi | eabihf | gnueabi | gnueabihf) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) vendor=ibm ;; - -os400*) + *-os400*) vendor=ibm ;; - -ptx*) + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac -echo "$basic_machine$os" +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: diff --git a/pcre/configure b/pcre/configure index 6d2a48e200a..2711b186f3f 100755 --- a/pcre/configure +++ b/pcre/configure @@ -1,9 +1,10 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for PCRE 8.44. +# Generated by GNU Autoconf 2.71 for PCRE 8.45. # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -14,14 +15,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -31,46 +34,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -94,8 +90,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -107,30 +107,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -152,20 +132,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -185,18 +167,20 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' @@ -204,31 +188,40 @@ test \$(( 1 + 1 )) = 2 || exit 1 ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -236,14 +229,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -261,18 +261,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." @@ -299,6 +300,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -316,6 +318,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -330,7 +340,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -339,7 +349,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -378,12 +388,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -395,18 +406,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -418,9 +438,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -447,7 +467,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -491,7 +511,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -505,6 +525,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -518,6 +542,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -587,48 +618,44 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='PCRE' PACKAGE_TARNAME='pcre' -PACKAGE_VERSION='8.44' -PACKAGE_STRING='PCRE 8.44' +PACKAGE_VERSION='8.45' +PACKAGE_STRING='PCRE 8.45' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="pcre.h.in" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS @@ -706,6 +733,8 @@ ac_ct_DUMPBIN DUMPBIN LD FGREP +EGREP +GREP SED LIBTOOL OBJDUMP @@ -719,9 +748,6 @@ build_os build_vendor build_cpu build -EGREP -GREP -CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE @@ -792,6 +818,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -868,7 +895,6 @@ CPPFLAGS CXX CXXFLAGS CCC -CPP LT_SYS_LIBRARY_PATH CXXCPP PKG_CONFIG @@ -916,6 +942,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -945,8 +972,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -987,9 +1012,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1013,9 +1038,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1168,6 +1193,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1217,9 +1251,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1233,9 +1267,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1279,9 +1313,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1297,7 +1331,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1305,7 +1339,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1361,7 +1395,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1418,7 +1452,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures PCRE 8.44 to adapt to many kinds of systems. +\`configure' configures PCRE 8.45 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1458,6 +1492,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1488,7 +1523,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PCRE 8.44:";; + short | recursive ) echo "Configuration of PCRE 8.45:";; esac cat <<\_ACEOF @@ -1580,7 +1615,6 @@ Some influential environment variables: you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags - CPP C preprocessor LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor @@ -1615,9 +1649,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1645,7 +1679,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1653,7 +1688,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1662,10 +1697,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PCRE configure 8.44 -generated by GNU Autoconf 2.69 +PCRE configure 8.45 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1682,14 +1717,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1697,14 +1732,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1720,14 +1756,14 @@ fi ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1735,14 +1771,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1752,85 +1789,6 @@ fi } # ac_fn_cxx_try_compile -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in @@ -1838,26 +1796,28 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1869,11 +1829,12 @@ $as_echo "$ac_res" >&6; } ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 -$as_echo_n "checking for int$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +printf %s "checking for int$2_t... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. @@ -1884,7 +1845,7 @@ else $ac_includes_default enum { N = $2 / 2 - 1 }; int -main () +main (void) { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; @@ -1894,13 +1855,14 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int -main () +main (void) { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; @@ -1911,9 +1873,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( @@ -1921,19 +1884,20 @@ else eval "$3=\$ac_type" ;; esac fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no" +then : -else +else $as_nop break fi done fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t @@ -1944,14 +1908,14 @@ $as_echo "$ac_res" >&6; } ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1959,17 +1923,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1990,11 +1955,12 @@ fi ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. @@ -2002,16 +1968,9 @@ else #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif + which can conflict with char $2 (); below. */ +#include #undef $2 /* Override any GCC internal prototype to avoid an error. @@ -2029,24 +1988,25 @@ choke me #endif int -main () +main (void) { return $2 (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func @@ -2063,7 +2023,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -2071,14 +2031,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -2094,14 +2055,14 @@ fi ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -2109,17 +2070,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -2134,179 +2096,38 @@ fi } # ac_fn_cxx_try_link -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_cxx_check_header_mongrel () +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no +if ac_fn_cxx_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_cxx_check_header_mongrel +} # ac_fn_cxx_check_header_compile # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- @@ -2315,17 +2136,18 @@ fi ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -2333,12 +2155,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -2346,18 +2169,19 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_type @@ -2369,17 +2193,18 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -2387,12 +2212,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -2400,29 +2226,50 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by PCRE $as_me 8.44, which was -generated by GNU Autoconf 2.69. Invocation command line was +It was created by PCRE $as_me 8.45, which was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -2455,8 +2302,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2491,7 +2342,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2526,11 +2377,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2541,8 +2394,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2566,7 +2419,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2574,14 +2427,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2589,15 +2442,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2605,8 +2458,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2620,63 +2473,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2686,19 +2524,650 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="ltmain.sh config.guess config.sub compile ar-lib missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false @@ -2709,12 +3178,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2723,24 +3192,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -2750,11 +3219,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2770,36 +3240,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -# Find a good install program. We prefer a C program (faster), + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install @@ -2813,20 +3256,25 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; @@ -2836,13 +3284,13 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else @@ -2850,12 +3298,12 @@ case $as_dir/ in #(( echo one > conftest.one echo two > conftest.two mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi @@ -2871,7 +3319,7 @@ IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi - if test "${ac_cv_path_install+set}" = set; then + if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a @@ -2881,8 +3329,8 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -2892,8 +3340,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -2947,8 +3395,8 @@ else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= @@ -2967,26 +3415,23 @@ test "$program_suffix" != NONE && # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then @@ -3006,11 +3451,12 @@ if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -3018,11 +3464,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3033,11 +3483,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3046,11 +3496,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -3058,11 +3509,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3073,11 +3528,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -3085,8 +3540,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -3098,25 +3553,31 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done @@ -3127,7 +3588,7 @@ IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then + if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a @@ -3137,18 +3598,19 @@ fi MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -3156,11 +3618,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3171,24 +3637,25 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @@ -3204,12 +3671,12 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -3223,7 +3690,8 @@ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : +if test ${enable_silent_rules+y} +then : enableval=$enable_silent_rules; fi @@ -3233,12 +3701,13 @@ case $enable_silent_rules in # ((( *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3250,8 +3719,8 @@ else am_cv_make_support_nested_variables=no fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' @@ -3283,17 +3752,13 @@ fi # Define the identity of the package. PACKAGE='pcre' - VERSION='8.44' + VERSION='8.45' -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. @@ -3377,7 +3842,8 @@ END fi # Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : +if test ${enable_silent_rules+y} +then : enableval=$enable_silent_rules; fi @@ -3387,12 +3853,13 @@ case $enable_silent_rules in # ((( *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 @@ -3404,8 +3871,8 @@ else am_cv_make_support_nested_variables=no fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' @@ -3419,12 +3886,21 @@ ac_config_headers="$ac_config_headers config.h" # This is a new thing required to stop a warning from automake 1.12 + + + + + + + + + DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 -$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out @@ -3460,11 +3936,12 @@ esac fi done rm -f confinc.* confmf.* -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 -$as_echo "${_am_result}" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test ${enable_dependency_tracking+y} +then : enableval=$enable_dependency_tracking; fi @@ -3490,11 +3967,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3502,11 +3980,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3517,11 +3999,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3530,11 +4012,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3542,11 +4025,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3557,11 +4044,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -3569,8 +4056,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3583,11 +4070,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3595,11 +4083,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3610,11 +4102,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3623,11 +4115,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3636,15 +4129,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3660,18 +4157,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3682,11 +4179,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3694,11 +4192,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3709,11 +4211,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3726,11 +4228,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3738,11 +4241,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3753,11 +4260,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3769,8 +4276,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3778,25 +4285,129 @@ esac fi fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3806,7 +4417,7 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -3814,7 +4425,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -3826,9 +4437,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" @@ -3849,11 +4460,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3870,7 +4482,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3886,44 +4498,46 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else +else $as_nop ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3937,15 +4551,15 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -3954,7 +4568,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -3966,8 +4580,8 @@ _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -3975,10 +4589,10 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -3986,39 +4600,40 @@ $as_echo "$ac_try_echo"; } >&5 *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4032,11 +4647,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -4045,31 +4661,32 @@ $as_echo "$ac_try_echo"; } >&5 break;; esac done -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -4079,29 +4696,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -4110,57 +4731,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -4175,94 +4799,144 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi ac_ext=c @@ -4271,21 +4945,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4313,8 +4989,8 @@ _ACEOF rm -f core conftest* unset am_i fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. @@ -4332,11 +5008,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -4443,8 +5120,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -4459,16 +5136,18 @@ fi -if test -n "$ac_tool_prefix"; then + + if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -4476,11 +5155,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4491,11 +5174,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4508,11 +5191,12 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -4520,11 +5204,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4535,11 +5223,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4551,8 +5239,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -4561,11 +5249,12 @@ fi : ${AR=ar} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 -$as_echo_n "checking the archiver ($AR) interface... " >&6; } -if ${am_cv_ar_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +printf %s "checking the archiver ($AR) interface... " >&6; } +if test ${am_cv_ar_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -4577,12 +5266,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int some_variable = 0; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar @@ -4591,7 +5281,7 @@ if ac_fn_c_try_compile "$LINENO"; then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib @@ -4602,7 +5292,7 @@ if ac_fn_c_try_compile "$LINENO"; then : rm -f conftest.lib libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -4610,8 +5300,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 -$as_echo "$am_cv_ar_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +printf "%s\n" "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) @@ -4655,11 +5345,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4667,11 +5358,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4682,11 +5377,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4695,11 +5390,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -4707,11 +5403,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4722,11 +5422,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -4734,8 +5434,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -4748,11 +5448,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4760,11 +5461,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4775,11 +5480,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4788,11 +5493,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4801,15 +5507,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4825,18 +5535,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4847,11 +5557,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4859,11 +5570,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4874,11 +5589,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4891,11 +5606,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -4903,11 +5619,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4918,11 +5638,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4934,8 +5654,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -4943,25 +5663,129 @@ esac fi fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -4971,20 +5795,21 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -4994,29 +5819,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -5025,57 +5854,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -5090,94 +5922,144 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi ac_ext=c @@ -5186,21 +6068,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -5228,8 +6112,8 @@ _ACEOF rm -f core conftest* unset am_i fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. @@ -5247,11 +6131,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -5358,8 +6243,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -5373,6 +6258,12 @@ else fi + + + + + + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -5383,15 +6274,16 @@ if test -z "$CXX"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else @@ -5399,11 +6291,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5414,11 +6310,11 @@ fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5427,15 +6323,16 @@ fi fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else @@ -5443,11 +6340,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5458,11 +6359,11 @@ fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5474,8 +6375,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX @@ -5485,7 +6386,7 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do @@ -5495,7 +6396,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -5505,20 +6406,21 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -5528,29 +6430,33 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi -ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no @@ -5559,57 +6465,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : ac_cv_prog_cxx_g=yes -else +else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : -else +else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : ac_cv_prog_cxx_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then @@ -5624,6 +6533,100 @@ else CXXFLAGS= fi fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -5632,11 +6635,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For @@ -5743,8 +6747,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if @@ -5795,19 +6799,20 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO" +then : -else +else $as_nop CXX=""; CXXCP=""; CXXFLAGS="" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -5816,436 +6821,69 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check for a 64-bit integer type -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +ac_header= ac_cache= +for ac_item in $ac_header_c_list do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - done + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<_ACEOF -#define int64_t $ac_cv_c_int64_t -_ACEOF +printf "%s\n" "#define int64_t $ac_cv_c_int64_t" >>confdefs.h ;; esac -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; @@ -6264,21 +6902,22 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; @@ -6304,11 +6943,12 @@ case $host in if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else @@ -6316,11 +6956,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6331,11 +6975,11 @@ fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6344,11 +6988,12 @@ if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else @@ -6356,11 +7001,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6371,11 +7020,11 @@ fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then @@ -6383,8 +7032,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS @@ -6396,11 +7045,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -6408,11 +7058,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6423,11 +7077,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6436,11 +7090,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -6448,11 +7103,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6463,11 +7122,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -6475,8 +7134,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -6488,11 +7147,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -6500,11 +7160,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6515,11 +7179,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6528,11 +7192,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -6540,11 +7205,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6555,11 +7224,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -6567,8 +7236,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -6602,13 +7271,13 @@ test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac -macro_version='2.4.6.42-b88ce' +macro_version='2.4.6.42-b88ce-dirty' macro_revision='2.4.6.42' @@ -6623,6 +7292,7 @@ macro_revision='2.4.6.42' + ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within @@ -6646,8 +7316,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then @@ -6673,12 +7343,12 @@ func_echo_all () } case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; esac @@ -6694,11 +7364,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -6712,10 +7383,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -6724,13 +7400,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" + printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -6758,8 +7434,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -6776,11 +7452,154 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else @@ -6791,10 +7610,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP @@ -6803,13 +7627,13 @@ case `"$ac_path_FGREP" --version 2>&1` in ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -6838,8 +7662,8 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -6864,17 +7688,18 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -6903,15 +7728,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -6940,18 +7766,19 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -6974,11 +7801,12 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM @@ -7028,8 +7856,8 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else @@ -7042,11 +7870,12 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -7054,11 +7883,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7069,11 +7902,11 @@ fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7086,11 +7919,12 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -7098,11 +7932,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7113,11 +7951,11 @@ fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7129,8 +7967,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN @@ -7158,11 +7996,12 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -7178,26 +8017,27 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop i=0 teststring=ABCD @@ -7324,11 +8164,11 @@ else fi if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -7372,11 +8212,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $host in *-*-mingw* ) case $build in @@ -7412,18 +8253,19 @@ esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -7439,22 +8281,23 @@ esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -7487,11 +8330,12 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -7499,11 +8343,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7514,11 +8362,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7527,11 +8375,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -7539,11 +8388,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7554,11 +8407,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -7566,8 +8419,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -7583,11 +8436,12 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' @@ -7783,8 +8637,8 @@ os2*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -7828,11 +8682,12 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -7840,11 +8695,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7855,11 +8714,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7868,11 +8727,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -7880,11 +8740,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7895,11 +8759,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -7907,8 +8771,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -7925,11 +8789,12 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in @@ -7952,8 +8817,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -7968,11 +8833,12 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -7980,11 +8846,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7995,11 +8865,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8012,11 +8882,12 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -8024,11 +8895,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8039,11 +8914,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8055,8 +8930,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -8092,30 +8967,32 @@ lt_ar_flags=$AR_FLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. @@ -8123,7 +9000,7 @@ if ac_fn_c_try_compile "$LINENO"; then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ @@ -8132,11 +9009,11 @@ if ac_fn_c_try_compile "$LINENO"; then : rm -f conftest.* libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= @@ -8153,11 +9030,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -8165,11 +9043,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8180,11 +9062,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8193,11 +9075,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -8205,11 +9088,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8220,11 +9107,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -8232,8 +9119,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -8252,11 +9139,12 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -8264,11 +9152,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8279,11 +9171,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8292,11 +9184,12 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -8304,11 +9197,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8319,11 +9216,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -8331,8 +9228,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -8421,11 +9318,12 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -8577,14 +9475,14 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then @@ -8653,7 +9551,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi @@ -8688,11 +9586,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi # Response file support. @@ -8738,13 +9636,14 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : +if test ${with_sysroot+y} +then : withval=$with_sysroot; -else +else $as_nop with_sysroot=no fi @@ -8762,24 +9661,25 @@ case $with_sysroot in #( no|'') ;; #( *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -$as_echo_n "checking for a working dd... " >&6; } -if ${ac_cv_path_lt_DD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} @@ -8790,10 +9690,15 @@ if test -z "$lt_DD"; then for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in dd; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ @@ -8813,15 +9718,16 @@ fi rm -f conftest.i conftest2.i conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -$as_echo "$ac_cv_path_lt_DD" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -$as_echo_n "checking how to truncate binary pipes... " >&6; } -if ${lt_cv_truncate_bin+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= @@ -8832,8 +9738,8 @@ fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -$as_echo "$lt_cv_truncate_bin" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -8856,7 +9762,8 @@ func_cc_basename () } # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : +if test ${enable_libtool_lock+y} +then : enableval=$enable_libtool_lock; fi @@ -8872,7 +9779,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) @@ -8892,7 +9799,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in @@ -8930,7 +9837,7 @@ mips64*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in @@ -8971,7 +9878,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) @@ -9034,11 +9941,12 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -9049,19 +9957,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_cc_needs_belf=yes -else +else $as_nop lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -9070,8 +9979,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS @@ -9084,7 +9993,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) @@ -9121,11 +10030,12 @@ need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -9133,11 +10043,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9148,11 +10062,11 @@ fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9161,11 +10075,12 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else @@ -9173,11 +10088,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9188,11 +10107,11 @@ fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -9200,8 +10119,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -9211,11 +10130,12 @@ else fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -9225,8 +10145,8 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -9241,11 +10161,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -9253,11 +10174,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9268,11 +10193,11 @@ fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9281,11 +10206,12 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -9293,11 +10219,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9308,11 +10238,11 @@ fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -9320,8 +10250,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -9333,11 +10263,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -9345,11 +10276,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9360,11 +10295,11 @@ fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9373,11 +10308,12 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -9385,11 +10321,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9400,11 +10340,11 @@ fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -9412,8 +10352,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -9425,11 +10365,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -9437,11 +10378,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9452,11 +10397,11 @@ fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9465,11 +10410,12 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -9477,11 +10423,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9492,11 +10442,11 @@ fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -9504,8 +10454,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -9517,11 +10467,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -9529,11 +10480,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9544,11 +10499,11 @@ fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9557,11 +10512,12 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -9569,11 +10525,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9584,11 +10544,11 @@ fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -9596,8 +10556,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -9609,11 +10569,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -9621,11 +10582,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9636,11 +10601,11 @@ fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -9649,11 +10614,12 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -9661,11 +10627,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -9676,11 +10646,11 @@ fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -9688,8 +10658,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -9724,11 +10694,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override @@ -9757,14 +10728,15 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -9773,31 +10745,33 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_ld_exported_symbols_list=yes -else +else $as_nop lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} @@ -9825,8 +10799,8 @@ _LT_EOF rm -rf conftest.dSYM fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; @@ -9897,19 +10871,14 @@ func_munge_path_list () esac } -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi -done - func_stripname_cnf () @@ -9933,7 +10902,8 @@ func_stripname_cnf () # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : +if test ${enable_shared+y} +then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -9951,7 +10921,7 @@ if test "${enable_shared+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_shared=yes fi @@ -9964,7 +10934,8 @@ fi # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : +if test ${enable_static+y} +then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -9982,7 +10953,7 @@ if test "${enable_static+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_static=yes fi @@ -9996,7 +10967,8 @@ fi # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : +if test ${with_pic+y} +then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; @@ -10013,7 +10985,7 @@ if test "${with_pic+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop pic_mode=default fi @@ -10025,7 +10997,8 @@ fi # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : +if test ${enable_fast_install+y} +then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -10043,7 +11016,7 @@ if test "${enable_fast_install+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_fast_install=yes fi @@ -10057,11 +11030,12 @@ fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. -if test "${with_aix_soname+set}" = set; then : +if test ${with_aix_soname+y} +then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; @@ -10070,18 +11044,19 @@ if test "${with_aix_soname+set}" = set; then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else - if ${lt_cv_with_aix_soname+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -$as_echo "$with_aix_soname" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', @@ -10163,11 +11138,12 @@ if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -10178,17 +11154,15 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h @@ -10234,11 +11208,12 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -10287,11 +11262,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -10300,11 +11275,12 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -10353,11 +11329,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -10442,11 +11418,12 @@ if test yes = "$GCC"; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -10477,8 +11454,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -10835,26 +11812,28 @@ case $host_os in ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -10885,8 +11864,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in @@ -10914,11 +11893,12 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -10942,8 +11922,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : @@ -10957,11 +11937,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -11004,19 +11985,20 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -11059,8 +12041,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -11068,19 +12050,19 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -11092,8 +12074,8 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -11649,21 +12631,23 @@ _LT_EOF if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11678,7 +12662,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -11702,21 +12686,23 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -11731,7 +12717,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -11982,11 +12968,12 @@ fi # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" @@ -12010,8 +12997,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' @@ -12051,28 +13038,30 @@ fi # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_irix_exported_symbol=yes -else +else $as_nop lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi @@ -12353,8 +13342,8 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -12390,18 +13379,19 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -12419,7 +13409,7 @@ else if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -12433,8 +13423,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -12593,8 +13583,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in @@ -13155,9 +14145,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -13167,19 +14158,21 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -13411,8 +14404,8 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -13533,8 +14526,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -13558,8 +14551,8 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then @@ -13603,11 +14596,12 @@ else darwin*) # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13616,32 +14610,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else +else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= @@ -13661,14 +14654,16 @@ fi *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : +if test "x$ac_cv_func_shl_load" = xyes +then : lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13677,41 +14672,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char shl_load (); int -main () +main (void) { return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_shl_load=yes -else +else $as_nop ac_cv_lib_dld_shl_load=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else +else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = xyes +then : lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13720,37 +14716,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13759,37 +14755,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_svld_dlopen=yes -else +else $as_nop ac_cv_lib_svld_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13798,30 +14794,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dld_link (); int -main () +main (void) { return dld_link (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_dld_link=yes -else +else $as_nop ac_cv_lib_dld_dld_link=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi @@ -13860,11 +14855,12 @@ fi save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else @@ -13943,7 +14939,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -13961,16 +14957,17 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else @@ -14049,7 +15046,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -14067,8 +15064,8 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS @@ -14106,40 +15103,40 @@ fi striplib= old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } if test -z "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac fi @@ -14157,13 +15154,13 @@ fi # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -14187,15 +15184,15 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } fi ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } @@ -14217,36 +15214,32 @@ ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -14258,10 +15251,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -14271,7 +15265,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : break fi @@ -14283,29 +15278,24 @@ fi else ac_cv_prog_CXXCPP=$CXXCPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif +#include Syntax error _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : -else +else $as_nop # Broken: fails on valid input. continue fi @@ -14317,10 +15307,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO" +then : # Broken: success on invalid input. continue -else +else $as_nop # Passes both tests. ac_preproc_ok=: break @@ -14330,11 +15321,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +if $ac_preproc_ok +then : -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi @@ -14470,17 +15462,18 @@ cc_basename=$func_cc_basename_result # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -14509,15 +15502,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -14546,18 +15540,19 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -14623,8 +15618,8 @@ with_gnu_ld=$lt_cv_prog_gnu_ld fi # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) @@ -14762,21 +15757,23 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -14791,7 +15788,7 @@ if ac_fn_cxx_try_link "$LINENO"; then : lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib @@ -14816,21 +15813,23 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -14845,7 +15844,7 @@ if ac_fn_cxx_try_link "$LINENO"; then : lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib @@ -15697,8 +16696,8 @@ fi ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX @@ -15736,7 +16735,7 @@ esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. @@ -16217,26 +17216,28 @@ case $host_os in ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -16267,8 +17268,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in @@ -16290,11 +17291,12 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -16318,8 +17320,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : @@ -16330,11 +17332,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest @@ -16377,16 +17380,17 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest @@ -16429,8 +17433,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } @@ -16438,19 +17442,19 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -16459,8 +17463,8 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' @@ -16499,8 +17503,8 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld @@ -16527,18 +17531,19 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -16556,7 +17561,7 @@ else if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no @@ -16570,8 +17575,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac @@ -16640,8 +17645,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' @@ -17129,9 +18134,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -17141,19 +18147,21 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -17385,8 +18393,8 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -17450,8 +18458,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || @@ -17475,8 +18483,8 @@ else # directories. hardcode_action_CXX=unsupported fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then @@ -17536,15 +18544,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Only expand once: -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi @@ -17556,11 +18564,12 @@ fi VISIBILITY_CXXFLAGS= HAVE_VISIBILITY=0 if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 -$as_echo_n "checking whether the -Werror option is usable... " >&6; } - if ${pcre_cv_cc_vis_werror+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 +printf %s "checking whether the -Werror option is usable... " >&6; } + if test ${pcre_cv_cc_vis_werror+y} +then : + printf %s "(cached) " >&6 +else $as_nop pcre_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" @@ -17568,29 +18577,31 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : pcre_cv_cc_vis_werror=yes -else +else $as_nop pcre_cv_cc_vis_werror=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$pcre_save_CFLAGS" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_vis_werror" >&5 -$as_echo "$pcre_cv_cc_vis_werror" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 -$as_echo_n "checking for simple visibility declarations... " >&6; } - if ${pcre_cv_cc_visibility+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_vis_werror" >&5 +printf "%s\n" "$pcre_cv_cc_vis_werror" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 +printf %s "checking for simple visibility declarations... " >&6; } + if test ${pcre_cv_cc_visibility+y} +then : + printf %s "(cached) " >&6 +else $as_nop pcre_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" @@ -17606,48 +18617,49 @@ extern __attribute__((__visibility__("hidden"))) int hiddenvar; void dummyfunc (void) {} int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : pcre_cv_cc_visibility=yes -else +else $as_nop pcre_cv_cc_visibility=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$pcre_save_CFLAGS" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_visibility" >&5 -$as_echo "$pcre_cv_cc_visibility" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_visibility" >&5 +printf "%s\n" "$pcre_cv_cc_visibility" >&6; } if test $pcre_cv_cc_visibility = yes; then VISIBILITY_CFLAGS="-fvisibility=hidden" VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden" HAVE_VISIBILITY=1 -$as_echo "#define PCRE_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCRE_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCRE_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCRE_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCRECPP_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCRECPP_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h -$as_echo "#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h +printf "%s\n" "#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h fi fi @@ -17655,18 +18667,16 @@ $as_echo "#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\"default\")))" > -cat >>confdefs.h <<_ACEOF -#define HAVE_VISIBILITY $HAVE_VISIBILITY -_ACEOF +printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h # Versioning PCRE_MAJOR="8" -PCRE_MINOR="44" +PCRE_MINOR="45" PCRE_PRERELEASE="" -PCRE_DATE="2020-02-12" +PCRE_DATE="2021-06-15" if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09" then @@ -17690,9 +18700,10 @@ fi # Handle --disable-pcre8 (enabled by default) # Check whether --enable-pcre8 was given. -if test "${enable_pcre8+set}" = set; then : +if test ${enable_pcre8+y} +then : enableval=$enable_pcre8; -else +else $as_nop enable_pcre8=unset fi @@ -17700,9 +18711,10 @@ fi # Handle --enable-pcre16 (disabled by default) # Check whether --enable-pcre16 was given. -if test "${enable_pcre16+set}" = set; then : +if test ${enable_pcre16+y} +then : enableval=$enable_pcre16; -else +else $as_nop enable_pcre16=unset fi @@ -17710,9 +18722,10 @@ fi # Handle --enable-pcre32 (disabled by default) # Check whether --enable-pcre32 was given. -if test "${enable_pcre32+set}" = set; then : +if test ${enable_pcre32+y} +then : enableval=$enable_pcre32; -else +else $as_nop enable_pcre32=unset fi @@ -17721,9 +18734,10 @@ fi # Handle --disable-cpp. The substitution of enable_cpp is needed for use in # pcre-config. # Check whether --enable-cpp was given. -if test "${enable_cpp+set}" = set; then : +if test ${enable_cpp+y} +then : enableval=$enable_cpp; -else +else $as_nop enable_cpp=unset fi @@ -17731,9 +18745,10 @@ fi # Handle --enable-jit (disabled by default) # Check whether --enable-jit was given. -if test "${enable_jit+set}" = set; then : +if test ${enable_jit+y} +then : enableval=$enable_jit; -else +else $as_nop enable_jit=no fi @@ -17758,56 +18773,62 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu #error unsupported #endif _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : enable_jit=yes -else +else $as_nop enable_jit=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CPPFLAGS=$SAVE_CPPFLAGS fi # Handle --disable-pcregrep-jit (enabled by default) # Check whether --enable-pcregrep-jit was given. -if test "${enable_pcregrep_jit+set}" = set; then : +if test ${enable_pcregrep_jit+y} +then : enableval=$enable_pcregrep_jit; -else +else $as_nop enable_pcregrep_jit=yes fi # Handle --enable-rebuild-chartables # Check whether --enable-rebuild-chartables was given. -if test "${enable_rebuild_chartables+set}" = set; then : +if test ${enable_rebuild_chartables+y} +then : enableval=$enable_rebuild_chartables; -else +else $as_nop enable_rebuild_chartables=no fi # Handle --enable-utf8 (disabled by default) # Check whether --enable-utf8 was given. -if test "${enable_utf8+set}" = set; then : +if test ${enable_utf8+y} +then : enableval=$enable_utf8; -else +else $as_nop enable_utf8=unset fi # Handle --enable-utf (disabled by default) # Check whether --enable-utf was given. -if test "${enable_utf+set}" = set; then : +if test ${enable_utf+y} +then : enableval=$enable_utf; -else +else $as_nop enable_utf=unset fi # Handle --enable-unicode-properties # Check whether --enable-unicode-properties was given. -if test "${enable_unicode_properties+set}" = set; then : +if test ${enable_unicode_properties+y} +then : enableval=$enable_unicode_properties; -else +else $as_nop enable_unicode_properties=no fi @@ -17815,27 +18836,32 @@ fi # Handle newline options ac_pcre_newline=lf # Check whether --enable-newline-is-cr was given. -if test "${enable_newline_is_cr+set}" = set; then : +if test ${enable_newline_is_cr+y} +then : enableval=$enable_newline_is_cr; ac_pcre_newline=cr fi # Check whether --enable-newline-is-lf was given. -if test "${enable_newline_is_lf+set}" = set; then : +if test ${enable_newline_is_lf+y} +then : enableval=$enable_newline_is_lf; ac_pcre_newline=lf fi # Check whether --enable-newline-is-crlf was given. -if test "${enable_newline_is_crlf+set}" = set; then : +if test ${enable_newline_is_crlf+y} +then : enableval=$enable_newline_is_crlf; ac_pcre_newline=crlf fi # Check whether --enable-newline-is-anycrlf was given. -if test "${enable_newline_is_anycrlf+set}" = set; then : +if test ${enable_newline_is_anycrlf+y} +then : enableval=$enable_newline_is_anycrlf; ac_pcre_newline=anycrlf fi # Check whether --enable-newline-is-any was given. -if test "${enable_newline_is_any+set}" = set; then : +if test ${enable_newline_is_any+y} +then : enableval=$enable_newline_is_any; ac_pcre_newline=any fi @@ -17843,54 +18869,60 @@ enable_newline="$ac_pcre_newline" # Handle --enable-bsr-anycrlf # Check whether --enable-bsr-anycrlf was given. -if test "${enable_bsr_anycrlf+set}" = set; then : +if test ${enable_bsr_anycrlf+y} +then : enableval=$enable_bsr_anycrlf; -else +else $as_nop enable_bsr_anycrlf=no fi # Handle --enable-ebcdic # Check whether --enable-ebcdic was given. -if test "${enable_ebcdic+set}" = set; then : +if test ${enable_ebcdic+y} +then : enableval=$enable_ebcdic; -else +else $as_nop enable_ebcdic=no fi # Handle --enable-ebcdic-nl25 # Check whether --enable-ebcdic-nl25 was given. -if test "${enable_ebcdic_nl25+set}" = set; then : +if test ${enable_ebcdic_nl25+y} +then : enableval=$enable_ebcdic_nl25; -else +else $as_nop enable_ebcdic_nl25=no fi # Handle --disable-stack-for-recursion # Check whether --enable-stack-for-recursion was given. -if test "${enable_stack_for_recursion+set}" = set; then : +if test ${enable_stack_for_recursion+y} +then : enableval=$enable_stack_for_recursion; -else +else $as_nop enable_stack_for_recursion=yes fi # Handle --enable-pcregrep-libz # Check whether --enable-pcregrep-libz was given. -if test "${enable_pcregrep_libz+set}" = set; then : +if test ${enable_pcregrep_libz+y} +then : enableval=$enable_pcregrep_libz; -else +else $as_nop enable_pcregrep_libz=no fi # Handle --enable-pcregrep-libbz2 # Check whether --enable-pcregrep-libbz2 was given. -if test "${enable_pcregrep_libbz2+set}" = set; then : +if test ${enable_pcregrep_libbz2+y} +then : enableval=$enable_pcregrep_libbz2; -else +else $as_nop enable_pcregrep_libbz2=no fi @@ -17898,27 +18930,30 @@ fi # Handle --with-pcregrep-bufsize=N # Check whether --with-pcregrep-bufsize was given. -if test "${with_pcregrep_bufsize+set}" = set; then : +if test ${with_pcregrep_bufsize+y} +then : withval=$with_pcregrep_bufsize; -else +else $as_nop with_pcregrep_bufsize=20480 fi # Handle --enable-pcretest-libedit # Check whether --enable-pcretest-libedit was given. -if test "${enable_pcretest_libedit+set}" = set; then : +if test ${enable_pcretest_libedit+y} +then : enableval=$enable_pcretest_libedit; -else +else $as_nop enable_pcretest_libedit=no fi # Handle --enable-pcretest-libreadline # Check whether --enable-pcretest-libreadline was given. -if test "${enable_pcretest_libreadline+set}" = set; then : +if test ${enable_pcretest_libreadline+y} +then : enableval=$enable_pcretest_libreadline; -else +else $as_nop enable_pcretest_libreadline=no fi @@ -17926,9 +18961,10 @@ fi # Handle --with-posix-malloc-threshold=NBYTES # Check whether --with-posix-malloc-threshold was given. -if test "${with_posix_malloc_threshold+set}" = set; then : +if test ${with_posix_malloc_threshold+y} +then : withval=$with_posix_malloc_threshold; -else +else $as_nop with_posix_malloc_threshold=10 fi @@ -17936,9 +18972,10 @@ fi # Handle --with-link-size=N # Check whether --with-link-size was given. -if test "${with_link_size+set}" = set; then : +if test ${with_link_size+y} +then : withval=$with_link_size; -else +else $as_nop with_link_size=2 fi @@ -17946,9 +18983,10 @@ fi # Handle --with-parens-nest-limit=N # Check whether --with-parens-nest-limit was given. -if test "${with_parens_nest_limit+set}" = set; then : +if test ${with_parens_nest_limit+y} +then : withval=$with_parens_nest_limit; -else +else $as_nop with_parens_nest_limit=250 fi @@ -17956,9 +18994,10 @@ fi # Handle --with-match-limit=N # Check whether --with-match-limit was given. -if test "${with_match_limit+set}" = set; then : +if test ${with_match_limit+y} +then : withval=$with_match_limit; -else +else $as_nop with_match_limit=10000000 fi @@ -17973,27 +19012,30 @@ fi # # Check whether --with-match-limit-recursion was given. -if test "${with_match_limit_recursion+set}" = set; then : +if test ${with_match_limit_recursion+y} +then : withval=$with_match_limit_recursion; -else +else $as_nop with_match_limit_recursion=MATCH_LIMIT fi # Handle --enable-valgrind # Check whether --enable-valgrind was given. -if test "${enable_valgrind+set}" = set; then : +if test ${enable_valgrind+y} +then : enableval=$enable_valgrind; -else +else $as_nop enable_valgrind=no fi # Enable code coverage reports using gcov # Check whether --enable-coverage was given. -if test "${enable_coverage+set}" = set; then : +if test ${enable_coverage+y} +then : enableval=$enable_coverage; -else +else $as_nop enable_coverage=no fi @@ -18120,144 +19162,119 @@ esac # Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 +# Autoupdate added the next two lines to ensure that your configure +# script's behavior did not change. They are probably safe to remove. + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no + ac_cv_path_EGREP=$EGREP fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no + fi fi -rm -f conftest* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +if test "x$ac_cv_header_dirent_h" = xyes +then : + printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h fi -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -for ac_header in limits.h sys/types.h sys/stat.h dirent.h + for ac_header in windows.h do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -for ac_header in windows.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" -if test "x$ac_cv_header_windows_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_WINDOWS_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes +then : + printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h HAVE_WINDOWS_H=1 fi done - # The files below are C++ header files. pcre_have_type_traits="0" pcre_have_bits_type_traits="0" @@ -18283,8 +19300,8 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu OLD_LDFLAGS="$LDFLAGS" for flag in "-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE" \ "-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE"; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alias support in the linker" >&5 -$as_echo_n "checking for alias support in the linker... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alias support in the linker" >&5 +printf %s "checking for alias support in the linker... " >&6; } LDFLAGS="$OLD_LDFLAGS -Wl,$flag" # We try to run the linker with this new ld flag. If the link fails, # we give up and remove the new flag from LDFLAGS. @@ -18295,23 +19312,24 @@ namespace pcrecpp { int RE::no_arg; } int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; }; +if ac_fn_cxx_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; }; EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag"; break; -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done LDFLAGS="$OLD_LDFLAGS" @@ -18319,50 +19337,43 @@ LDFLAGS="$OLD_LDFLAGS" # We could be more clever here, given we're doing AC_SUBST with this # (eg set a var to be the name of the include file we want). But we're not # so it's easy to change back to 'regular' autoconf vars if we needed to. - -for ac_header in string + for ac_header in string do : - ac_fn_cxx_check_header_mongrel "$LINENO" "string" "ac_cv_header_string" "$ac_includes_default" -if test "x$ac_cv_header_string" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STRING 1 -_ACEOF + ac_fn_cxx_check_header_compile "$LINENO" "string" "ac_cv_header_string" "$ac_includes_default" +if test "x$ac_cv_header_string" = xyes +then : + printf "%s\n" "#define HAVE_STRING 1" >>confdefs.h pcre_have_cpp_headers="1" -else +else $as_nop pcre_have_cpp_headers="0" fi done - -for ac_header in bits/type_traits.h + for ac_header in bits/type_traits.h do : - ac_fn_cxx_check_header_mongrel "$LINENO" "bits/type_traits.h" "ac_cv_header_bits_type_traits_h" "$ac_includes_default" -if test "x$ac_cv_header_bits_type_traits_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BITS_TYPE_TRAITS_H 1 -_ACEOF + ac_fn_cxx_check_header_compile "$LINENO" "bits/type_traits.h" "ac_cv_header_bits_type_traits_h" "$ac_includes_default" +if test "x$ac_cv_header_bits_type_traits_h" = xyes +then : + printf "%s\n" "#define HAVE_BITS_TYPE_TRAITS_H 1" >>confdefs.h pcre_have_bits_type_traits="1" -else +else $as_nop pcre_have_bits_type_traits="0" fi done - -for ac_header in type_traits.h + for ac_header in type_traits.h do : - ac_fn_cxx_check_header_mongrel "$LINENO" "type_traits.h" "ac_cv_header_type_traits_h" "$ac_includes_default" -if test "x$ac_cv_header_type_traits_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TYPE_TRAITS_H 1 -_ACEOF + ac_fn_cxx_check_header_compile "$LINENO" "type_traits.h" "ac_cv_header_type_traits_h" "$ac_includes_default" +if test "x$ac_cv_header_type_traits_h" = xyes +then : + printf "%s\n" "#define HAVE_TYPE_TRAITS_H 1" >>confdefs.h pcre_have_type_traits="1" -else +else $as_nop pcre_have_type_traits="0" fi done - # (This isn't c++-specific, but is only used in pcrecpp.cc, so try this # in a c++ context. This matters becuase strtoimax is C99 and may not # be supported by the C++ compiler.) @@ -18376,8 +19387,8 @@ done have_strto_fn=0 for fn in strtoq strtoll _strtoi64 strtoimax; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $fn" >&5 -$as_echo_n "checking for $fn... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $fn" >&5 +printf %s "checking for $fn... " >&6; } if test "$fn" = strtoimax; then include=stdint.h else @@ -18387,16 +19398,17 @@ $as_echo_n "checking for $fn... " >&6; } /* end confdefs.h. */ #include <$include> int -main () +main (void) { char* e; return $fn("100", &e, 10) ; return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_cxx_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } cat >>confdefs.h <<_ACEOF #define HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` 1 @@ -18404,35 +19416,33 @@ _ACEOF have_strto_fn=1 break -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done if test "$have_strto_fn" = 1; then ac_fn_cxx_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = xyes; then : +if test "x$ac_cv_type_long_long" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_LONG_LONG 1 -_ACEOF +printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h pcre_have_long_long="1" -else +else $as_nop pcre_have_long_long="0" fi ac_fn_cxx_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" -if test "x$ac_cv_type_unsigned_long_long" = xyes; then : +if test "x$ac_cv_type_unsigned_long_long" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UNSIGNED_LONG_LONG 1 -_ACEOF +printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h pcre_have_ulong_long="1" -else +else $as_nop pcre_have_ulong_long="0" fi @@ -18522,16 +19532,17 @@ fi # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __cplusplus @@ -18544,7 +19555,7 @@ main () /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. + /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ @@ -18572,7 +19583,7 @@ main () iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; @@ -18588,67 +19599,73 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_const=yes -else +else $as_nop ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -$as_echo "#define const /**/" >>confdefs.h +printf "%s\n" "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +if test "x$ac_cv_type_size_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi # Checks for library functions. -for ac_func in bcopy memmove strerror -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "bcopy" "ac_cv_func_bcopy" +if test "x$ac_cv_func_bcopy" = xyes +then : + printf "%s\n" "#define HAVE_BCOPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes +then : + printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = xyes +then : + printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h fi -done # Check for the availability of libz (aka zlib) -for ac_header in zlib.h + for ac_header in zlib.h do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes +then : + printf "%s\n" "#define HAVE_ZLIB_H 1" >>confdefs.h HAVE_ZLIB_H=1 fi done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 -$as_echo_n "checking for gzopen in -lz... " >&6; } -if ${ac_cv_lib_z_gzopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 +printf %s "checking for gzopen in -lz... " >&6; } +if test ${ac_cv_lib_z_gzopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18657,30 +19674,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char gzopen (); int -main () +main (void) { return gzopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_z_gzopen=yes -else +else $as_nop ac_cv_lib_z_gzopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 -$as_echo "$ac_cv_lib_z_gzopen" >&6; } -if test "x$ac_cv_lib_z_gzopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 +printf "%s\n" "$ac_cv_lib_z_gzopen" >&6; } +if test "x$ac_cv_lib_z_gzopen" = xyes +then : HAVE_LIBZ=1 fi @@ -18701,25 +19717,23 @@ fi # # - Replace the AC_CHECK_LIB test with a custom test. -for ac_header in bzlib.h + for ac_header in bzlib.h do : - ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" -if test "x$ac_cv_header_bzlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BZLIB_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes +then : + printf "%s\n" "#define HAVE_BZLIB_H 1" >>confdefs.h HAVE_BZLIB_H=1 fi done - # Original test # AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1]) # # Custom test follows -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbz2" >&5 -$as_echo_n "checking for libbz2... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libbz2" >&5 +printf %s "checking for libbz2... " >&6; } OLD_LIBS="$LIBS" LIBS="$LIBS -lbz2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18729,56 +19743,54 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #include #endif int -main () +main (void) { return (int)BZ2_bzopen("conftest", "rb"); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; };HAVE_LIBBZ2=1; break; -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; };HAVE_LIBBZ2=1; break; +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$OLD_LIBS" # Check for the availabiity of libreadline if test "$enable_pcretest_libreadline" = "yes"; then - for ac_header in readline/readline.h + for ac_header in readline/readline.h do : - ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" -if test "x$ac_cv_header_readline_readline_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_READLINE_READLINE_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h HAVE_READLINE_H=1 fi done - - for ac_header in readline/history.h + for ac_header in readline/history.h do : - ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" -if test "x$ac_cv_header_readline_history_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_READLINE_HISTORY_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_history_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_HISTORY_H 1" >>confdefs.h HAVE_HISTORY_H=1 fi done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18787,38 +19799,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-lreadline" -else +else $as_nop unset ac_cv_lib_readline_readline; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -ltinfo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18827,38 +19839,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-ltinfo" -else +else $as_nop unset ac_cv_lib_readline_readline; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18867,38 +19879,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-lcurses" -else +else $as_nop unset ac_cv_lib_readline_readline; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18907,38 +19919,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-lncurses" -else +else $as_nop unset ac_cv_lib_readline_readline; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -lncursesw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18947,38 +19959,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-lncursesw" -else +else $as_nop unset ac_cv_lib_readline_readline; - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 -$as_echo_n "checking for readline in -lreadline... " >&6; } -if ${ac_cv_lib_readline_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +printf %s "checking for readline in -lreadline... " >&6; } +if test ${ac_cv_lib_readline_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18987,32 +19999,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_readline_readline=yes -else +else $as_nop ac_cv_lib_readline_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 -$as_echo "$ac_cv_lib_readline_readline" >&6; } -if test "x$ac_cv_lib_readline_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes +then : LIBREADLINE="-ltermcap" -else +else $as_nop LIBREADLINE="" fi @@ -19040,49 +20051,44 @@ fi # headers in different places. Try to cover the most common ones. if test "$enable_pcretest_libedit" = "yes"; then - for ac_header in editline/readline.h + for ac_header in editline/readline.h do : - ac_fn_c_check_header_mongrel "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" -if test "x$ac_cv_header_editline_readline_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EDITLINE_READLINE_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_editline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h HAVE_EDITLINE_READLINE_H=1 -else - for ac_header in edit/readline/readline.h +else $as_nop + for ac_header in edit/readline/readline.h do : - ac_fn_c_check_header_mongrel "$LINENO" "edit/readline/readline.h" "ac_cv_header_edit_readline_readline_h" "$ac_includes_default" -if test "x$ac_cv_header_edit_readline_readline_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_EDIT_READLINE_READLINE_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "edit/readline/readline.h" "ac_cv_header_edit_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_edit_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_EDIT_READLINE_READLINE_H 1" >>confdefs.h HAVE_READLINE_READLINE_H=1 -else - for ac_header in readline/readline.h +else $as_nop + for ac_header in readline/readline.h do : - ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" -if test "x$ac_cv_header_readline_readline_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_READLINE_READLINE_H 1 -_ACEOF + ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h HAVE_READLINE_READLINE_H=1 fi done - fi done - fi done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5 -$as_echo_n "checking for readline in -ledit... " >&6; } -if ${ac_cv_lib_edit_readline+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5 +printf %s "checking for readline in -ledit... " >&6; } +if test ${ac_cv_lib_edit_readline+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ledit $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -19091,30 +20097,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char readline (); int -main () +main (void) { return readline (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_edit_readline=yes -else +else $as_nop ac_cv_lib_edit_readline=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5 -$as_echo "$ac_cv_lib_edit_readline" >&6; } -if test "x$ac_cv_lib_edit_readline" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5 +printf "%s\n" "$ac_cv_lib_edit_readline" >&6; } +if test "x$ac_cv_lib_edit_readline" = xyes +then : LIBEDIT="-ledit" fi @@ -19125,7 +20130,7 @@ fi PCRE_STATIC_CFLAG="" if test "x$enable_shared" = "xno" ; then -$as_echo "#define PCRE_STATIC 1" >>confdefs.h +printf "%s\n" "#define PCRE_STATIC 1" >>confdefs.h PCRE_STATIC_CFLAG="-DPCRE_STATIC" fi @@ -19135,19 +20140,19 @@ fi if test "$enable_pcre8" = "yes"; then -$as_echo "#define SUPPORT_PCRE8 /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_PCRE8 /**/" >>confdefs.h fi if test "$enable_pcre16" = "yes"; then -$as_echo "#define SUPPORT_PCRE16 /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_PCRE16 /**/" >>confdefs.h fi if test "$enable_pcre32" = "yes"; then -$as_echo "#define SUPPORT_PCRE32 /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_PCRE32 /**/" >>confdefs.h fi @@ -19177,33 +20182,31 @@ if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 -$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +printf %s "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char pthread_join (); int -main () +main (void) { return pthread_join (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" @@ -19268,24 +20271,25 @@ for flag in $ax_pthread_flags; do case $flag in none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } ;; -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 -$as_echo_n "checking whether pthreads work with $flag... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +printf %s "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ax_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else @@ -19293,11 +20297,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19309,11 +20317,11 @@ fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 -$as_echo "$ax_pthread_config" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -19323,8 +20331,8 @@ fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 -$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +printf %s "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac @@ -19349,7 +20357,7 @@ $as_echo_n "checking for the pthreads library -l$flag... " >&6; } static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; } int -main () +main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); @@ -19361,17 +20369,18 @@ pthread_t th; pthread_attr_t attr; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = xyes; then break; fi @@ -19389,39 +20398,38 @@ if test "x$ax_pthread_ok" = xyes; then CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { int attr = $attr; return attr /* ; */ ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : attr_name=$attr; break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 -$as_echo "$attr_name" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +printf "%s\n" "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then -cat >>confdefs.h <<_ACEOF -#define PTHREAD_CREATE_JOINABLE $attr_name -_ACEOF +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $attr_name" >>confdefs.h fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 -$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +printf %s "checking if more special flags are required for pthreads... " >&6; } flag=no case ${host_os} in aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; @@ -19434,44 +20442,47 @@ $as_echo_n "checking if more special flags are required for pthreads... " >&6; } fi ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 -$as_echo "${flag}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +printf "%s\n" "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 -$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } -if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { int i = PTHREAD_PRIO_INHERIT; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else +else $as_nop ax_cv_PTHREAD_PRIO_INHERIT=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 -$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } - if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" +then : -$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h fi @@ -19484,11 +20495,12 @@ fi do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else @@ -19496,11 +20508,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19511,11 +20527,11 @@ fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -19537,7 +20553,7 @@ fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then -$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h +printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h : else @@ -19556,7 +20572,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu LIBS="$PTHREAD_LIBS $LIBS" fi -$as_echo "#define SUPPORT_JIT /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_JIT /**/" >>confdefs.h else enable_pcregrep_jit="no" @@ -19564,43 +20580,43 @@ fi if test "$enable_pcregrep_jit" = "yes"; then -$as_echo "#define SUPPORT_PCREGREP_JIT /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_PCREGREP_JIT /**/" >>confdefs.h fi if test "$enable_utf" = "yes"; then -$as_echo "#define SUPPORT_UTF /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_UTF /**/" >>confdefs.h fi if test "$enable_unicode_properties" = "yes"; then -$as_echo "#define SUPPORT_UCP /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_UCP /**/" >>confdefs.h fi if test "$enable_stack_for_recursion" = "no"; then -$as_echo "#define NO_RECURSE /**/" >>confdefs.h +printf "%s\n" "#define NO_RECURSE /**/" >>confdefs.h fi if test "$enable_pcregrep_libz" = "yes"; then -$as_echo "#define SUPPORT_LIBZ /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_LIBZ /**/" >>confdefs.h fi if test "$enable_pcregrep_libbz2" = "yes"; then -$as_echo "#define SUPPORT_LIBBZ2 /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_LIBBZ2 /**/" >>confdefs.h fi if test $with_pcregrep_bufsize -lt 8192 ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&5 -$as_echo "$as_me: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&5 +printf "%s\n" "$as_me: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&2;} with_pcregrep_bufsize="8192" else if test $? -gt 1 ; then @@ -19609,95 +20625,75 @@ else fi -cat >>confdefs.h <<_ACEOF -#define PCREGREP_BUFSIZE $with_pcregrep_bufsize -_ACEOF +printf "%s\n" "#define PCREGREP_BUFSIZE $with_pcregrep_bufsize" >>confdefs.h if test "$enable_pcretest_libedit" = "yes"; then -$as_echo "#define SUPPORT_LIBEDIT /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_LIBEDIT /**/" >>confdefs.h LIBREADLINE="$LIBEDIT" elif test "$enable_pcretest_libreadline" = "yes"; then -$as_echo "#define SUPPORT_LIBREADLINE /**/" >>confdefs.h +printf "%s\n" "#define SUPPORT_LIBREADLINE /**/" >>confdefs.h fi -cat >>confdefs.h <<_ACEOF -#define NEWLINE $ac_pcre_newline_value -_ACEOF +printf "%s\n" "#define NEWLINE $ac_pcre_newline_value" >>confdefs.h if test "$enable_bsr_anycrlf" = "yes"; then -$as_echo "#define BSR_ANYCRLF /**/" >>confdefs.h +printf "%s\n" "#define BSR_ANYCRLF /**/" >>confdefs.h fi -cat >>confdefs.h <<_ACEOF -#define LINK_SIZE $with_link_size -_ACEOF +printf "%s\n" "#define LINK_SIZE $with_link_size" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define POSIX_MALLOC_THRESHOLD $with_posix_malloc_threshold -_ACEOF +printf "%s\n" "#define POSIX_MALLOC_THRESHOLD $with_posix_malloc_threshold" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PARENS_NEST_LIMIT $with_parens_nest_limit -_ACEOF +printf "%s\n" "#define PARENS_NEST_LIMIT $with_parens_nest_limit" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define MATCH_LIMIT $with_match_limit -_ACEOF +printf "%s\n" "#define MATCH_LIMIT $with_match_limit" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define MATCH_LIMIT_RECURSION $with_match_limit_recursion -_ACEOF +printf "%s\n" "#define MATCH_LIMIT_RECURSION $with_match_limit_recursion" >>confdefs.h -$as_echo "#define MAX_NAME_SIZE 32" >>confdefs.h +printf "%s\n" "#define MAX_NAME_SIZE 32" >>confdefs.h -$as_echo "#define MAX_NAME_COUNT 10000" >>confdefs.h +printf "%s\n" "#define MAX_NAME_COUNT 10000" >>confdefs.h if test "$enable_ebcdic" = "yes"; then -cat >>confdefs.h <<_ACEOF -#define EBCDIC /**/ -_ACEOF +printf "%s\n" "#define EBCDIC /**/" >>confdefs.h fi if test "$enable_ebcdic_nl25" = "yes"; then -cat >>confdefs.h <<_ACEOF -#define EBCDIC_NL25 /**/ -_ACEOF +printf "%s\n" "#define EBCDIC_NL25 /**/" >>confdefs.h fi if test "$enable_valgrind" = "yes"; then -cat >>confdefs.h <<_ACEOF -#define SUPPORT_VALGRIND /**/ -_ACEOF +printf "%s\n" "#define SUPPORT_VALGRIND /**/" >>confdefs.h fi @@ -19717,13 +20713,13 @@ esac # (Note: The libpcre*_version bits are m4 variables, assigned above) EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \ - $NO_UNDEFINED -version-info 3:12:2" + $NO_UNDEFINED -version-info 3:13:2" EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \ - $NO_UNDEFINED -version-info 2:12:2" + $NO_UNDEFINED -version-info 2:13:2" EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \ - $NO_UNDEFINED -version-info 0:12:0" + $NO_UNDEFINED -version-info 0:13:0" EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \ $NO_UNDEFINED -version-info 0:7:0" @@ -19820,11 +20816,12 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. @@ -19834,11 +20831,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19850,11 +20851,11 @@ esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +printf "%s\n" "$PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -19863,11 +20864,12 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. @@ -19877,11 +20879,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -19893,11 +20899,11 @@ esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then @@ -19905,8 +20911,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG @@ -19918,30 +20924,30 @@ fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 -$as_echo_n "checking for VALGRIND... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 +printf %s "checking for VALGRIND... " >&6; } if test -n "$VALGRIND_CFLAGS"; then pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -19955,10 +20961,10 @@ if test -n "$VALGRIND_LIBS"; then pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes @@ -19972,8 +20978,8 @@ fi if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -19999,10 +21005,10 @@ Alternatively, you may set the environment variables VALGRIND_CFLAGS and VALGRIND_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. @@ -20016,8 +21022,8 @@ See \`config.log' for more details" "$LINENO" 5; } else VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi fi @@ -20031,11 +21037,12 @@ if test "$enable_coverage" = "yes"; then # ccache is incompatible with gcov # Extract the first word of "shtool", so it can be a program name with args. set dummy shtool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SHTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SHTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $SHTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_SHTOOL="$SHTOOL" # Let the user override the test with a path. @@ -20045,11 +21052,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SHTOOL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SHTOOL="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20062,11 +21073,11 @@ esac fi SHTOOL=$ac_cv_path_SHTOOL if test -n "$SHTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 -$as_echo "$SHTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 +printf "%s\n" "$SHTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20084,11 +21095,12 @@ fi # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_LCOV+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_LCOV+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $LCOV in [\\/]* | ?:[\\/]*) ac_cv_path_LCOV="$LCOV" # Let the user override the test with a path. @@ -20098,11 +21110,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_LCOV="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_LCOV="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20115,11 +21131,11 @@ esac fi LCOV=$ac_cv_path_LCOV if test -n "$LCOV"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 -$as_echo "$LCOV" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 +printf "%s\n" "$LCOV" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20130,11 +21146,12 @@ fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_GENHTML+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_GENHTML+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $GENHTML in [\\/]* | ?:[\\/]*) ac_cv_path_GENHTML="$GENHTML" # Let the user override the test with a path. @@ -20144,11 +21161,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_GENHTML="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_GENHTML="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -20161,11 +21182,11 @@ esac fi GENHTML=$ac_cv_path_GENHTML if test -n "$GENHTML"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 -$as_echo "$GENHTML" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 +printf "%s\n" "$GENHTML" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -20231,8 +21252,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -20262,15 +21283,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -20284,8 +21305,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -20302,7 +21323,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -20313,14 +21334,14 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -20386,8 +21407,8 @@ fi ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -20410,14 +21431,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -20427,46 +21450,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -20475,13 +21498,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -20490,8 +21506,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -20503,30 +21523,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -20539,13 +21539,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -20572,18 +21573,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -20595,12 +21598,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -20631,7 +21635,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -20653,6 +21657,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -20666,6 +21674,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -20707,7 +21721,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -20716,7 +21730,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20778,8 +21792,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by PCRE $as_me 8.44, which was -generated by GNU Autoconf 2.69. Invocation command line was +This file was extended by PCRE $as_me 8.45, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -20841,14 +21855,16 @@ $config_commands Report bugs to the package provider." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -PCRE config.status 8.44 -configured by $0, generated by GNU Autoconf 2.69, +PCRE config.status 8.45 +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -20888,15 +21904,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -20904,7 +21920,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -20913,7 +21929,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -20941,7 +21957,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -20955,7 +21971,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -21382,9 +22398,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -21720,7 +22736,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -21728,17 +22744,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -21755,7 +22771,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -21779,9 +22795,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -21843,8 +22859,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -21888,9 +22904,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -21906,20 +22922,20 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi @@ -21939,7 +22955,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -21959,8 +22975,8 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -21986,7 +23002,7 @@ esac for am_mf do # Strip MF so we end up with the name of the file. - am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line @@ -21998,7 +23014,7 @@ $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$am_mf" | +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -22020,7 +23036,7 @@ $as_echo X"$am_mf" | $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$am_mf" | +printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -22045,10 +23061,12 @@ $as_echo X/"$am_mf" | (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments - for automatic dependency tracking. Try re-running configure with the + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } @@ -22607,6 +23625,7 @@ _LT_EOF esac + ltmain=$ac_aux_dir/ltmain.sh @@ -22811,8 +23830,8 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi @@ -22873,3 +23892,4 @@ $PACKAGE-$VERSION configuration summary: EOF + diff --git a/pcre/configure.ac b/pcre/configure.ac index 6a3e5f35d8e..4d2e2f37747 100644 --- a/pcre/configure.ac +++ b/pcre/configure.ac @@ -9,17 +9,17 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might dnl be defined as -RC2, for example. For real releases, it should be empty. m4_define(pcre_major, [8]) -m4_define(pcre_minor, [44]) +m4_define(pcre_minor, [45]) m4_define(pcre_prerelease, []) -m4_define(pcre_date, [2020-02-12]) +m4_define(pcre_date, [2021-06-15]) # NOTE: The CMakeLists.txt file searches for the above variables in the first # 50 lines of this file. Please update that if the variables above are moved. # Libtool shared library interface versions (current:revision:age) -m4_define(libpcre_version, [3:12:2]) -m4_define(libpcre16_version, [2:12:2]) -m4_define(libpcre32_version, [0:12:0]) +m4_define(libpcre_version, [3:13:2]) +m4_define(libpcre16_version, [2:13:2]) +m4_define(libpcre32_version, [0:13:0]) m4_define(libpcreposix_version, [0:7:0]) m4_define(libpcrecpp_version, [0:2:0]) diff --git a/pcre/depcomp b/pcre/depcomp index 65cbf7093a1..6b391623c4b 100755 --- a/pcre/depcomp +++ b/pcre/depcomp @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Copyright (C) 1999-2020 Free Software Foundation, Inc. # 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 diff --git a/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt b/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt index 37f6164475b..23c4e64f84a 100644 --- a/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt +++ b/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt @@ -5,8 +5,8 @@ NOTE: This document relates to PCRE releases that use the original API, with library names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of a new API, known as PCRE2, with release numbers starting at 10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries -(now called PCRE1) are still being maintained for bug fixes, but there will be -no new development. New projects are advised to use the new PCRE2 libraries. +(now called PCRE1) are now at end of life, and 8.45 is the final release. New +projects are advised to use the new PCRE2 libraries. This document contains the following sections: @@ -768,6 +768,6 @@ Everything, source and executable, is in EBCDIC and native z/OS file formats. However, this software is not maintained and will not be upgraded. If you are new to PCRE you should be looking at PCRE2 (version 10.30 or later). -=============================== -Last Updated: 13 September 2017 -=============================== +========================== +Last Updated: 15 June 2021 +========================== diff --git a/pcre/doc/html/README.txt b/pcre/doc/html/README.txt index 334362b3e53..65f5e19ef69 100644 --- a/pcre/doc/html/README.txt +++ b/pcre/doc/html/README.txt @@ -5,9 +5,8 @@ NOTE: This set of files relates to PCRE releases that use the original API, with library names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of a new API, known as PCRE2, with release numbers starting at 10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. +libraries (now called PCRE1) are now at end of life, and 8.45 is the final +release. New projects are advised to use the new PCRE2 libraries. The latest release of PCRE1 is always available in three alternative formats @@ -998,6 +997,6 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. RunTest.bat a script for running tests under Windows Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 12 February 2020 +Email local part: Philip.Hazel +Email domain: gmail.com +Last updated: 15 June 2021 diff --git a/pcre/doc/html/pcre.html b/pcre/doc/html/pcre.html index 0db75e44892..31391f5c00a 100644 --- a/pcre/doc/html/pcre.html +++ b/pcre/doc/html/pcre.html @@ -22,13 +22,12 @@ man page, in case the conversion went wrong.
PLEASE TAKE NOTE

-This document relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. +This document relates to PCRE releases that use the original API, with library +names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of +a new API, known as PCRE2, with release numbers starting at 10.00 and library +names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries (now called +PCRE1) are now at end of life, and 8.45 is the final release. New projects are +advised to use the new PCRE2 libraries.


INTRODUCTION

@@ -215,9 +214,9 @@ two digits 10, at the domain cam.ac.uk.


REVISION

-Last updated: 10 February 2015 +Last updated: 14 June 2021
-Copyright © 1997-2015 University of Cambridge. +Copyright © 1997-2021 University of Cambridge.

Return to the PCRE index page. diff --git a/pcre/doc/html/pcreapi.html b/pcre/doc/html/pcreapi.html index 2fdfbff5ccf..2a0491f0f82 100644 --- a/pcre/doc/html/pcreapi.html +++ b/pcre/doc/html/pcreapi.html @@ -1718,7 +1718,7 @@ very long time, and so the match_limit value is also used in this case

The default value for the limit can be set when PCRE is built; the default default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling pcre_exec() with a pcre_extra +override the default by supplying pcre_exec() with a pcre_extra block in which match_limit is set, and PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. @@ -1749,7 +1749,7 @@ and is ignored, when matching is done using JIT compiled code.

The default value for match_limit_recursion can be set when PCRE is built; the default default is the same value as the default for -match_limit. You can override the default by suppling pcre_exec() +match_limit. You can override the default by supplying pcre_exec() with a pcre_extra block in which match_limit_recursion is set, and PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. @@ -2063,10 +2063,10 @@ lookbehind. For example, consider the pattern which finds occurrences of "iss" in the middle of words. (\B matches only if the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to pcre_exec() finds the first +the string "Mississippi" the first call to pcre_exec() finds the first occurrence. If pcre_exec() is called again with just the remainder of the -subject, namely "issipi", it does not match, because \B is always false at the -start of the subject, which is deemed to be a word boundary. However, if +subject, namely "issippi", it does not match, because \B is always false at +the start of the subject, which is deemed to be a word boundary. However, if pcre_exec() is passed the entire string again, but with startoffset set to 4, it finds the second occurrence of "iss" because it is able to look behind the starting point to discover that it is preceded by a letter. diff --git a/pcre/doc/html/pcredemo.html b/pcre/doc/html/pcredemo.html index 894a9308261..d84c5c8c99c 100644 --- a/pcre/doc/html/pcredemo.html +++ b/pcre/doc/html/pcredemo.html @@ -161,7 +161,7 @@ if (rc < 0) return 1; } -/* Match succeded */ +/* Match succeeded */ printf("\nMatch succeeded at offset %d\n", ovector[0]); @@ -379,7 +379,7 @@ for (;;) return 1; } - /* Match succeded */ + /* Match succeeded */ printf("\nMatch succeeded again at offset %d\n", ovector[0]); diff --git a/pcre/doc/html/pcrejit.html b/pcre/doc/html/pcrejit.html index abb342522f9..c1e0310defc 100644 --- a/pcre/doc/html/pcrejit.html +++ b/pcre/doc/html/pcrejit.html @@ -299,7 +299,7 @@ recommended. This is a suggestion for how a multithreaded program that needs to set up non-default JIT stacks might operate:

-  During thread initalization
+  During thread initialization
     thread_local_var = pcre_jit_stack_alloc(...)
 
   During thread exit
diff --git a/pcre/doc/html/pcrepattern.html b/pcre/doc/html/pcrepattern.html
index 96fc72986f6..2e3e6263e49 100644
--- a/pcre/doc/html/pcrepattern.html
+++ b/pcre/doc/html/pcrepattern.html
@@ -655,7 +655,7 @@ recognized.
 

It is possible to restrict \R to match only CR, LF, or CRLF (instead of the complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation +either at compile time or when the pattern is matched. (BSR is an abbreviation for "backslash R".) This can be made the default when PCRE is built; if this is the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. It is also possible to specify these settings by starting a pattern string with @@ -972,7 +972,7 @@ additional characters according to the following rules for ending a cluster: 3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters are of five types: L, V, T, LV, and LVT. An L character may be followed by an L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. +character; an LVT or T character may be followed only by a T character.

4. Do not end before extending characters or spacing marks. Characters with @@ -3080,7 +3080,7 @@ successful match. Consider:

If the subject is "aaaac...", after the first match attempt fails (starting at the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same +next attempt at "c". Note that a possessive quantifier does not have the same effect as this example; although it would suppress backtracking during the first match attempt, the second attempt would start at the second character instead of skipping on to "c". diff --git a/pcre/doc/html/pcresyntax.html b/pcre/doc/html/pcresyntax.html index 5896b9e0688..2946ab32872 100644 --- a/pcre/doc/html/pcresyntax.html +++ b/pcre/doc/html/pcresyntax.html @@ -157,7 +157,7 @@ is changed to use Unicode properties and they match many more characters. Xan Alphanumeric: union of properties L and N Xps POSIX space: property Z or tab, NL, VT, FF, CR Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be + Xuc Universally-named character: one that can be represented by a Universal Character Name Xwd Perl word: property Xan or underscore diff --git a/pcre/doc/pcre.3 b/pcre/doc/pcre.3 index 716d58044c7..afd0830fab9 100644 --- a/pcre/doc/pcre.3 +++ b/pcre/doc/pcre.3 @@ -1,16 +1,15 @@ -.TH PCRE 3 "10 February 2015" "PCRE 8.37" +.TH PCRE 3 "14 June 2021" "PCRE 8.45" .SH NAME PCRE - Perl-compatible regular expressions (original API) .SH "PLEASE TAKE NOTE" .rs .sp -This document relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. +This document relates to PCRE releases that use the original API, with library +names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of +a new API, known as PCRE2, with release numbers starting at 10.00 and library +names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries (now called +PCRE1) are now at end of life, and 8.45 is the final release. New projects are +advised to use the new PCRE2 libraries. . . .SH INTRODUCTION @@ -225,6 +224,6 @@ two digits 10, at the domain cam.ac.uk. .rs .sp .nf -Last updated: 10 February 2015 -Copyright (c) 1997-2015 University of Cambridge. +Last updated: 14 June 2021 +Copyright (c) 1997-2021 University of Cambridge. .fi diff --git a/pcre/doc/pcre.txt b/pcre/doc/pcre.txt index 8ffc90234ac..f71526961f7 100644 --- a/pcre/doc/pcre.txt +++ b/pcre/doc/pcre.txt @@ -21,9 +21,9 @@ PLEASE TAKE NOTE library names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of a new API, known as PCRE2, with release numbers start- ing at 10.00 and library names libpcre2-8, libpcre2-16, and - libpcre2-32. The old libraries (now called PCRE1) are still being main- - tained for bug fixes, but there will be no new development. New - projects are advised to use the new PCRE2 libraries. + libpcre2-32. The old libraries (now called PCRE1) are now at end of + life, and 8.45 is the final release. New projects are advised to use + the new PCRE2 libraries. INTRODUCTION @@ -190,8 +190,8 @@ AUTHOR REVISION - Last updated: 10 February 2015 - Copyright (c) 1997-2015 University of Cambridge. + Last updated: 14 June 2021 + Copyright (c) 1997-2021 University of Cambridge. ------------------------------------------------------------------------------ @@ -3155,7 +3155,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The default value for the limit can be set when PCRE is built; the de- fault default is 10 million, which handles all but the most extreme - cases. You can override the default by suppling pcre_exec() with a + cases. You can override the default by supplying pcre_exec() with a pcre_extra block in which match_limit is set, and PCRE_EX- TRA_MATCH_LIMIT is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. @@ -3183,7 +3183,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION The default value for match_limit_recursion can be set when PCRE is built; the default default is the same value as the default for - match_limit. You can override the default by suppling pcre_exec() with + match_limit. You can override the default by supplying pcre_exec() with a pcre_extra block in which match_limit_recursion is set, and PCRE_EX- TRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. @@ -3475,9 +3475,9 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION which finds occurrences of "iss" in the middle of words. (\B matches only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() + When applied to the string "Mississippi" the first call to pcre_exec() finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, be- + the remainder of the subject, namely "issippi", it does not match, be- cause \B is always false at the start of the subject, which is deemed to be a word boundary. However, if pcre_exec() is passed the entire string again, but with startoffset set to 4, it finds the second occur- @@ -5292,11 +5292,11 @@ BACKSLASH It is possible to restrict \R to match only CR, LF, or CRLF (instead of the complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched. - (BSR is an abbrevation for "backslash R".) This can be made the default - when PCRE is built; if this is the case, the other behaviour can be re- - quested via the PCRE_BSR_UNICODE option. It is also possible to spec- - ify these settings by starting a pattern string with one of the follow- - ing sequences: + (BSR is an abbreviation for "backslash R".) This can be made the de- + fault when PCRE is built; if this is the case, the other behaviour can + be requested via the PCRE_BSR_UNICODE option. It is also possible to + specify these settings by starting a pattern string with one of the + following sequences: (*BSR_ANYCRLF) CR, LF, or CRLF only (*BSR_UNICODE) any Unicode newline sequence @@ -5488,8 +5488,8 @@ BACKSLASH 3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters are of five types: L, V, T, LV, and LVT. An L character may be followed by an L, V, LV, or LVT character; an LV or V character may - be followed by a V or T character; an LVT or T character may be follwed - only by a T character. + be followed by a V or T character; an LVT or T character may be fol- + lowed only by a T character. 4. Do not end before extending characters or spacing marks. Characters with the "mark" property always have the "extend" grapheme breaking @@ -7494,7 +7494,7 @@ BACKTRACKING CONTROL If the subject is "aaaac...", after the first match attempt fails (starting at the first character in the string), the starting point skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect as this example; although it would + tifier does not have the same effect as this example; although it would suppress backtracking during the first match attempt, the second at- tempt would start at the second character instead of skipping on to "c". @@ -7793,7 +7793,7 @@ PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P Xan Alphanumeric: union of properties L and N Xps POSIX space: property Z or tab, NL, VT, FF, CR Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be + Xuc Universally-named character: one that can be represented by a Universal Character Name Xwd Perl word: property Xan or underscore @@ -8571,7 +8571,7 @@ CONTROLLING THE JIT STACK This is a suggestion for how a multithreaded program that needs to set up non-default JIT stacks might operate: - During thread initalization + During thread initialization thread_local_var = pcre_jit_stack_alloc(...) During thread exit diff --git a/pcre/doc/pcreapi.3 b/pcre/doc/pcreapi.3 index d79217818a6..685672a3cef 100644 --- a/pcre/doc/pcreapi.3 +++ b/pcre/doc/pcreapi.3 @@ -1699,7 +1699,7 @@ very long time, and so the \fImatch_limit\fP value is also used in this case .P The default value for the limit can be set when PCRE is built; the default default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP +override the default by supplying \fBpcre_exec()\fP with a \fBpcre_extra\fP block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_MATCHLIMIT. @@ -1726,7 +1726,7 @@ and is ignored, when matching is done using JIT compiled code. .P The default value for \fImatch_limit_recursion\fP can be set when PCRE is built; the default default is the same value as the default for -\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP +\fImatch_limit\fP. You can override the default by supplying \fBpcre_exec()\fP with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT. @@ -2044,10 +2044,10 @@ lookbehind. For example, consider the pattern .sp which finds occurrences of "iss" in the middle of words. (\eB matches only if the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first +the string "Mississippi" the first call to \fBpcre_exec()\fP finds the first occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the -subject, namely "issipi", it does not match, because \eB is always false at the -start of the subject, which is deemed to be a word boundary. However, if +subject, namely "issippi", it does not match, because \eB is always false at +the start of the subject, which is deemed to be a word boundary. However, if \fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP set to 4, it finds the second occurrence of "iss" because it is able to look behind the starting point to discover that it is preceded by a letter. diff --git a/pcre/doc/pcredemo.3 b/pcre/doc/pcredemo.3 index 194629b1fac..4115ef1e36e 100644 --- a/pcre/doc/pcredemo.3 +++ b/pcre/doc/pcredemo.3 @@ -161,7 +161,7 @@ if (rc < 0) return 1; } -/* Match succeded */ +/* Match succeeded */ printf("\enMatch succeeded at offset %d\en", ovector[0]); @@ -379,7 +379,7 @@ for (;;) return 1; } - /* Match succeded */ + /* Match succeeded */ printf("\enMatch succeeded again at offset %d\en", ovector[0]); diff --git a/pcre/doc/pcrejit.3 b/pcre/doc/pcrejit.3 index 3b785f0f631..fe42db56170 100644 --- a/pcre/doc/pcrejit.3 +++ b/pcre/doc/pcrejit.3 @@ -285,7 +285,7 @@ recommended. This is a suggestion for how a multithreaded program that needs to set up non-default JIT stacks might operate: .sp - During thread initalization + During thread initialization thread_local_var = pcre_jit_stack_alloc(...) .sp During thread exit diff --git a/pcre/doc/pcrepattern.3 b/pcre/doc/pcrepattern.3 index 97df217fdb2..2f501a6503b 100644 --- a/pcre/doc/pcrepattern.3 +++ b/pcre/doc/pcrepattern.3 @@ -656,7 +656,7 @@ recognized. .P It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation +either at compile time or when the pattern is matched. (BSR is an abbreviation for "backslash R".) This can be made the default when PCRE is built; if this is the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. It is also possible to specify these settings by starting a pattern string with @@ -968,7 +968,7 @@ additional characters according to the following rules for ending a cluster: 3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters are of five types: L, V, T, LV, and LVT. An L character may be followed by an L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. +character; an LVT or T character may be followed only by a T character. .P 4. Do not end before extending characters or spacing marks. Characters with the "mark" property always have the "extend" grapheme breaking property. @@ -3115,7 +3115,7 @@ successful match. Consider: .sp If the subject is "aaaac...", after the first match attempt fails (starting at the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same +next attempt at "c". Note that a possessive quantifier does not have the same effect as this example; although it would suppress backtracking during the first match attempt, the second attempt would start at the second character instead of skipping on to "c". diff --git a/pcre/doc/pcresyntax.3 b/pcre/doc/pcresyntax.3 index 0850369f7aa..b77a8664ed9 100644 --- a/pcre/doc/pcresyntax.3 +++ b/pcre/doc/pcresyntax.3 @@ -123,7 +123,7 @@ is changed to use Unicode properties and they match many more characters. Xan Alphanumeric: union of properties L and N Xps POSIX space: property Z or tab, NL, VT, FF, CR Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be + Xuc Universally-named character: one that can be represented by a Universal Character Name Xwd Perl word: property Xan or underscore .sp diff --git a/pcre/install-sh b/pcre/install-sh index 8175c640fe6..ec298b53740 100755 --- a/pcre/install-sh +++ b/pcre/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2018-03-11.20; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -69,6 +69,11 @@ posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -99,18 +104,28 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,8 +152,13 @@ while test $# -ne 0; do -o) chowncmd="$chownprog $2" shift;; + -p) cpprog="$cpprog -p";; + -s) stripcmd=$stripprog;; + -S) backupsuffix="$2" + shift;; + -t) is_target_a_directory=always dst_arg=$2 @@ -255,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -301,22 +325,6 @@ do if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then @@ -326,52 +334,49 @@ do fi posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - # Note that $RANDOM variable is not portable (e.g. dash); Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p' feature. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac;; + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; esac if @@ -382,7 +387,7 @@ do then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. @@ -411,7 +416,7 @@ do prefixes= else if $posix_mkdir; then - (umask=$mkdir_umask && + (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 @@ -451,7 +456,18 @@ do trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -477,6 +493,13 @@ do then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -491,9 +514,9 @@ do # file should still install successfully. { test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || + $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 diff --git a/pcre/ltmain.sh b/pcre/ltmain.sh index d3ab94d6f4b..48cea9b0e5b 100644 --- a/pcre/ltmain.sh +++ b/pcre/ltmain.sh @@ -2,7 +2,7 @@ ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2018-07-24.06 -# libtool (GNU libtool) 2.4.6.42-b88ce +# libtool (GNU libtool) 2.4.6.42-b88ce-dirty # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 @@ -31,7 +31,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION=2.4.6.42-b88ce +VERSION=2.4.6.42-b88ce-dirty package_revision=2.4.6.42 @@ -2176,7 +2176,7 @@ func_version () # End: # Set a version string. -scriptversion='(GNU libtool) 2.4.6.42-b88ce' +scriptversion='(GNU libtool) 2.4.6.42-b88ce-dirty' # func_echo ARG... @@ -2267,7 +2267,7 @@ include the following information: compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.6.42-b88ce + version: $progname (GNU libtool) 2.4.6.42-b88ce-dirty automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` diff --git a/pcre/m4/ltversion.m4 b/pcre/m4/ltversion.m4 index 86b2ad72358..7f9a3ada976 100644 --- a/pcre/m4/ltversion.m4 +++ b/pcre/m4/ltversion.m4 @@ -12,11 +12,11 @@ # serial 4221 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce]) +m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce-dirty]) m4_define([LT_PACKAGE_REVISION], [2.4.6.42]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.6.42-b88ce' +[macro_version='2.4.6.42-b88ce-dirty' macro_revision='2.4.6.42' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) diff --git a/pcre/missing b/pcre/missing index 625aeb11897..8d0eaad250f 100755 --- a/pcre/missing +++ b/pcre/missing @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify diff --git a/pcre/pcre.h.generic b/pcre/pcre.h.generic index 86e3956c212..bee1fe6ffd6 100644 --- a/pcre/pcre.h.generic +++ b/pcre/pcre.h.generic @@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE_MAJOR 8 -#define PCRE_MINOR 44 +#define PCRE_MINOR 45 #define PCRE_PRERELEASE -#define PCRE_DATE 2020-02-12 +#define PCRE_DATE 2021-06-15 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate diff --git a/pcre/pcre_compile.c b/pcre/pcre_compile.c index 3be0fbfb189..8b80abe0399 100644 --- a/pcre/pcre_compile.c +++ b/pcre/pcre_compile.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2020 University of Cambridge + Copyright (c) 1997-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -9099,6 +9099,8 @@ pcre_uchar cworkspace[COMPILE_WORK_SIZE]; similar way to cworkspace, it can be expanded using malloc() if necessary. */ named_group named_groups[NAMED_GROUP_LIST_SIZE]; +cd->named_groups = named_groups; +cd->named_group_list_size = NAMED_GROUP_LIST_SIZE; /* Set this early so that early errors get offset 0. */ @@ -9372,8 +9374,6 @@ cd->hwm = cworkspace; cd->iscondassert = FALSE; cd->start_workspace = cworkspace; cd->workspace_size = COMPILE_WORK_SIZE; -cd->named_groups = named_groups; -cd->named_group_list_size = NAMED_GROUP_LIST_SIZE; cd->start_pattern = (const pcre_uchar *)pattern; cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern)); cd->req_varyopt = 0; @@ -9484,6 +9484,7 @@ if (cd->names_found > 0) add_name(cd, ng->name, ng->length, ng->number); if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) (PUBL(free))((void *)cd->named_groups); + cd->named_group_list_size = 0; /* So we don't free it twice */ } /* Set up a starting, non-extracting bracket, then compile the expression. On @@ -9634,6 +9635,8 @@ if (errorcode != 0) { (PUBL(free))(re); PCRE_EARLY_ERROR_RETURN: + if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) + (PUBL(free))((void *)cd->named_groups); *erroroffset = (int)(ptr - (const pcre_uchar *)pattern); PCRE_EARLY_ERROR_RETURN2: *errorptr = find_error_text(errorcode); diff --git a/pcre/pcre_exec.c b/pcre/pcre_exec.c index 3fd58cbe31c..5b96954fcd9 100644 --- a/pcre/pcre_exec.c +++ b/pcre/pcre_exec.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2018 University of Cambridge + Copyright (c) 1997-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -758,7 +758,7 @@ for (;;) md->mark = NULL; /* In case previously set by assertion */ RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, eptrb, RM55); - if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT || rrc == MATCH_KETRPOS) && md->mark == NULL) md->mark = ecode + 2; /* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an diff --git a/pcre/pcredemo.c b/pcre/pcredemo.c index 946aba45cdc..1ca77f1537a 100644 --- a/pcre/pcredemo.c +++ b/pcre/pcredemo.c @@ -144,7 +144,7 @@ if (rc < 0) return 1; } -/* Match succeded */ +/* Match succeeded */ printf("\nMatch succeeded at offset %d\n", ovector[0]); @@ -362,7 +362,7 @@ for (;;) return 1; } - /* Match succeded */ + /* Match succeeded */ printf("\nMatch succeeded again at offset %d\n", ovector[0]); diff --git a/pcre/test-driver b/pcre/test-driver index b8521a482e2..9759384aa72 100755 --- a/pcre/test-driver +++ b/pcre/test-driver @@ -3,7 +3,7 @@ scriptversion=2018-03-07.03; # UTC -# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# Copyright (C) 2011-2020 Free Software Foundation, Inc. # # 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 @@ -42,11 +42,13 @@ print_usage () { cat < \w+ )/xi pokus.hokus +/(?:A(*:X))*+/K + A + /-- End of testinput1 --/ diff --git a/pcre/testdata/testoutput1 b/pcre/testdata/testoutput1 index e6147e60b95..212dafaae58 100644 --- a/pcre/testdata/testoutput1 +++ b/pcre/testdata/testoutput1 @@ -9470,4 +9470,9 @@ No match 0: pokus.hokus 1: hokus +/(?:A(*:X))*+/K + A + 0: A +MK: X + /-- End of testinput1 --/ From 65e3d0853860d4991430b49949d01d60b8dc97f1 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 27 Jul 2021 19:21:39 +0200 Subject: [PATCH 91/98] MDEV-7209 mroonga storage engine fails to build on OpenBSD rename files `version` -> `version_full` --- storage/mroonga/CMakeLists.txt | 2 +- .../vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt | 2 +- .../plugins/groonga-normalizer-mysql/{version => version_full} | 0 storage/mroonga/{version => version_full} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/{version => version_full} (100%) rename storage/mroonga/{version => version_full} (100%) diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index 317c337e247..6671b3a8d56 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -80,7 +80,7 @@ else() set(MRN_SOURCE_DIR ${CMAKE_SOURCE_DIR}) endif() -file(READ ${MRN_SOURCE_DIR}/version MRN_VERSION) +file(READ ${MRN_SOURCE_DIR}/version_full MRN_VERSION) file(READ ${MRN_SOURCE_DIR}/version_major MRN_VERSION_MAJOR) file(READ ${MRN_SOURCE_DIR}/version_minor MRN_VERSION_MINOR) file(READ ${MRN_SOURCE_DIR}/version_micro MRN_VERSION_MICRO) diff --git a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt index 80e531e5319..96e3f1a570d 100644 --- a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt @@ -29,7 +29,7 @@ option(GROONGA_NORMALIZER_MYSQL_EMBED "Build as a static library to embed into an application" ${GROONGA_NORMALIZER_MYSQL_EMBED_DEFAULT}) -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/version" VERSION) +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/version_full" VERSION) if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") set(GROONGA_NORMALIZER_MYSQL_BUNDLED FALSE) diff --git a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/version b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/version_full similarity index 100% rename from storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/version rename to storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/version_full diff --git a/storage/mroonga/version b/storage/mroonga/version_full similarity index 100% rename from storage/mroonga/version rename to storage/mroonga/version_full From dfadc90303aeb36c7f9c52119f0ef757348f3ff2 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 27 Jul 2021 18:56:00 +0200 Subject: [PATCH 92/98] latest C/C --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index 490100ccace..0cc16f18c1d 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 490100ccacedc7aeb89b634fd3f7648a59d096b4 +Subproject commit 0cc16f18c1d87bbe6e360eaf578fcedeb9479114 From fb8be6a631e68c57d36c1a0637033f6827105366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 28 Jul 2021 09:40:20 +0300 Subject: [PATCH 93/98] Cleanup: Remove dead code Thanks to Nikita Malyavin for noticing this. The dead code that was originally introduced in mysql/mysql-server@b8bd31740cd7088f3a3c164981c7ccda487d301d was added in commit 2e814d4702d71a04388386a9f591d14a35980bfe to this code base. --- storage/innobase/handler/handler0alter.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 88e02ee4e32..c8888bada02 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -5424,12 +5424,6 @@ ha_innobase::prepare_inplace_alter_table( if (!(ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)) { /* Nothing to do */ DBUG_ASSERT(m_prebuilt->trx->dict_operation_lock_mode == 0); - if (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) { - - online_retry_drop_indexes( - m_prebuilt->table, m_user_thd); - - } DBUG_RETURN(false); } From 43099af95bc554ff870b00bbe965dbcf4662ec86 Mon Sep 17 00:00:00 2001 From: Yongxin Xu <55976466+yongxin-xu@users.noreply.github.com> Date: Wed, 28 Jul 2021 23:19:36 +0800 Subject: [PATCH 94/98] MDEV-24020: Trim with remove_str Fails on Spider This patch fixes the bug that TRIM(BOTH ... FROM $str), TRIM(LEADING ... FROM $str), and TRIM(TRAILING ... FROM $str) failed with errors when executing on Spider. --- .../bugfix/include/mdev_24020_deinit.inc | 11 ++ .../spider/bugfix/include/mdev_24020_init.inc | 43 ++++++ .../spider/bugfix/r/mdev_24020.result | 97 ++++++++++++++ .../mysql-test/spider/bugfix/t/mdev_24020.cnf | 3 + .../spider/bugfix/t/mdev_24020.test | 90 +++++++++++++ storage/spider/spd_db_conn.h | 9 ++ storage/spider/spd_db_mysql.cc | 122 ++++++++++++++++-- 7 files changed, 366 insertions(+), 9 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/include/mdev_24020_deinit.inc create mode 100644 storage/spider/mysql-test/spider/bugfix/include/mdev_24020_init.inc create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_24020.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24020.cnf create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_24020.test diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_deinit.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_deinit.inc new file mode 100644 index 00000000000..1880a1c7bba --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_deinit.inc @@ -0,0 +1,11 @@ +--let $MASTER_1_COMMENT_P_2_1= $MASTER_1_COMMENT_P_2_1_BACKUP +--let $CHILD2_1_DROP_TABLES= $CHILD2_1_DROP_TABLES_BACKUP +--let $CHILD2_1_CREATE_TABLES= $CHILD2_1_CREATE_TABLES_BACKUP +--let $CHILD2_1_SELECT_TABLES= $CHILD2_1_SELECT_TABLES_BACKUP +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_result_log +--enable_query_log +--enable_warnings diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_init.inc new file mode 100644 index 00000000000..63fd70a4b49 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_24020_init.inc @@ -0,0 +1,43 @@ +--disable_warnings +--disable_query_log +--disable_result_log +--source ../t/test_init.inc +--enable_result_log +--enable_query_log +--enable_warnings +--let $MASTER_1_COMMENT_P_2_1_BACKUP= $MASTER_1_COMMENT_P_2_1 +let $MASTER_1_COMMENT_P_2_1= + PARTITION BY LIST(a % 3) ( + PARTITION pt1 VALUES IN (0) COMMENT='srv "s_2_1", table "ta_r2"', + PARTITION pt2 VALUES IN (1) COMMENT='srv "s_2_1", table "ta_r3"', + PARTITION pt3 VALUES IN (2) COMMENT='srv "s_2_1", table "ta_r4"' + ); +--let $CHILD2_1_DROP_TABLES_BACKUP= $CHILD2_1_DROP_TABLES +let $CHILD2_1_DROP_TABLES= + DROP TABLE IF EXISTS ta_r2 $STR_SEMICOLON + DROP TABLE IF EXISTS ta_r3 $STR_SEMICOLON + DROP TABLE IF EXISTS ta_r4; +--let $CHILD2_1_CREATE_TABLES_BACKUP= $CHILD2_1_CREATE_TABLES +let $CHILD2_1_CREATE_TABLES= + CREATE TABLE ta_r2 ( + a INT, + b VARCHAR(30), + PRIMARY KEY(a) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON + CREATE TABLE ta_r3 ( + a INT, + b VARCHAR(30), + PRIMARY KEY(a) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET $STR_SEMICOLON + CREATE TABLE ta_r4 ( + a INT, + b VARCHAR(30), + PRIMARY KEY(a) + ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +--let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES +let $CHILD2_1_SELECT_TABLES= + SELECT a, b FROM ta_r2 ORDER BY a $STR_SEMICOLON + SELECT a, b FROM ta_r3 ORDER BY a $STR_SEMICOLON + SELECT a, b FROM ta_r4 ORDER BY a; +let $CHILD2_1_SELECT_ARGUMENT1= + SELECT argument FROM mysql.general_log WHERE argument LIKE '%select %'; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_24020.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_24020.result new file mode 100644 index 00000000000..164c68fbc0c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_24020.result @@ -0,0 +1,97 @@ +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +this test is for MDEV-24020 + +drop and create databases +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +create table and insert +connection child2_1; +CHILD2_1_CREATE_TABLES +connection master_1; +CREATE TABLE tbl_a ( +a INT, +b VARCHAR(30), +PRIMARY KEY(a) +) ENGINE=Spider PARTITION BY LIST(a % 3) ( +PARTITION pt1 VALUES IN (0) COMMENT='srv "s_2_1", table "ta_r2"', +PARTITION pt2 VALUES IN (1) COMMENT='srv "s_2_1", table "ta_r3"', +PARTITION pt3 VALUES IN (2) COMMENT='srv "s_2_1", table "ta_r4"' + ) +INSERT INTO tbl_a VALUES(10000, " abcd "); +INSERT INTO tbl_a VALUES(10001, " abcd "); +INSERT INTO tbl_a VALUES(10002, " abcd "); +INSERT INTO tbl_a VALUES(10003, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10004, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10005, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10006, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10007, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10008, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10009, "[[[**abcd****]]"); + +test 1 +connection master_1; +UPDATE tbl_a SET b = trim(b) WHERE a = 10000; +SELECT * FROM tbl_a WHERE a = 10000; +a b +10000 abcd +UPDATE tbl_a SET b = ltrim(b) WHERE a = 10001; +SELECT * FROM tbl_a WHERE a = 10001; +a b +10001 abcd +UPDATE tbl_a SET b = rtrim(b) WHERE a = 10002; +SELECT * FROM tbl_a WHERE a = 10002; +a b +10002 abcd +UPDATE tbl_a SET b = trim(BOTH '[' FROM b) WHERE a = 10003; +SELECT * FROM tbl_a WHERE a = 10003; +a b +10003 abcd] +UPDATE tbl_a SET b = trim(LEADING '[' FROM b) WHERE a = 10004; +SELECT * FROM tbl_a WHERE a = 10004; +a b +10004 abcd][[ +UPDATE tbl_a SET b = trim(TRAILING '[' FROM b) WHERE a = 10005; +SELECT * FROM tbl_a WHERE a = 10005; +a b +10005 [[[abcd] +UPDATE tbl_a SET b = trim(LEADING '[' FROM trim(TRAILING ']' FROM b)) WHERE a = 10006; +SELECT * FROM tbl_a WHERE a = 10006; +a b +10006 abcd +UPDATE tbl_a SET b = trim(TRAILING '[' FROM trim(LEADING ']' FROM b)) WHERE a = 10007; +SELECT * FROM tbl_a WHERE a = 10007; +a b +10007 [[[abcd]] +UPDATE tbl_a SET b = trim(TRAILING ']' FROM trim(LEADING '[' FROM b)) WHERE a = 10008; +SELECT * FROM tbl_a WHERE a = 10008; +a b +10008 abcd +UPDATE tbl_a SET b = trim(BOTH '*' FROM trim(TRAILING ']' FROM trim(LEADING '[' FROM b))) WHERE a = 10009; +SELECT * FROM tbl_a WHERE a = 10009; +a b +10009 abcd + +deinit +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 + +end of test diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.test new file mode 100644 index 00000000000..ac06d86052b --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_24020.test @@ -0,0 +1,90 @@ +--source ../include/mdev_24020_init.inc +--echo +--echo this test is for MDEV-24020 +--echo +--echo drop and create databases + +--connection master_1 +--disable_warnings +CREATE DATABASE auto_test_local; +USE auto_test_local; + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +--enable_warnings + +--echo +--echo create table and insert + +--connection child2_1 +--disable_query_log +--disable_ps_protocol +echo CHILD2_1_CREATE_TABLES; +eval $CHILD2_1_CREATE_TABLES; +--enable_ps_protocol +--enable_query_log + +--connection master_1 +--disable_query_log +echo CREATE TABLE tbl_a ( + a INT, + b VARCHAR(30), + PRIMARY KEY(a) +) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1; +eval CREATE TABLE tbl_a ( + a INT, + b VARCHAR(30), + PRIMARY KEY(a) +) $MASTER_1_ENGINE $MASTER_1_COMMENT_P_2_1; +--enable_query_log +INSERT INTO tbl_a VALUES(10000, " abcd "); +INSERT INTO tbl_a VALUES(10001, " abcd "); +INSERT INTO tbl_a VALUES(10002, " abcd "); +INSERT INTO tbl_a VALUES(10003, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10004, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10005, "[[[abcd][["); +INSERT INTO tbl_a VALUES(10006, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10007, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10008, "[[[abcd]]"); +INSERT INTO tbl_a VALUES(10009, "[[[**abcd****]]"); + +--echo +--echo test 1 + +--connection master_1 +UPDATE tbl_a SET b = trim(b) WHERE a = 10000; +SELECT * FROM tbl_a WHERE a = 10000; +UPDATE tbl_a SET b = ltrim(b) WHERE a = 10001; +SELECT * FROM tbl_a WHERE a = 10001; +UPDATE tbl_a SET b = rtrim(b) WHERE a = 10002; +SELECT * FROM tbl_a WHERE a = 10002; +UPDATE tbl_a SET b = trim(BOTH '[' FROM b) WHERE a = 10003; +SELECT * FROM tbl_a WHERE a = 10003; +UPDATE tbl_a SET b = trim(LEADING '[' FROM b) WHERE a = 10004; +SELECT * FROM tbl_a WHERE a = 10004; +UPDATE tbl_a SET b = trim(TRAILING '[' FROM b) WHERE a = 10005; +SELECT * FROM tbl_a WHERE a = 10005; +UPDATE tbl_a SET b = trim(LEADING '[' FROM trim(TRAILING ']' FROM b)) WHERE a = 10006; +SELECT * FROM tbl_a WHERE a = 10006; +UPDATE tbl_a SET b = trim(TRAILING '[' FROM trim(LEADING ']' FROM b)) WHERE a = 10007; +SELECT * FROM tbl_a WHERE a = 10007; +UPDATE tbl_a SET b = trim(TRAILING ']' FROM trim(LEADING '[' FROM b)) WHERE a = 10008; +SELECT * FROM tbl_a WHERE a = 10008; +UPDATE tbl_a SET b = trim(BOTH '*' FROM trim(TRAILING ']' FROM trim(LEADING '[' FROM b))) WHERE a = 10009; +SELECT * FROM tbl_a WHERE a = 10009; + +--echo +--echo deinit +--disable_warnings + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; + +--enable_warnings +--source ../include/mdev_24020_deinit.inc +--echo +--echo end of test diff --git a/storage/spider/spd_db_conn.h b/storage/spider/spd_db_conn.h index e3f95f7b28d..fe58586c7f6 100644 --- a/storage/spider/spd_db_conn.h +++ b/storage/spider/spd_db_conn.h @@ -252,6 +252,15 @@ #define SPIDER_SQL_B_STR "b" #define SPIDER_SQL_B_LEN (sizeof(SPIDER_SQL_B_STR) - 1) +#define SPIDER_SQL_TRIM_STR "trim" +#define SPIDER_SQL_TRIM_LEN sizeof(SPIDER_SQL_TRIM_STR) - 1 +#define SPIDER_SQL_TRIM_BOTH_STR "both " +#define SPIDER_SQL_TRIM_BOTH_LEN sizeof(SPIDER_SQL_TRIM_BOTH_STR) - 1 +#define SPIDER_SQL_TRIM_LEADING_STR "leading " +#define SPIDER_SQL_TRIM_LEADING_LEN sizeof(SPIDER_SQL_TRIM_LEADING_STR) - 1 +#define SPIDER_SQL_TRIM_TRAILING_STR "trailing " +#define SPIDER_SQL_TRIM_TRAILING_LEN sizeof(SPIDER_SQL_TRIM_TRAILING_STR) - 1 + #define SPIDER_SQL_INDEX_IGNORE_STR " IGNORE INDEX " #define SPIDER_SQL_INDEX_IGNORE_LEN (sizeof(SPIDER_SQL_INDEX_IGNORE_STR) - 1) #define SPIDER_SQL_INDEX_USE_STR " USE INDEX " diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 85c765a1a27..3cfc1f7eff1 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -4181,18 +4181,122 @@ int spider_db_mbase_util::open_item_func( ) { /* no action */ break; - } else if (func_name_length == 4 && - !strncasecmp("rand", func_name, func_name_length) && + } else if (func_name_length == 4) + { + if ( + !strncasecmp("rand", func_name, func_name_length) && #ifdef SPIDER_Item_args_arg_count_IS_PROTECTED - !item_func->argument_count() + !item_func->argument_count() #else - !item_func->arg_count + !item_func->arg_count #endif - ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields)); + ) { + if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields)); + } else if ( + !strncasecmp("trim", func_name, func_name_length) && + item_count == 2 + ) { + /* item_count == 1 means this TRIM() is without a remove_str */ + item = item_list[0]; + Item *item_tmp = item_list[1]; + if (str) + { + if (item_tmp->type() == Item::STRING_ITEM) + { + /* 1. append 'TRIM(BOTH ' */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_BOTH_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); + } + } + item_count -= 2; + break; + } + } else if (func_name_length == 5) + { + if ( + (!strncasecmp("ltrim", func_name, func_name_length) || + !strncasecmp("rtrim", func_name, func_name_length)) && + (item_count == 2) + ) { + /* the func_name for TRIM(LEADING ...) is LTRIM, for TRIM(TRAILING) is RTRIM */ + /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */ + item = item_list[0]; + Item *item_tmp = item_list[1]; + if (str) + { + if (item_tmp->type() == Item::STRING_ITEM) + { + /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ + if (func_name[0] == 'l' || func_name[0] == 'L') + { /* ltrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_LEADING_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); + } else + { /* rtrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_TRAILING_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); + } + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); + } + } + item_count -= 2; + break; + } } else if (func_name_length == 6 && !strncasecmp("istrue", func_name, func_name_length) ) { From 9d5967f74bd0c471153c80ced240e586721e0e03 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Thu, 29 Jul 2021 02:08:11 +0300 Subject: [PATCH 95/98] fixup 0bd9f755b MDEV-26062 Pass char* to WSREP_LOG and others, instead of non-POD objects --- storage/innobase/row/row0upd.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index c4a7f93ed2a..73d35cb92a2 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -2475,13 +2475,13 @@ row_upd_sec_index_entry( case DB_LOCK_WAIT_TIMEOUT: WSREP_DEBUG("Foreign key check fail: " "%s on table %s index %s query %s", - ut_strerr(err), index->name, index->table->name, + ut_strerr(err), index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); break; default: WSREP_ERROR("Foreign key check fail: " "%s on table %s index %s query %s", - ut_strerr(err), index->name, index->table->name, + ut_strerr(err), index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); break; } @@ -2810,14 +2810,14 @@ check_fk: case DB_LOCK_WAIT_TIMEOUT: WSREP_DEBUG("Foreign key check fail: " "%s on table %s index %s query %s", - ut_strerr(err), index->name, index->table->name, + ut_strerr(err), index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); goto err_exit; default: WSREP_ERROR("Foreign key check fail: " "%s on table %s index %s query %s", - ut_strerr(err), index->name, index->table->name, + ut_strerr(err), index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); goto err_exit; @@ -3041,13 +3041,13 @@ row_upd_del_mark_clust_rec( case DB_LOCK_WAIT_TIMEOUT: WSREP_DEBUG("Foreign key check fail: " "%d on table %s index %s query %s", - err, index->name, index->table->name, + err, index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); break; default: WSREP_ERROR("Foreign key check fail: " "%d on table %s index %s query %s", - err, index->name, index->table->name, + err, index->name(), index->table->name.m_name, wsrep_thd_query(trx->mysql_thd)); break; } From c86f813afe372a9dffc1badbc8f26e35e9d44b29 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 23 Apr 2019 13:45:28 +0400 Subject: [PATCH 96/98] MDEV-9234 Add Type_handler::union_element_finalize() --- sql/sql_type.cc | 12 ++++++++++++ sql/sql_type.h | 10 +++++++++- sql/sql_union.cc | 10 +++++----- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 32862be371a..720fea7ebb4 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -5933,6 +5933,18 @@ void Type_handler_geometry::Item_param_set_param_func(Item_param *param, /***************************************************************************/ +bool Type_handler_string_result::union_element_finalize(const Item * item) const +{ + if (item->collation.derivation == DERIVATION_NONE) + { + my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION"); + return true; + } + return false; +} + +/***************************************************************************/ + bool Type_handler::Vers_history_point_resolve_unit(THD *thd, Vers_history_point *point) const diff --git a/sql/sql_type.h b/sql/sql_type.h index b52b1fda678..383ce800f7b 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -1187,6 +1187,14 @@ public: virtual Field *make_conversion_table_field(TABLE *TABLE, uint metadata, const Field *target) const= 0; + /* + Performs the final data type validation for a UNION element, + after the regular "aggregation for result" was done. + */ + virtual bool union_element_finalize(const Item * item) const + { + return false; + } virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0; virtual bool Column_definition_prepare_stage1(THD *thd, MEM_ROOT *mem_root, @@ -2236,7 +2244,7 @@ public: void sortlength(THD *thd, const Type_std_attributes *item, SORT_FIELD_ATTR *attr) const; - + bool union_element_finalize(const Item * item) const; bool Column_definition_prepare_stage1(THD *thd, MEM_ROOT *mem_root, Column_definition *c, diff --git a/sql/sql_union.cc b/sql/sql_union.cc index a4ad67ae74e..c89e59a06f8 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1150,12 +1150,12 @@ cont: while ((type= tp++)) { - if (type->cmp_type() == STRING_RESULT && - type->collation.derivation == DERIVATION_NONE) - { - my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION"); + /* + Test if the aggregated data type is OK for a UNION element. + E.g. in case of string data, DERIVATION_NONE is not allowed. + */ + if (type->type_handler()->union_element_finalize(type)) goto err; - } } /* From 6152ab7b42c18d62030ef9c23e9abb3817c73f39 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 27 Jul 2021 23:45:30 +0200 Subject: [PATCH 97/98] MDEV-24511 null field is created with CREATE..SELECT When creating fields for UNION results, Field_null is not allowed. Should create binary(0) instead. --- mysql-test/main/union.result | 31 ++++++++++++++++++++++++++++++- mysql-test/main/union.test | 25 +++++++++++++++++++++++++ sql/sql_type.cc | 8 +++++++- sql/sql_type.h | 6 ++++-- sql/sql_union.cc | 3 ++- 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/mysql-test/main/union.result b/mysql-test/main/union.result index a892f6c9e40..011d65578cb 100644 --- a/mysql-test/main/union.result +++ b/mysql-test/main/union.result @@ -1609,7 +1609,7 @@ NULL binary(0) YES NULL CREATE TABLE t5 SELECT NULL UNION SELECT NULL; DESC t5; Field Type Null Key Default Extra -NULL null YES NULL +NULL binary(0) YES NULL CREATE TABLE t6 SELECT * FROM (SELECT * FROM (SELECT NULL)a) b UNION SELECT a FROM t1; DESC t6; @@ -2635,5 +2635,34 @@ CAST(1 AS UNSIGNED) 1 1 # +# MDEV-24511 null field is created with CREATE..SELECT +# +set @save_default_storage_engine=@@default_storage_engine; +SET @@default_storage_engine=MEMORY; +CREATE TABLE t1 SELECT NULL UNION SELECT NULL; +ALTER TABLE t1 ADD INDEX (`PRIMARY`); +ERROR 42000: Key column 'PRIMARY' doesn't exist in table +CREATE TABLE t2 SELECT NULL; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `NULL` binary(0) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +CREATE TABLE t3 SELECT NULL UNION SELECT NULL; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `NULL` binary(0) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +CREATE OR REPLACE TABLE t4 SELECT NULL UNION SELECT NULL; +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `NULL` binary(0) DEFAULT NULL +) ENGINE=MEMORY DEFAULT CHARSET=latin1 +ALTER TABLE t4 ADD INDEX (`NULL`); +DROP TABLE t1, t2, t3, t4; +set @@default_storage_engine=@save_default_storage_engine; +# # End of 10.3 tests # diff --git a/mysql-test/main/union.test b/mysql-test/main/union.test index ab629ce076d..484393611ae 100644 --- a/mysql-test/main/union.test +++ b/mysql-test/main/union.test @@ -1873,6 +1873,31 @@ SELECT CAST(1 AS UNSIGNED) UNION ALL SELECT CAST(1 AS SIGNED); --disable_metadata --enable_ps_protocol +--echo # +--echo # MDEV-24511 null field is created with CREATE..SELECT +--echo # + +set @save_default_storage_engine=@@default_storage_engine; +SET @@default_storage_engine=MEMORY; + +CREATE TABLE t1 SELECT NULL UNION SELECT NULL; +--error ER_KEY_COLUMN_DOES_NOT_EXITS +ALTER TABLE t1 ADD INDEX (`PRIMARY`); + +CREATE TABLE t2 SELECT NULL; +SHOW CREATE TABLE t2; + +CREATE TABLE t3 SELECT NULL UNION SELECT NULL; +SHOW CREATE TABLE t3; + +CREATE OR REPLACE TABLE t4 SELECT NULL UNION SELECT NULL; +SHOW CREATE TABLE t4; +ALTER TABLE t4 ADD INDEX (`NULL`); + +DROP TABLE t1, t2, t3, t4; + +set @@default_storage_engine=@save_default_storage_engine; + --echo # --echo # End of 10.3 tests --echo # diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 720fea7ebb4..128a4e68533 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -5933,7 +5933,7 @@ void Type_handler_geometry::Item_param_set_param_func(Item_param *param, /***************************************************************************/ -bool Type_handler_string_result::union_element_finalize(const Item * item) const +bool Type_handler_string_result::union_element_finalize(Item_type_holder *item) const { if (item->collation.derivation == DERIVATION_NONE) { @@ -5943,6 +5943,12 @@ bool Type_handler_string_result::union_element_finalize(const Item * item) const return false; } +bool Type_handler_null::union_element_finalize(Item_type_holder *item) const +{ + item->set_handler(&type_handler_string); + return false; +} + /***************************************************************************/ bool Type_handler::Vers_history_point_resolve_unit(THD *thd, diff --git a/sql/sql_type.h b/sql/sql_type.h index 383ce800f7b..08b599af7ab 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -62,6 +62,7 @@ class Item_func_minus; class Item_func_mul; class Item_func_div; class Item_func_mod; +class Item_type_holder; class cmp_item; class in_vector; class Type_handler_hybrid_field_type; @@ -1191,7 +1192,7 @@ public: Performs the final data type validation for a UNION element, after the regular "aggregation for result" was done. */ - virtual bool union_element_finalize(const Item * item) const + virtual bool union_element_finalize(Item_type_holder *item) const { return false; } @@ -2244,7 +2245,7 @@ public: void sortlength(THD *thd, const Type_std_attributes *item, SORT_FIELD_ATTR *attr) const; - bool union_element_finalize(const Item * item) const; + bool union_element_finalize(Item_type_holder *item) const; bool Column_definition_prepare_stage1(THD *thd, MEM_ROOT *mem_root, Column_definition *c, @@ -3118,6 +3119,7 @@ public: bool Item_send(Item *item, Protocol *protocol, st_value *buf) const; Field *make_conversion_table_field(TABLE *, uint metadata, const Field *target) const; + bool union_element_finalize(Item_type_holder *item) const; bool Column_definition_fix_attributes(Column_definition *c) const; bool Column_definition_prepare_stage1(THD *thd, MEM_ROOT *mem_root, diff --git a/sql/sql_union.cc b/sql/sql_union.cc index c89e59a06f8..48d8c16db68 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1154,7 +1154,8 @@ cont: Test if the aggregated data type is OK for a UNION element. E.g. in case of string data, DERIVATION_NONE is not allowed. */ - if (type->type_handler()->union_element_finalize(type)) + if (type->type() == Item::TYPE_HOLDER && type->type_handler()-> + union_element_finalize(static_cast(type))) goto err; } From 1423cf5e3dcb3c50047f086a5933fe77006cf242 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Thu, 29 Jul 2021 17:16:52 +0200 Subject: [PATCH 98/98] fix MDEV-16026 MDEV-16481 embedded server results and rests --- .../sys_vars/r/sysvars_server_embedded.result | 2 +- .../versioning/r/sysvars-notembedded.result | 30 ++++++++++++++++++ mysql-test/suite/versioning/r/sysvars.result | 21 ------------- .../versioning/t/sysvars-notembedded.test | 31 +++++++++++++++++++ mysql-test/suite/versioning/t/sysvars.test | 18 ----------- 5 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 mysql-test/suite/versioning/r/sysvars-notembedded.result create mode 100644 mysql-test/suite/versioning/t/sysvars-notembedded.test diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index 3a561d93335..43f3d4313db 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -3279,7 +3279,7 @@ VARIABLE_COMMENT Default value for the FOR SYSTEM_TIME AS OF clause NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST DEFAULT +ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TABLE_DEFINITION_CACHE diff --git a/mysql-test/suite/versioning/r/sysvars-notembedded.result b/mysql-test/suite/versioning/r/sysvars-notembedded.result new file mode 100644 index 00000000000..8b1ad6cfc58 --- /dev/null +++ b/mysql-test/suite/versioning/r/sysvars-notembedded.result @@ -0,0 +1,30 @@ +create table t (a int) with system versioning; +set @before= UNIX_TIMESTAMP(now(6)); +insert into t values (1); +set @after= UNIX_TIMESTAMP(now(6)); +update t set a= 2; +set global system_versioning_asof= FROM_UNIXTIME(@after); +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; +a +1 +connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; +connection subcon; +select * from t as nonempty; +a +1 +disconnect subcon; +connection default; +set global system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as nonempty; +a +1 +connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; +connection subcon; +select * from t as empty; +a +disconnect subcon; +connection default; +drop table t; +set global system_versioning_asof= DEFAULT; +set system_versioning_asof= DEFAULT; diff --git a/mysql-test/suite/versioning/r/sysvars.result b/mysql-test/suite/versioning/r/sysvars.result index e3af236a7fa..ee9509a0039 100644 --- a/mysql-test/suite/versioning/r/sysvars.result +++ b/mysql-test/suite/versioning/r/sysvars.result @@ -190,27 +190,6 @@ set system_versioning_asof= FROM_UNIXTIME(@after); select * from t as nonempty; a 1 -set global system_versioning_asof= FROM_UNIXTIME(@after); -select * from t as nonempty; -a -1 -connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; -connection subcon; -select * from t as nonempty; -a -1 -disconnect subcon; -connection default; -set global system_versioning_asof= FROM_UNIXTIME(@before); -select * from t as nonempty; -a -1 -connect subcon,127.0.0.1,root,,,$SERVER_MYPORT_1; -connection subcon; -select * from t as empty; -a -disconnect subcon; -connection default; # MDEV-16481: set global system_versioning_asof=sf() crashes in specific case # Using global variable inside a stored function should not crash create or replace function now_global() returns timestamp diff --git a/mysql-test/suite/versioning/t/sysvars-notembedded.test b/mysql-test/suite/versioning/t/sysvars-notembedded.test new file mode 100644 index 00000000000..314972bc375 --- /dev/null +++ b/mysql-test/suite/versioning/t/sysvars-notembedded.test @@ -0,0 +1,31 @@ +source include/not_embedded.inc; + +create table t (a int) with system versioning; +set @before= UNIX_TIMESTAMP(now(6)); +insert into t values (1); +set @after= UNIX_TIMESTAMP(now(6)); +update t set a= 2; + +set global system_versioning_asof= FROM_UNIXTIME(@after); +set system_versioning_asof= FROM_UNIXTIME(@after); +select * from t as nonempty; + +--connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) +--connection subcon +select * from t as nonempty; +--disconnect subcon +--connection default + +set global system_versioning_asof= FROM_UNIXTIME(@before); +select * from t as nonempty; + +--connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) +--connection subcon +select * from t as empty; +--disconnect subcon +--connection default + +drop table t; + +set global system_versioning_asof= DEFAULT; +set system_versioning_asof= DEFAULT; diff --git a/mysql-test/suite/versioning/t/sysvars.test b/mysql-test/suite/versioning/t/sysvars.test index 248020010b6..eb76581121d 100644 --- a/mysql-test/suite/versioning/t/sysvars.test +++ b/mysql-test/suite/versioning/t/sysvars.test @@ -137,24 +137,6 @@ select * from t as empty; set system_versioning_asof= FROM_UNIXTIME(@after); select * from t as nonempty; -set global system_versioning_asof= FROM_UNIXTIME(@after); -select * from t as nonempty; - ---connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) ---connection subcon -select * from t as nonempty; ---disconnect subcon ---connection default - -set global system_versioning_asof= FROM_UNIXTIME(@before); -select * from t as nonempty; - ---connect (subcon,127.0.0.1,root,,,$SERVER_MYPORT_1) ---connection subcon -select * from t as empty; ---disconnect subcon ---connection default - --echo # MDEV-16481: set global system_versioning_asof=sf() crashes in specific case --echo # Using global variable inside a stored function should not crash create or replace function now_global() returns timestamp