[ 
https://issues.apache.org/jira/browse/TRAFODION-2137?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15404934#comment-15404934
 ] 

ASF GitHub Bot commented on TRAFODION-2137:
-------------------------------------------

Github user anoopsharma00 commented on a diff in the pull request:

    https://github.com/apache/incubator-trafodion/pull/634#discussion_r73250948
  
    --- Diff: core/sql/sqlcat/TrafDDLdesc.h ---
    @@ -0,0 +1,1120 @@
    +/**********************************************************************
    +// @@@ START COPYRIGHT @@@
    +//
    +// Licensed to the Apache Software Foundation (ASF) under one
    +// or more contributor license agreements.  See the NOTICE file
    +// distributed with this work for additional information
    +// regarding copyright ownership.  The ASF licenses this file
    +// to you under the Apache License, Version 2.0 (the
    +// "License"); you may not use this file except in compliance
    +// with the License.  You may obtain a copy of the License at
    +//
    +//   http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing,
    +// software distributed under the License is distributed on an
    +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    +// KIND, either express or implied.  See the License for the
    +// specific language governing permissions and limitations
    +// under the License.
    +//
    +// @@@ END COPYRIGHT @@@
    +//
    +**********************************************************************/
    +#ifndef TRAF_DDL_DESC_H
    +#define TRAF_DDL_DESC_H
    +
    +#include "Platform.h"
    +#include "NAVersionedObject.h"
    +#include "charinfo.h"
    +#include "ComSmallDefs.h"
    +
    +#define GENHEAP(h)    (h ? (NAMemory*)h : CmpCommon::statementHeap())
    +
    +enum ConstraintType { UNIQUE_CONSTRAINT, PRIMARY_KEY_CONSTRAINT, 
REF_CONSTRAINT,
    +                 CHECK_CONSTRAINT
    +               };
    +
    +enum desc_nodetype {
    +  DESC_UNKNOWN_TYPE = 0,
    +  DESC_CHECK_CONSTRNTS_TYPE,
    +  DESC_COLUMNS_TYPE,
    +  DESC_CONSTRNTS_TYPE,
    +  DESC_CONSTRNT_KEY_COLS_TYPE,
    +  DESC_FILES_TYPE,
    +  DESC_HBASE_RANGE_REGION_TYPE,
    +  DESC_HISTOGRAM_TYPE,
    +  DESC_HIST_INTERVAL_TYPE,
    +  DESC_INDEXES_TYPE,
    +  DESC_KEYS_TYPE,
    +  DESC_PARTNS_TYPE,
    +  DESC_REF_CONSTRNTS_TYPE,
    +  DESC_TABLE_TYPE,
    +  DESC_USING_MV_TYPE,  // MV  -- marks an MV using this object
    +  DESC_VIEW_TYPE,
    +  DESC_SCHEMA_LABEL_TYPE,
    +  DESC_SEQUENCE_GENERATOR_TYPE,
    +  DESC_ROUTINE_TYPE,
    +  DESC_LIBRARY_TYPE
    +};
    +
    +class TrafDesc;
    +typedef NAVersionedObjectPtrTempl<TrafDesc> DescStructPtr;
    +
    +class TrafCheckConstrntsDesc;
    +class TrafColumnsDesc;
    +class TrafConstrntsDesc;
    +class TrafConstrntKeyColsDesc;
    +class TrafHbaseRegionDesc;
    +class TrafHistogramDesc;
    +class TrafHistIntervalDesc;
    +class TrafFilesDesc;
    +class TrafKeysDesc;
    +class TrafIndexesDesc;
    +class TrafLibraryDesc;
    +class TrafPartnsDesc;
    +class TrafRefConstrntsDesc;
    +class TrafRoutineDesc;
    +class TrafSequenceGeneratorDesc;
    +class TrafTableDesc;
    +class TrafUsingMvDesc;
    +class TrafViewDesc;
    +
    +class TrafDesc : public NAVersionedObject {
    +public:
    +  enum {CURR_VERSION = 1};
    +
    +  TrafDesc(UInt16 nodeType);
    +  TrafDesc() : NAVersionedObject(-1) {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return (short)sizeof(TrafDesc); }
    +
    +  virtual Lng32 migrateToNewVersion(NAVersionedObject *&newImage);
    +
    +  virtual char *findVTblPtr(short classID);
    +
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  Lng32 validateSize();
    +  Lng32 validateVersion();
    + 
    +  UInt16 nodetype;
    +  UInt16 version;
    +  UInt32 descFlags;
    +  DescStructPtr next;
    +  char* descExtension; // extension of descriptor, if it needs to be 
extended
    +
    +  virtual TrafCheckConstrntsDesc *checkConstrntsDesc() const { return 
NULL; }
    +  virtual TrafColumnsDesc *columnsDesc() const { return NULL; }
    +  virtual TrafConstrntsDesc *constrntsDesc() const { return NULL; }
    +  virtual TrafConstrntKeyColsDesc *constrntKeyColsDesc() const { return 
NULL; }
    +  virtual TrafFilesDesc *filesDesc() const { return NULL; }
    +  virtual TrafHbaseRegionDesc *hbaseRegionDesc() const { return NULL; }
    +  virtual TrafHistogramDesc *histogramDesc() const { return NULL; }
    +  virtual TrafHistIntervalDesc *histIntervalDesc() const { return NULL; }
    +  virtual TrafKeysDesc *keysDesc() const { return NULL; }
    +  virtual TrafIndexesDesc *indexesDesc() const { return NULL; }
    +  virtual TrafLibraryDesc *libraryDesc() const { return NULL; }
    +  virtual TrafPartnsDesc *partnsDesc() const { return NULL; }
    +  virtual TrafRefConstrntsDesc *refConstrntsDesc() const { return NULL; }
    +  virtual TrafRoutineDesc *routineDesc() const { return NULL; }
    +  virtual TrafSequenceGeneratorDesc *sequenceGeneratorDesc() const { 
return NULL; }
    +  virtual TrafTableDesc *tableDesc() const { return NULL; }
    +  virtual TrafUsingMvDesc *usingMvDesc() const { return NULL; }
    +  virtual TrafViewDesc *viewDesc() const { return NULL; }
    +
    +};
    +
    +class TrafCheckConstrntsDesc : public TrafDesc {
    +public:
    +  TrafCheckConstrntsDesc() : TrafDesc(DESC_CHECK_CONSTRNTS_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafCheckConstrntsDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafCheckConstrntsDesc *checkConstrntsDesc() const { return 
(TrafCheckConstrntsDesc*)this; }
    +
    +  char* constrnt_text;
    +  char filler[16];
    +};
    +
    +class TrafColumnsDesc : public TrafDesc {
    +public:
    +  TrafColumnsDesc() : TrafDesc(DESC_COLUMNS_TYPE) 
    +  {};
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafColumnsDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafColumnsDesc *columnsDesc() const { return 
(TrafColumnsDesc*)this; }
    +
    +  enum ColumnsDescFlags
    +    { 
    +      NULLABLE           = 0x0001,  
    +      ADDED              = 0x0002,
    +      UPSHIFTED          = 0x0004,
    +      CASEINSENSITIVE    = 0x0008,
    +      OPTIONAL           = 0x0010
    +    };
    +
    +  void setNullable(NABoolean v) 
    +  {(v ? columnsDescFlags |= NULLABLE : columnsDescFlags &= ~NULLABLE); };
    +  NABoolean isNullable() { return (columnsDescFlags & NULLABLE) != 0; };
    +
    +  void setAdded(NABoolean v) 
    +  {(v ? columnsDescFlags |= ADDED : columnsDescFlags &= ~ADDED); };
    +  NABoolean isAdded() { return (columnsDescFlags & ADDED) != 0; };
    +
    +  void setUpshifted(NABoolean v) 
    +  {(v ? columnsDescFlags |= UPSHIFTED : columnsDescFlags &= ~UPSHIFTED); };
    +  NABoolean isUpshifted() { return (columnsDescFlags & UPSHIFTED) != 0; };
    +
    +  void setCaseInsensitive(NABoolean v) 
    +  {(v ? columnsDescFlags |= CASEINSENSITIVE : columnsDescFlags &= 
~CASEINSENSITIVE); };
    +  NABoolean isCaseInsensitive() { return (columnsDescFlags & 
CASEINSENSITIVE) != 0; };
    +
    +  void setOptional(NABoolean v) 
    +  {(v ? columnsDescFlags |= OPTIONAL : columnsDescFlags &= ~OPTIONAL); };
    +  NABoolean isOptional() { return (columnsDescFlags & OPTIONAL) != 0; };
    +
    +  rec_datetime_field datetimeStart() 
    +  { return (rec_datetime_field)datetimestart;}
    +  rec_datetime_field datetimeEnd() 
    +  { return (rec_datetime_field)datetimeend;}
    +
    +  ComColumnDefaultClass defaultClass() 
    +  { return (ComColumnDefaultClass)defaultClass_;}
    +  void setDefaultClass(ComColumnDefaultClass v)
    +  { defaultClass_ = (Int16)v;}
    +
    +  CharInfo::CharSet characterSet() 
    +  { return (CharInfo::CharSet)character_set;}
    +  CharInfo::CharSet encodingCharset() 
    +  { return (CharInfo::CharSet)encoding_charset;}
    +  CharInfo::Collation  collationSequence()
    +  {return (CharInfo::Collation)collation_sequence; }
    +
    +  ComParamDirection paramDirection() 
    +  { return (ComParamDirection)paramDirection_;}
    +  void setParamDirection(ComParamDirection v)
    +  {paramDirection_ = (Int16)v; }
    +
    +  char* colname;
    +
    +  Int32 colnumber;
    +  Int32 datatype;
    +
    +  Int32 offset;
    +  Lng32 length;
    +
    +  Lng32 scale;
    +  Lng32 precision;
    +
    +  Int16/*rec_datetime_field*/ datetimestart, datetimeend;
    +  Int16 datetimefractprec, intervalleadingprec;
    +
    +  Int16/*ComColumnDefaultClass*/ defaultClass_;
    +  Int16/*CharInfo::CharSet*/     character_set;
    +  Int16/*CharInfo::CharSet*/     encoding_charset;
    +  Int16/*CharInfo::Collation*/   collation_sequence;
    +
    +  ULng32 hbaseColFlags;
    +  Int16/*ComParamDirection*/ paramDirection_;
    +  char colclass; // 'S' -- system generated, 'U' -- user created
    +  char filler0;
    +
    +  Int64 colFlags;
    +  Int64 columnsDescFlags; // my flags
    +
    +  char* pictureText;
    +  char* defaultvalue;
    +  char* heading;
    +  char* computed_column_text;
    +  char* hbaseColFam;
    +  char* hbaseColQual;
    +
    +  char filler[24];
    +};
    +
    +class TrafConstrntKeyColsDesc : public TrafDesc {
    +public:
    +  TrafConstrntKeyColsDesc() : TrafDesc(DESC_CONSTRNT_KEY_COLS_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafConstrntKeyColsDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafConstrntKeyColsDesc *constrntKeyColsDesc() const { return 
(TrafConstrntKeyColsDesc*)this; }
    +
    +  char* colname;
    +  Int32  position;
    +
    +  Int64 constrntKeyColsDescFlags; // my flags
    +
    +  char filler[16];
    +};
    +
    +class TrafConstrntsDesc : public TrafDesc {
    +public:
    +  TrafConstrntsDesc() : TrafDesc(DESC_CONSTRNTS_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafConstrntsDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafConstrntsDesc *constrntsDesc() const { return 
(TrafConstrntsDesc*)this; }
    +
    +  enum ConstrntsDescFlags
    +    { 
    +      ENFORCED           = 0x0001
    +    };
    +
    +  void setEnforced(NABoolean v) 
    +  {(v ? constrntsDescFlags |= ENFORCED : constrntsDescFlags &= ~ENFORCED); 
};
    +  NABoolean isEnforced() { return (constrntsDescFlags & ENFORCED) != 0; };
    +
    +  char* constrntname;
    +  char* tablename;
    +
    +  Int16 /*ConstraintType*/ type;
    +  Int16 fillerInt16;
    +  Int32  colcount;
    +
    +  Int64 constrntsDescFlags; // my flags
    +
    +  DescStructPtr check_constrnts_desc;
    +  DescStructPtr constr_key_cols_desc;
    +  DescStructPtr referenced_constrnts_desc;
    +  DescStructPtr referencing_constrnts_desc;
    +
    +  char filler[24];
    +};
    +
    +class TrafFilesDesc : public TrafDesc {
    +public:
    +  TrafFilesDesc() : TrafDesc(DESC_FILES_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return (short)sizeof(TrafFilesDesc); 
}
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafFilesDesc *filesDesc() const { return (TrafFilesDesc*)this; }
    +
    +  enum FilesDescFlags
    +    { 
    +      AUDITED           = 0x0001
    +    };
    +
    +  void setAudited(NABoolean v) 
    +  {(v ? filesDescFlags |= AUDITED : filesDescFlags &= ~AUDITED); };
    +  NABoolean isAudited() { return (filesDescFlags & AUDITED) != 0; };
    +
    +  Int64 filesDescFlags; // my flags
    +  DescStructPtr partns_desc;
    +};
    +
    +class TrafHbaseRegionDesc : public TrafDesc {
    +public:
    +  TrafHbaseRegionDesc() : TrafDesc(DESC_HBASE_RANGE_REGION_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafHbaseRegionDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafHbaseRegionDesc *hbaseRegionDesc() const { return 
(TrafHbaseRegionDesc*)this; }
    +
    +  Int64  hbaseRegionDescFlags; // my flags
    +
    +  Lng32  beginKeyLen;
    +  Lng32  endKeyLen;
    +
    +  char*  beginKey;
    +  char*  endKey;
    +
    +  char filler[16];
    +};
    +
    +class TrafHistogramDesc : public TrafDesc {
    +public:
    +  TrafHistogramDesc() : TrafDesc(DESC_HISTOGRAM_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafHistogramDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafHistogramDesc *histogramDesc() const { return 
(TrafHistogramDesc*)this; }
    +
    +  char*   tablename;
    +  char*   histid;
    +
    +  Int32   tablecolnumber;
    +  Int32   colposition;
    +
    +  Float32 rowcount;
    +  Float32 uec;
    +
    +  char*   highval;
    +  char*   lowval;
    +
    +  Int64 histogramDescFlags; // my flags
    +
    +  DescStructPtr hist_interval_desc;
    +
    +  char filler[24];
    +};
    +
    +class TrafHistIntervalDesc : public TrafDesc {
    +public:
    +  TrafHistIntervalDesc() : TrafDesc(DESC_HIST_INTERVAL_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafHistIntervalDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafHistIntervalDesc *histIntervalDesc() const { return 
(TrafHistIntervalDesc*)this; }
    +
    +  char*   histid;
    +  char*   intboundary;
    +
    +  Float32  rowcount;
    +  Float32  uec;
    +
    +  Int32   intnum;
    +  Int32   fillerInt32;
    +
    +  Int64 histIntervalDescFlags; // my flags
    +
    +  char filler[16];
    +};
    +
    +class TrafIndexesDesc : public TrafDesc {
    +public:
    +  TrafIndexesDesc() : TrafDesc(DESC_INDEXES_TYPE)
    +  {}
    +
    +  // ---------------------------------------------------------------------
    +  // Redefine virtual functions required for Versioning.
    +  //----------------------------------------------------------------------
    +  virtual unsigned char getClassVersionID()
    +  {
    +    return 1;
    +  }
    +
    +  virtual void populateImageVersionIDArray()
    +  {
    +    setImageVersionID(0,getClassVersionID());
    +  }
    +
    +  virtual short getClassSize()      { return 
(short)sizeof(TrafIndexesDesc); }
    + 
    +  virtual Long pack(void *space);
    +  virtual Lng32 unpack(void * base, void * reallocator);
    +
    +  virtual TrafIndexesDesc *indexesDesc() const { return 
(TrafIndexesDesc*)this; }
    +
    +  enum IndexesDescFlags
    +    { 
    +      SYSTEM_TABLE_CODE = 0x0001,  
    +      EXPLICIT          = 0x0002,
    +      VOLATILE          = 0x0004,
    +      IN_MEM_OBJ        = 0x0008,
    +      UNIQUE            = 0x0010
    +    };
    +
    +  void setSystemTableCode(NABoolean v) 
    +  {(v ? indexesDescFlags |= SYSTEM_TABLE_CODE : indexesDescFlags &= 
~SYSTEM_TABLE_CODE); };
    +  NABoolean isSystemTableCode() { return (indexesDescFlags & 
SYSTEM_TABLE_CODE) != 0; };
    +
    +  void setExplicit(NABoolean v) 
    +  {(v ? indexesDescFlags |= EXPLICIT : indexesDescFlags &= ~EXPLICIT); };
    +  NABoolean isExplicit() { return (indexesDescFlags & EXPLICIT) != 0; };
    +
    +  void setVolatile(NABoolean v) 
    +  {(v ? indexesDescFlags |= VOLATILE : indexesDescFlags &= ~VOLATILE); };
    +  NABoolean isVolatile() { return (indexesDescFlags & VOLATILE) != 0; };
    +
    +  void setInMemoryObject(NABoolean v) 
    +  {(v ? indexesDescFlags |= IN_MEM_OBJ : indexesDescFlags &= ~IN_MEM_OBJ); 
};
    +  NABoolean isInMemoryObject() { return (indexesDescFlags & IN_MEM_OBJ) != 
0; };
    +
    +  void setUnique(NABoolean v) 
    +  {(v ? indexesDescFlags |= UNIQUE : indexesDescFlags &= ~UNIQUE); };
    +  NABoolean isUnique() { return (indexesDescFlags & UNIQUE) != 0; };
    +
    +  ComPartitioningScheme partitioningScheme() 
    +  { return (ComPartitioningScheme)partitioningScheme_; }
    +  void setPartitioningScheme(ComPartitioningScheme v) 
    +  { partitioningScheme_ = (Int16)v; }
    +  ComRowFormat rowFormat() { return (ComRowFormat)rowFormat_; }
    +  void setRowFormat(ComRowFormat v) { rowFormat_ = (Int16)v; }
    +
    +  char* tablename;  // name of the base table
    --- End diff --
    
    Right. The 'char *' are pointing to char arrays and not any classes.
    Currently, all classes either have native fields (int, short, etc), or 
'char *' pointers
    or 'TrafDesc' pointers.
    If any pointer  in future points to a class, then it will need to include
    pack/unpack of the class it is pointing to. 


> Improve metadata access time during query compilation
> -----------------------------------------------------
>
>                 Key: TRAFODION-2137
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-2137
>             Project: Apache Trafodion
>          Issue Type: Improvement
>            Reporter: Anoop Sharma
>            Assignee: Anoop Sharma
>
> When a trafodion object is accessed for the first time in a session, 
> information about it is read from metadata.
> Multiple metadata tables are read to retrieve information about the
> objects being used in the query.
> Once metadata info is read about a table, it is cached in compiler memory. 
> Another query accessing the same object gets it from compiler metadata
> cache.
> This results in the first query compile performance to be slower than the
> subsequent queries accessing the same objects.
> This JIRA is to improve performance of first access of an object in
> a query.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to