public PColumnImpl(PColumn column, boolean derivedColumn, int position, byte[] viewConstant) { this(column.getName(), column.getFamilyName(), column.getDataType(), column.getMaxLength(), column.getScale(), column.isNullable(), position, column.getSortOrder(), column.getArraySize(), viewConstant, column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic(), column.getColumnQualifierBytes(), column.getTimestamp(), derivedColumn); }
public static ColumnResolver getResolverForCompiledDerivedTable(PhoenixConnection connection, TableRef tableRef, RowProjector projector) throws SQLException { List<PColumn> projectedColumns = new ArrayList<PColumn>(); PTable table = tableRef.getTable(); for (PColumn column : table.getColumns()) { Expression sourceExpression = projector.getColumnProjector(column.getPosition()).getExpression(); PColumnImpl projectedColumn = new PColumnImpl(column.getName(), column.getFamilyName(), sourceExpression.getDataType(), sourceExpression.getMaxLength(), sourceExpression.getScale(), sourceExpression.isNullable(), column.getPosition(), sourceExpression.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic(), column.getColumnQualifierBytes(), column.getTimestamp()); projectedColumns.add(projectedColumn); } PTable t = PTableImpl.builderWithColumns(table, projectedColumns) .build(); return new SingleTableColumnResolver(connection, new TableRef(tableRef.getTableAlias(), t, tableRef.getLowerBoundTimeStamp(), tableRef.hasDynamicCols())); }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (! (obj instanceof PColumn) ) return false; PColumn other = (PColumn)obj; if (familyName == null) { if (other.getFamilyName() != null) return false; } else if (!familyName.equals(other.getFamilyName())) return false; if (name == null) { if (other.getName() != null) return false; } else if (!name.equals(other.getName())) return false; return true; }
/** * * @param pCol * @return sql type name that could be used in DDL statements, dynamic column types etc. */ public static String getSqlTypeName(PColumn pCol) { PDataType dataType = pCol.getDataType(); Integer maxLength = pCol.getMaxLength(); Integer scale = pCol.getScale(); return getSqlTypeName(dataType, maxLength, scale); }
public static PColumn getIndexPKColumn(int position, PColumn dataColumn) { assert (SchemaUtil.isPKColumn(dataColumn)); PName indexColumnName = PNameFactory.newName(getIndexColumnName(null, dataColumn.getName().getString())); PColumn column = new PColumnImpl(indexColumnName, null, dataColumn.getDataType(), dataColumn.getMaxLength(), dataColumn.getScale(), dataColumn.isNullable(), position, dataColumn.getSortOrder(), dataColumn.getArraySize(), null, false, dataColumn.getExpressionStr(), dataColumn.isRowTimestamp(), false, // TODO set the columnQualifierBytes correctly /*columnQualifierBytes*/null, HConstants.LATEST_TIMESTAMP); return column; }
unusedPkColumns.add(new RowKeyColumnExpression(column, new RowKeyValueAccessor(pkColumns, i), "\""+column.getName().getString()+"\"")); RowKeyColumnExpression columnExpression = new RowKeyColumnExpression(col, new RowKeyValueAccessor(pkColumns, posOffset), col.getName().getString()); unusedPkColumns.remove(columnExpression); PDataType dataType = IndexUtil.getIndexColumnDataType(col); ColumnName colName = ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(col)); allPkColumns.add(new ColumnDefInPkConstraint(colName, col.getSortOrder(), false)); columnDefs.add(FACTORY.columnDef(colName, dataType.getSqlTypeName(), col.isNullable(), col.getMaxLength(), col.getScale(), false, SortOrder.getDefault(), col.getName().getString(), col.isRowTimestamp())); String columnFamilyName = column.getFamilyName()!=null ? column.getFamilyName().getString() : null; colName = ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(columnFamilyName, column.getName().getString())); isRowTimestamp = column.isRowTimestamp(); if (colRef.getColumn().getExpressionStr() != null) { expressionStr = colRef.getColumn().getExpressionStr(); if (col.getViewConstant() == null) { ColumnName colName = ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(col)); allPkColumns.add(new ColumnDefInPkConstraint(colName, colExpression.getSortOrder(), col.isRowTimestamp())); PDataType dataType = IndexUtil.getIndexColumnDataType(colExpression.isNullable(), colExpression.getDataType()); columnDefs.add(FACTORY.columnDef(colName, dataType.getSqlTypeName(), colExpression.isNullable(), colExpression.getMaxLength(), colExpression.getScale(), false, colExpression.getSortOrder(), colExpression.toString(), col.isRowTimestamp())); if (!SchemaUtil.isPKColumn(col) && col.getViewConstant() == null) { colName = ColumnName.caseSensitiveColumnName(isLocalIndex?IndexUtil.getLocalIndexColumnFamily(col.getFamilyName().getString()):col.getFamilyName().getString(), IndexUtil.getIndexColumnName(col)); columnDefs.add(FACTORY.columnDef(colName, col.getDataType().getSqlTypeName(), col.isNullable(), col.getMaxLength(), col.getScale(), false, col.getSortOrder(), col.getExpressionStr(), col.isRowTimestamp()));
@Override public void setValue(PColumn column, byte[] byteValue) { deleteRow = null; byte[] family = column.getFamilyName().getBytes(); byte[] qualifier = column.getColumnQualifierBytes(); ImmutableBytesPtr qualifierPtr = new ImmutableBytesPtr(qualifier); PDataType<?> type = column.getDataType(); if (isNull && !column.isNullable()) { throw new ConstraintViolationException(name.getString() + "." + column.getName().getString() + " may not be null"); } else if (isNull && PTableImpl.this.isImmutableRows() && column.getExpressionStr() == null) { } else if (isNull && !getStoreNulls() && !this.hasOnDupKey && column.getExpressionStr() == null) { .getFamilyName().getBytesPtr(), qualifierPtr, ts)); } else { ImmutableBytesWritable ptr = new ImmutableBytesWritable(byteValue); Integer maxLength = column.getMaxLength(); Integer scale = column.getScale(); SortOrder sortOrder = column.getSortOrder(); if (!type.isSizeCompatible(ptr, null, type, sortOrder, null, null, maxLength, scale)) { throw new DataExceedsCapacityException(name.getString() + "." + column.getName().getString() + " may not exceed " + maxLength + " (" + SchemaUtil.toString(type, byteValue) + ")"); removeIfPresent(unsetValues, family, qualifier); addQuietly(setValues, kvBuilder, kvBuilder.buildPut(keyPtr, column.getFamilyName().getBytesPtr(), qualifierPtr, ts, ptr));
NODE_FACTORY.column(TableName.create(null, familyName), '"' + column.getName().getString() + '"', null).accept(visitor); ColumnRef sourceColumnRef = new ColumnRef(tableRef, sourceColumn.getPosition()); PColumn column = new ProjectedColumn(sourceColumn.getName(), sourceColumn.getFamilyName(), position++, sourceColumn.isNullable(), sourceColumnRef, null); projectedColumns.add(column); if (SchemaUtil.isPKColumn(sourceColumn)) continue; ColumnRef sourceColumnRef = new ColumnRef(tableRef, sourceColumn.getPosition()); if (!isWildcard && !visitor.nonPkColumnRefSet.contains(sourceColumnRef) && !families.contains(sourceColumn.getFamilyName().getString())) continue; PColumn column = new ProjectedColumn(sourceColumn.getName(), sourceColumn.getFamilyName(), visitor.nonPkColumnRefSet.contains(sourceColumnRef) ? position + nonPkColumnRefList.indexOf(sourceColumnRef) : position++, sourceColumn.isNullable(), sourceColumnRef, sourceColumn.getColumnQualifierBytes()); if (!isWildcard && !families.contains(sourceColumn.getFamilyName())) { EncodedColumnsUtil.setColumns(column, table, context.getScan()); PColumn column = new ProjectedColumn(sourceColumnRef.getColumn().getName(), sourceColumnRef.getColumn().getFamilyName(), position++, sourceColumnRef.getColumn().isNullable(), sourceColumnRef, sourceColumnRef.getColumn().getColumnQualifierBytes()); projectedColumns.add(column);
for (int i = indexPosOffset; i<index.getPKColumns().size();i++) { PColumn indexColumn = index.getPKColumns().get(i); String indexColumnName = indexColumn.getName().getString(); String dataFamilyName = IndexUtil.getDataColumnFamilyName(indexColumnName); String dataColumnName = IndexUtil.getDataColumnName(indexColumnName); for (int i = dataPosOffset; i < dataPKColumns.size(); i++) { PColumn dataPKColumn = dataPKColumns.get(i); if (dataPKColumn.getViewConstant() != null) { bitSet.set(i); nDataPKColumns--; PColumn column = IndexUtil.getDataColumn(dataTable, indexColumn.getName().getString()); boolean isPKColumn = SchemaUtil.isPKColumn(column); if (isPKColumn) { int dataPkPos = dataTable.getPKColumns().indexOf(column) - (dataTable.getBucketNum() == null ? 0 : 1) - (this.isMultiTenant ? 1 : 0); this.rowKeyMetaData.setIndexPkPosition(dataPkPos, indexPos); indexedColumnsInfo.add(new Pair<>((String)null, column.getName().getString())); } else { indexColByteSize += column.getDataType().isFixedWidth() ? SchemaUtil.getFixedByteSize(column) : ValueSchema.ESTIMATED_VARIABLE_LENGTH_SIZE; try { if (column.isNullable() && ExpressionUtil.isConstant(expression)) { expression = CoerceExpression.create(expression, indexColumn.getDataType()); indexedColumnsInfo.add(new Pair<>(column.getFamilyName().getString(), column.getName().getString())); } catch (SQLException e) { throw new RuntimeException(e); // Impossible
if (column.getExpressionStr() != null) { nValues++; sortOrder = column.getSortOrder(); type = column.getDataType(); if (column.getExpressionStr() != null) { try { String url = PhoenixRuntime.JDBC_PROTOCOL new SQLParser(column.getExpressionStr()).parseExpression(); Expression defaultExpression = defaultParseNode.accept(compiler); defaultExpression.evaluate(null, key); column.getDataType().coerceBytes(key, null, defaultExpression.getDataType(), defaultExpression.getMaxLength(), defaultExpression.getScale(), defaultExpression.getSortOrder(), column.getMaxLength(), column.getScale(), column.getSortOrder()); byteValue = ByteUtil.copyKeyBytesIfNecessary(key); } catch (SQLException e) { // should not be possible throw new ConstraintViolationException(name.getString() + "." + column.getName().getString() + " failed to compile default value expression of " + column.getExpressionStr()); if (byteValue.length == 0 && !column.isNullable()) { throw new ConstraintViolationException(name.getString() + "." + column.getName().getString() + " may not be null");
addViewColumnsToBe = Sets.newLinkedHashSetWithExpectedSize(allColumnsToBe.size()); for (PColumn column : allColumnsToBe) { if (column.getViewConstant() != null) { addViewColumnsToBe.add(column); if (isSharedViewIndex) { PColumn indexIdColumn = table.getPKColumns().get(minPKPos); columnIndexesToBe[minPKPos] = indexIdColumn.getPosition(); targetColumns.set(minPKPos, indexIdColumn); minPKPos++; columnIndexesToBe[minPKPos] = tenantColumn.getPosition(); targetColumns.set(minPKPos, tenantColumn); minPKPos++; if (isSharedViewIndex) { PColumn indexIdColumn = table.getPKColumns().get(i + posOffset); columnsBeingSet.set(columnIndexesToBe[i] = indexIdColumn.getPosition()); pkSlotIndexesToBe[i] = i + posOffset; targetColumns.set(i, indexIdColumn); columnsBeingSet.set(columnIndexesToBe[i] = tenantColumn.getPosition()); pkSlotIndexesToBe[i] = i + posOffset; targetColumns.set(i, tenantColumn); columnsBeingSet.set(columnIndexesToBe[i] = column.getPosition()); targetColumns.set(i, column); if (SchemaUtil.isPKColumn(column)) {
value = constantExpression.getDataType().toObject(ptr, constantExpression.getSortOrder(), constantExpression.getMaxLength(), constantExpression.getScale()); if (!constantExpression.getDataType().isCoercibleTo(column.getDataType(), value)) { throw TypeMismatchException.newException( constantExpression.getDataType(), column.getDataType(), "expression: " + constantExpression.toString() + " in column " + column); if (!column.getDataType().isSizeCompatible(ptr, value, constantExpression.getDataType(), constantExpression.getSortOrder(), constantExpression.getMaxLength(), constantExpression.getScale(), column.getMaxLength(), column.getScale())) { throw new SQLExceptionInfo.Builder( SQLExceptionCode.DATA_EXCEEDS_MAX_CAPACITY).setColumnName(column.getName().getString()) .setMessage("value=" + constantExpression.toString()).build().buildException(); column.getDataType().coerceBytes(ptr, value, constantExpression.getDataType(), constantExpression.getMaxLength(), constantExpression.getScale(), constantExpression.getSortOrder(), column.getMaxLength(), column.getScale(),column.getSortOrder(), table.rowKeyOrderOptimizable()); if (overlapViewColumns.contains(column) && Bytes.compareTo(ptr.get(), ptr.getOffset(), ptr.getLength(), column.getViewConstant(), 0, column.getViewConstant().length-1) != 0) { throw new SQLExceptionInfo.Builder( SQLExceptionCode.CANNOT_UPDATE_VIEW_COLUMN) .setColumnName(column.getName().getString()) .setMessage("value=" + constantExpression.toString()).build().buildException();
public KeyValueColumnExpression(PColumn column, String displayName) { super(column); this.cf = column.getFamilyName().getBytes(); // for backward compatibility since older tables won't have columnQualifierBytes in their metadata this.cq = column.getColumnQualifierBytes() != null ? column.getColumnQualifierBytes() : column.getName().getBytes(); this.displayName = displayName; }
private static void coerceDataValueToIndexValue(PColumn dataColumn, PColumn indexColumn, ImmutableBytesWritable ptr) { PDataType dataType = dataColumn.getDataType(); // TODO: push to RowKeySchema? SortOrder dataModifier = dataColumn.getSortOrder(); PDataType indexType = indexColumn.getDataType(); SortOrder indexModifier = indexColumn.getSortOrder(); // We know ordinal position will match pk position, because you cannot // alter an index table. indexType.coerceBytes(ptr, dataType, dataModifier, indexModifier); }
/** * Pads the data in ptr by the required amount for fixed width data types */ public static void padData(String tableName, PColumn column, ImmutableBytesWritable ptr) { PDataType type = column.getDataType(); byte[] byteValue = ptr.get(); boolean isNull = type.isNull(byteValue); Integer maxLength = column.getMaxLength(); if (!isNull && type.isFixedWidth() && maxLength != null) { if (ptr.getLength() < maxLength) { type.pad(ptr, maxLength, column.getSortOrder()); } else if (ptr.getLength() > maxLength) { throw new DataExceedsCapacityException(tableName + "." + column.getName().getString() + " may not exceed " + maxLength + " bytes (" + type.toObject(byteValue) + ")"); } } }
/** * Imperfect estimate of row size given a PTable * TODO: keep row count in stats table and use total size / row count instead * @param table * @return estimate of size in bytes of a row */ public static long estimateRowSize(PTable table) { int keyLength = estimateKeyLength(table); long rowSize = 0; for (PColumn column : table.getColumns()) { if (!SchemaUtil.isPKColumn(column)) { PDataType type = column.getDataType(); Integer maxLength = column.getMaxLength(); int valueLength = !type.isFixedWidth() ? VAR_KV_LENGTH_ESTIMATE : maxLength == null ? type.getByteSize() : maxLength; rowSize += KeyValue.getKeyValueDataStructureSize(keyLength, column.getFamilyName().getBytes().length, column.getName().getBytes().length, valueLength); } } byte[] emptyKeyValueKV = EncodedColumnsUtil.getEmptyKeyValueInfo(table).getFirst(); // Empty key value rowSize += KeyValue.getKeyValueDataStructureSize(keyLength, getEmptyColumnFamily(table).length, emptyKeyValueKV.length, 0); return rowSize; }
public static PDataType getIndexColumnDataType(PColumn dataColumn) throws SQLException { PDataType type = getIndexColumnDataType(dataColumn.isNullable(),dataColumn.getDataType()); if (type == null) { throw new SQLExceptionInfo.Builder(SQLExceptionCode.CANNOT_INDEX_COLUMN_ON_TYPE).setColumnName(dataColumn.getName().getString()) .setMessage("Type="+dataColumn.getDataType()).build().buildException(); } return type; }
public static void setColumns(PColumn column, PTable table, Scan scan) { if (table.getImmutableStorageScheme() == ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS) { // if a table storage scheme is COLUMNS_STORED_IN_SINGLE_CELL set then all columns of a column family are stored in a single cell // (with the qualifier name being same as the family name), just project the column family here // so that we can calculate estimatedByteSize correctly in ProjectionCompiler scan.addFamily(column.getFamilyName().getBytes()); } else { if (column.getColumnQualifierBytes() != null) { scan.addColumn(column.getFamilyName().getBytes(), column.getColumnQualifierBytes()); } } }
@Override public int compare(PColumn o1, PColumn o2) { return Integer.valueOf(o1.getPosition()).compareTo(o2.getPosition()); } });
for (int i = posOffset; i < nIndexPKColumns; i++) { PColumn col = indexPKColumns.get(i); String indexColName = col.getName().getString(); String dataColName = StringUtil.escapeBackslash(col.getExpressionStr()); dataColumns.append(dataColName).append(","); indexColumns.append('"').append(indexColName).append("\","); if (col.getViewConstant() == null) { String indexColName = col.getName().getString(); String dataFamilyName = IndexUtil.getDataColumnFamilyName(indexColName); String dataColumnName = IndexUtil.getDataColumnName(indexColName);