You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@phoenix.apache.org by "jpisaac (via GitHub)" <gi...@apache.org> on 2025/04/27 19:16:31 UTC
[PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
jpisaac opened a new pull request, #2130:
URL: https://github.com/apache/phoenix/pull/2130
(no comment)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "tkhurana (via GitHub)" <gi...@apache.org>.
tkhurana commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2096646411
##########
phoenix-core-client/src/main/java/org/apache/phoenix/query/QueryServices.java:
##########
@@ -374,8 +374,11 @@ public interface QueryServices extends SQLCloseable {
public static final String PHOENIX_TTL_SERVER_SIDE_MASKING_ENABLED = "phoenix.ttl.server_side.masking.enabled";
// The time limit on the amount of work to be done in one RPC call
public static final String PHOENIX_SERVER_PAGE_SIZE_MS = "phoenix.server.page.size.ms";
- // Phoenix TTL implemented by CompactionScanner and TTLRegionScanner is enabled
+
+ // TODO : Depracate instead use PHOENIX_COMPACTION_ENABLED
Review Comment:
Nit: Typo Deprecate
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2099053948
##########
phoenix-core-client/src/main/java/org/apache/phoenix/util/UpgradeUtil.java:
##########
@@ -1494,76 +1498,79 @@ public static void moveHBaseLevelTTLToSYSCAT(PhoenixConnection oldMetaConnection
Scan scan = new Scan();
scan.addFamily(DEFAULT_COLUMN_FAMILY_BYTES);
// Push down the filter to hbase to avoid transfer
- SingleColumnValueFilter tableFilter = new SingleColumnValueFilter(
+ QualifierFilter tableTypeQualifierFilter = new QualifierFilter(
+ CompareOperator.EQUAL, new BinaryComparator(TABLE_TYPE_BYTES));
+
+ SingleColumnValueFilter tableTypeFilter = new SingleColumnValueFilter(
DEFAULT_COLUMN_FAMILY_BYTES,
TABLE_TYPE_BYTES, CompareOperator.EQUAL,
PTableType.TABLE.getSerializedValue().getBytes(StandardCharsets.UTF_8));
-
- tableFilter.setFilterIfMissing(true);
+ tableTypeFilter.setFilterIfMissing(true);
// Limit number of records
PageFilter pf = new PageFilter(DEFAULT_SCAN_PAGE_SIZE);
- scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableFilter));
+ scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableTypeQualifierFilter, tableTypeFilter));
if (pageMore) {
scan.withStartRow(lastRowKey, false);
}
// Collect the row keys to process them in batch
try (ResultScanner scanner = sysCatalogTable.getScanner(scan)) {
int count = 0;
List<byte[]> rowKeys = new ArrayList<>();
- List<Put> puts = new ArrayList<>();
+ List<Mutation> mutations = new ArrayList<>();
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
count++;
lastRowKey = rr.getRow();
byte[] tmpKey = new byte[lastRowKey.length];
System.arraycopy(lastRowKey, 0, tmpKey, 0, tmpKey.length);
rowKeys.add(tmpKey);
- String tableName = SchemaUtil.getTableName(rr.getValue(
- DEFAULT_COLUMN_FAMILY_BYTES, TABLE_SCHEM_BYTES),
- rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES, TABLE_NAME_BYTES));
- if (tableName == null || Arrays.equals(rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES,
- TABLE_SCHEM_BYTES), SYSTEM_SCHEMA_NAME_BYTES)) {
+ byte[][] rowKeyMetaData = new byte[3][];
+ getVarChars(tmpKey, 3, rowKeyMetaData);
+ byte[] schemaName = rowKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX];
+ byte[] tableName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX];
+
+ String fullTableName = SchemaUtil.getTableName(schemaName, tableName);
+ if (SchemaUtil.isSystemTable(SchemaUtil.getTableNameAsBytes(schemaName, tableName))) {
//We do not support system table ttl through phoenix ttl, and it will be moved to a
//constant value in future commit.
continue;
}
TableDescriptor tableDesc = admin.getDescriptor(SchemaUtil.getPhysicalTableName(
- tableName, readOnlyProps));
+ fullTableName, readOnlyProps));
int ttl = tableDesc.getColumnFamily(DEFAULT_COLUMN_FAMILY_BYTES).
getTimeToLive();
- if (ttl != ColumnFamilyDescriptorBuilder.DEFAULT_TTL) {
- //As we have ttl defined fot this table create a Put to set TTL.
- long rowTS = rr.rawCells()[0].getTimestamp();
+ // As we have ttl defined for this table create a Put to set TTL with
+ // backward compatibility in mind.
+ long rowTS = EnvironmentEdgeManager.currentTimeMillis();
+
+ if (ttl == HConstants.FOREVER || ttl == TTL_NOT_DEFINED) {
+ // Set the TTL column to null
+ Delete deleteColumn = new Delete(tmpKey);
+ KeyValue kv = GenericKeyValueBuilder.INSTANCE.buildDeleteColumns(
+ new ImmutableBytesWritable(tmpKey),
+ new ImmutableBytesWritable(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES),
+ new ImmutableBytesWritable(TTL_BYTES), rowTS);
+ deleteColumn.add(kv);
+ mutations.add(deleteColumn);
Review Comment:
The time will anyway be spent scanning SYSTEM.CATALOG to find tables with TTL. This Delete Mutation is just to conform to SYSCAT standards of inserting a DeleteColumn to indicate a null, It does for every other column/attribute that is null when inserting rows.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac commented on PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#issuecomment-2863713022
Few debug logging to be still removed
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2080206128
##########
phoenix-core-client/src/main/java/org/apache/phoenix/util/MetaDataUtil.java:
##########
@@ -1190,4 +1197,46 @@ public static boolean avoidMetadataRPC(PhoenixConnection connection, PTable tabl
connection.getMetaDataCache().getAge(tableRef) <
effectiveUpdateCacheFreq;
}
+
+
+ public static TTLExpression convertForeverAndNoneTTLValue(Object propValue, boolean forSystemCatalog) {
+ //Handle FOREVER and NONE value for TTL at HBase level TTL.
+ if (propValue == null) {
+ return forSystemCatalog ? TTL_EXPRESSION_NOT_DEFINED : TTL_EXPRESSION_FOREVER;
+ }
+ if (propValue instanceof String) {
+ String strValue = (String) propValue;
+ if ("FOREVER".equalsIgnoreCase(strValue) || "NONE".equalsIgnoreCase(strValue) || "0".equalsIgnoreCase(strValue)) {
+ propValue = forSystemCatalog ? TTL_NOT_DEFINED : HConstants.FOREVER;
+ }
+ } else if (propValue instanceof Integer && propValue.equals(TTL_NOT_DEFINED)) {
+ propValue = forSystemCatalog ? TTL_NOT_DEFINED : HConstants.FOREVER;
+ }
+ return (TTLExpression) TableProperty.TTL.getValue(propValue);
+ }
+
+ /**
+ * In 5.3.0 release the TTL column will be created in SYSTEM.CATALOG and used to store TTL values,
+ * but the TTL values for tables with literal expressions will continue to be stored in
+ * the HBase TableDescriptor for backward compatibility.
+ * When table type != TABLE (i.e. VIEW TTL) OR expression is ConditionalExpression then
+ * actual TTL value is stored in SYSTEM.CATALOG and TableDescriptor will be set to FOREVER
+ * When table type == TABLE (i.e. Table TTL) and expression is LiteralExpression then
+ * actual TTL value is stored in TableDescriptor
+ * and SYSTEM.CATALOG will be set to TTL_EXPRESSION_DEFINED_IN_TABLE_DESCRIPTOR.
+ * if expression == TTL_NOT_DEFINED OR FOREVER then
+ * TTL_NOT_DEFINED will be stores in SYSTEM.CATALOG
+ */
+ public static TTLExpression getCompatibleTTLExpression(TTLExpression expression, PTableType tableType) {
+ TTLExpression ttl;
Review Comment:
Check for other table types
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac merged PR #2130:
URL: https://github.com/apache/phoenix/pull/2130
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "tkhurana (via GitHub)" <gi...@apache.org>.
tkhurana commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2096653754
##########
phoenix-core-client/src/main/java/org/apache/phoenix/util/UpgradeUtil.java:
##########
@@ -1494,76 +1498,79 @@ public static void moveHBaseLevelTTLToSYSCAT(PhoenixConnection oldMetaConnection
Scan scan = new Scan();
scan.addFamily(DEFAULT_COLUMN_FAMILY_BYTES);
// Push down the filter to hbase to avoid transfer
- SingleColumnValueFilter tableFilter = new SingleColumnValueFilter(
+ QualifierFilter tableTypeQualifierFilter = new QualifierFilter(
+ CompareOperator.EQUAL, new BinaryComparator(TABLE_TYPE_BYTES));
+
+ SingleColumnValueFilter tableTypeFilter = new SingleColumnValueFilter(
DEFAULT_COLUMN_FAMILY_BYTES,
TABLE_TYPE_BYTES, CompareOperator.EQUAL,
PTableType.TABLE.getSerializedValue().getBytes(StandardCharsets.UTF_8));
-
- tableFilter.setFilterIfMissing(true);
+ tableTypeFilter.setFilterIfMissing(true);
// Limit number of records
PageFilter pf = new PageFilter(DEFAULT_SCAN_PAGE_SIZE);
- scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableFilter));
+ scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableTypeQualifierFilter, tableTypeFilter));
if (pageMore) {
scan.withStartRow(lastRowKey, false);
}
// Collect the row keys to process them in batch
try (ResultScanner scanner = sysCatalogTable.getScanner(scan)) {
int count = 0;
List<byte[]> rowKeys = new ArrayList<>();
- List<Put> puts = new ArrayList<>();
+ List<Mutation> mutations = new ArrayList<>();
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
count++;
lastRowKey = rr.getRow();
byte[] tmpKey = new byte[lastRowKey.length];
System.arraycopy(lastRowKey, 0, tmpKey, 0, tmpKey.length);
rowKeys.add(tmpKey);
- String tableName = SchemaUtil.getTableName(rr.getValue(
- DEFAULT_COLUMN_FAMILY_BYTES, TABLE_SCHEM_BYTES),
- rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES, TABLE_NAME_BYTES));
- if (tableName == null || Arrays.equals(rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES,
- TABLE_SCHEM_BYTES), SYSTEM_SCHEMA_NAME_BYTES)) {
+ byte[][] rowKeyMetaData = new byte[3][];
+ getVarChars(tmpKey, 3, rowKeyMetaData);
+ byte[] schemaName = rowKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX];
+ byte[] tableName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX];
+
+ String fullTableName = SchemaUtil.getTableName(schemaName, tableName);
+ if (SchemaUtil.isSystemTable(SchemaUtil.getTableNameAsBytes(schemaName, tableName))) {
//We do not support system table ttl through phoenix ttl, and it will be moved to a
//constant value in future commit.
continue;
}
TableDescriptor tableDesc = admin.getDescriptor(SchemaUtil.getPhysicalTableName(
- tableName, readOnlyProps));
+ fullTableName, readOnlyProps));
int ttl = tableDesc.getColumnFamily(DEFAULT_COLUMN_FAMILY_BYTES).
getTimeToLive();
- if (ttl != ColumnFamilyDescriptorBuilder.DEFAULT_TTL) {
- //As we have ttl defined fot this table create a Put to set TTL.
- long rowTS = rr.rawCells()[0].getTimestamp();
+ // As we have ttl defined for this table create a Put to set TTL with
+ // backward compatibility in mind.
+ long rowTS = EnvironmentEdgeManager.currentTimeMillis();
+
+ if (ttl == HConstants.FOREVER || ttl == TTL_NOT_DEFINED) {
+ // Set the TTL column to null
+ Delete deleteColumn = new Delete(tmpKey);
+ KeyValue kv = GenericKeyValueBuilder.INSTANCE.buildDeleteColumns(
+ new ImmutableBytesWritable(tmpKey),
+ new ImmutableBytesWritable(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES),
+ new ImmutableBytesWritable(TTL_BYTES), rowTS);
+ deleteColumn.add(kv);
+ mutations.add(deleteColumn);
Review Comment:
Is this necessary ? For all the tables which don't have TTL defined we will be doing a Delete mutation. This will just increase the time.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2099066288
##########
phoenix-core-client/src/main/java/org/apache/phoenix/util/UpgradeUtil.java:
##########
@@ -1494,76 +1498,79 @@ public static void moveHBaseLevelTTLToSYSCAT(PhoenixConnection oldMetaConnection
Scan scan = new Scan();
scan.addFamily(DEFAULT_COLUMN_FAMILY_BYTES);
// Push down the filter to hbase to avoid transfer
- SingleColumnValueFilter tableFilter = new SingleColumnValueFilter(
+ QualifierFilter tableTypeQualifierFilter = new QualifierFilter(
+ CompareOperator.EQUAL, new BinaryComparator(TABLE_TYPE_BYTES));
+
+ SingleColumnValueFilter tableTypeFilter = new SingleColumnValueFilter(
DEFAULT_COLUMN_FAMILY_BYTES,
TABLE_TYPE_BYTES, CompareOperator.EQUAL,
PTableType.TABLE.getSerializedValue().getBytes(StandardCharsets.UTF_8));
-
- tableFilter.setFilterIfMissing(true);
+ tableTypeFilter.setFilterIfMissing(true);
// Limit number of records
PageFilter pf = new PageFilter(DEFAULT_SCAN_PAGE_SIZE);
- scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableFilter));
+ scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, pf, tableTypeQualifierFilter, tableTypeFilter));
if (pageMore) {
scan.withStartRow(lastRowKey, false);
}
// Collect the row keys to process them in batch
try (ResultScanner scanner = sysCatalogTable.getScanner(scan)) {
int count = 0;
List<byte[]> rowKeys = new ArrayList<>();
- List<Put> puts = new ArrayList<>();
+ List<Mutation> mutations = new ArrayList<>();
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
count++;
lastRowKey = rr.getRow();
byte[] tmpKey = new byte[lastRowKey.length];
System.arraycopy(lastRowKey, 0, tmpKey, 0, tmpKey.length);
rowKeys.add(tmpKey);
- String tableName = SchemaUtil.getTableName(rr.getValue(
- DEFAULT_COLUMN_FAMILY_BYTES, TABLE_SCHEM_BYTES),
- rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES, TABLE_NAME_BYTES));
- if (tableName == null || Arrays.equals(rr.getValue(DEFAULT_COLUMN_FAMILY_BYTES,
- TABLE_SCHEM_BYTES), SYSTEM_SCHEMA_NAME_BYTES)) {
+ byte[][] rowKeyMetaData = new byte[3][];
+ getVarChars(tmpKey, 3, rowKeyMetaData);
+ byte[] schemaName = rowKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX];
+ byte[] tableName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX];
+
+ String fullTableName = SchemaUtil.getTableName(schemaName, tableName);
+ if (SchemaUtil.isSystemTable(SchemaUtil.getTableNameAsBytes(schemaName, tableName))) {
//We do not support system table ttl through phoenix ttl, and it will be moved to a
//constant value in future commit.
continue;
}
TableDescriptor tableDesc = admin.getDescriptor(SchemaUtil.getPhysicalTableName(
- tableName, readOnlyProps));
+ fullTableName, readOnlyProps));
int ttl = tableDesc.getColumnFamily(DEFAULT_COLUMN_FAMILY_BYTES).
getTimeToLive();
- if (ttl != ColumnFamilyDescriptorBuilder.DEFAULT_TTL) {
- //As we have ttl defined fot this table create a Put to set TTL.
- long rowTS = rr.rawCells()[0].getTimestamp();
+ // As we have ttl defined for this table create a Put to set TTL with
+ // backward compatibility in mind.
+ long rowTS = EnvironmentEdgeManager.currentTimeMillis();
+
+ if (ttl == HConstants.FOREVER || ttl == TTL_NOT_DEFINED) {
+ // Set the TTL column to null
+ Delete deleteColumn = new Delete(tmpKey);
+ KeyValue kv = GenericKeyValueBuilder.INSTANCE.buildDeleteColumns(
+ new ImmutableBytesWritable(tmpKey),
+ new ImmutableBytesWritable(PhoenixDatabaseMetaData.TABLE_FAMILY_BYTES),
+ new ImmutableBytesWritable(TTL_BYTES), rowTS);
+ deleteColumn.add(kv);
+ mutations.add(deleteColumn);
Review Comment:
Oh, you are saying that it is null to begin with - so no point in adding a null again? Let me verify and will remove it if that is the case.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] PHOENIX-7573 Backward Compatibility Issues in Phoenix TTL [phoenix]
Posted by "jpisaac (via GitHub)" <gi...@apache.org>.
jpisaac commented on code in PR #2130:
URL: https://github.com/apache/phoenix/pull/2130#discussion_r2080244769
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/TTLRegionScanner.java:
##########
@@ -77,20 +79,25 @@ public TTLRegionScanner(final RegionCoprocessorEnvironment env, final Scan scan,
currentTime = scan.getTimeRange().getMax() == HConstants.LATEST_TIMESTAMP
? EnvironmentEdgeManager.currentTimeMillis() : scan.getTimeRange().getMax();
byte[] isSystemTable = scan.getAttribute(IS_PHOENIX_TTL_SCAN_TABLE_SYSTEM);
- if (isPhoenixTableTTLEnabled(env.getConfiguration()) && (isSystemTable == null
- || !Bytes.toBoolean(isSystemTable))) {
- ttlExpression = ScanUtil.getTTLExpression(this.scan);
+ CompiledTTLExpression scanTTLExpression = ScanUtil.getTTLExpression(scan);
Review Comment:
Need to handle 5.2 client
##########
phoenix-core-server/src/main/java/org/apache/phoenix/mapreduce/index/IndexScrutinyMapper.java:
##########
@@ -343,10 +345,12 @@ private int getTableTTL(Configuration configuration) throws SQLException, IOExce
cqsi = connection.unwrap(PhoenixConnection.class).getQueryServices();
String physicalTable = getSourceTableName(pSourceTable,
SchemaUtil.isNamespaceMappingEnabled(null, cqsi.getProps()));
- if (configuration.getBoolean(QueryServices.PHOENIX_TABLE_TTL_ENABLED,
- QueryServicesOptions.DEFAULT_PHOENIX_TABLE_TTL_ENABLED)) {
- return pSourceTable.getTTLExpression().equals(TTL_EXPRESSION_NOT_DEFINED) ? DEFAULT_TTL
- : ((LiteralTTLExpression) pSourceTable.getTTLExpression()).getTTLValue(); // TODO
+ TTLExpression ttlExpression = pSourceTable.getTTLExpression();
+ if (ttlExpression == null) return DEFAULT_TTL;
+ if (!ttlExpression.equals(TTL_EXPRESSION_DEFINED_IN_TABLE_DESCRIPTOR)) {
+ return ttlExpression.equals(TTL_EXPRESSION_NOT_DEFINED) ? DEFAULT_TTL
+ // TODO What happens in the case of Conditional TTL
+ : ((LiteralTTLExpression) ttlExpression).getTTLValue(); // TODO
Review Comment:
Check whether can be convert to TTLExpression
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@phoenix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org