mirror of https://gitee.com/bigwinds/arangodb
fix processing of AQL index hints when upgrading (#9138)
This commit is contained in:
parent
773f3c8422
commit
c3d1d24b27
|
@ -23,8 +23,11 @@
|
|||
|
||||
#include "IndexHint.h"
|
||||
|
||||
#include <velocypack/Builder.h>
|
||||
#include <velocypack/Iterator.h>
|
||||
#include <velocypack/Slice.h>
|
||||
#include <velocypack/StringRef.h>
|
||||
#include <velocypack/velocypack-aliases.h>
|
||||
|
||||
#include "Aql/AstNode.h"
|
||||
#include "Basics/StaticStrings.h"
|
||||
|
@ -125,11 +128,18 @@ IndexHint::IndexHint(AstNode const* node)
|
|||
}
|
||||
|
||||
IndexHint::IndexHint(VPackSlice const& slice)
|
||||
: _type{::fromTypeName(
|
||||
basics::VelocyPackHelper::getStringValue(slice.get(::FieldContainer),
|
||||
::FieldType, ""))},
|
||||
_forced{basics::VelocyPackHelper::getBooleanValue(slice.get(::FieldContainer),
|
||||
::FieldForced, false)} {
|
||||
: IndexHint() {
|
||||
|
||||
// read index hint from slice
|
||||
// index hints were introduced in version 3.5. in previous versions they
|
||||
// are not available, so we need to be careful when reading them
|
||||
VPackSlice s = slice.get(::FieldContainer);
|
||||
if (s.isObject()) {
|
||||
_type = ::fromTypeName(
|
||||
basics::VelocyPackHelper::getStringValue(s, ::FieldType, ""));
|
||||
_forced = basics::VelocyPackHelper::getBooleanValue(s, ::FieldForced, false);
|
||||
}
|
||||
|
||||
if (_type != HintType::Illegal && _type != HintType::None) {
|
||||
VPackSlice container = slice.get(::FieldContainer);
|
||||
TRI_ASSERT(container.isObject());
|
||||
|
|
|
@ -26,13 +26,14 @@
|
|||
|
||||
#include <iosfwd>
|
||||
|
||||
#include <velocypack/Builder.h>
|
||||
#include <velocypack/Slice.h>
|
||||
#include <velocypack/velocypack-aliases.h>
|
||||
|
||||
#include "Aql/AstNode.h"
|
||||
|
||||
namespace arangodb {
|
||||
namespace velocypack {
|
||||
class Builder;
|
||||
class Slice;
|
||||
}
|
||||
|
||||
namespace aql {
|
||||
|
||||
/// @brief container for index hint information
|
||||
|
@ -43,20 +44,20 @@ class IndexHint {
|
|||
public:
|
||||
explicit IndexHint();
|
||||
explicit IndexHint(AstNode const* node);
|
||||
explicit IndexHint(VPackSlice const& slice);
|
||||
explicit IndexHint(arangodb::velocypack::Slice const& slice);
|
||||
|
||||
public:
|
||||
HintType type() const;
|
||||
bool isForced() const;
|
||||
std::vector<std::string> const& hint() const;
|
||||
|
||||
void toVelocyPack(VPackBuilder& builder) const;
|
||||
void toVelocyPack(arangodb::velocypack::Builder& builder) const;
|
||||
std::string typeName() const;
|
||||
std::string toString() const;
|
||||
|
||||
private:
|
||||
HintType _type;
|
||||
bool const _forced;
|
||||
bool _forced;
|
||||
|
||||
// actual hint is a recursive structure, with the data type determined by the
|
||||
// _type above; in the case of a nested IndexHint, the value of isForced() is
|
||||
|
|
Loading…
Reference in New Issue