in csharp/src/Drivers/BigQuery/BigQueryConnection.cs [627:738]
private StructArray GetColumnSchema(
string catalog,
string dbSchema,
string table,
string? columnNamePattern)
{
StringArray.Builder columnNameBuilder = new StringArray.Builder();
Int32Array.Builder ordinalPositionBuilder = new Int32Array.Builder();
StringArray.Builder remarksBuilder = new StringArray.Builder();
Int16Array.Builder xdbcDataTypeBuilder = new Int16Array.Builder();
StringArray.Builder xdbcTypeNameBuilder = new StringArray.Builder();
Int32Array.Builder xdbcColumnSizeBuilder = new Int32Array.Builder();
Int16Array.Builder xdbcDecimalDigitsBuilder = new Int16Array.Builder();
Int16Array.Builder xdbcNumPrecRadixBuilder = new Int16Array.Builder();
Int16Array.Builder xdbcNullableBuilder = new Int16Array.Builder();
StringArray.Builder xdbcColumnDefBuilder = new StringArray.Builder();
Int16Array.Builder xdbcSqlDataTypeBuilder = new Int16Array.Builder();
Int16Array.Builder xdbcDatetimeSubBuilder = new Int16Array.Builder();
Int32Array.Builder xdbcCharOctetLengthBuilder = new Int32Array.Builder();
StringArray.Builder xdbcIsNullableBuilder = new StringArray.Builder();
StringArray.Builder xdbcScopeCatalogBuilder = new StringArray.Builder();
StringArray.Builder xdbcScopeSchemaBuilder = new StringArray.Builder();
StringArray.Builder xdbcScopeTableBuilder = new StringArray.Builder();
BooleanArray.Builder xdbcIsAutoincrementBuilder = new BooleanArray.Builder();
BooleanArray.Builder xdbcIsGeneratedcolumnBuilder = new BooleanArray.Builder();
ArrowBuffer.BitmapBuilder nullBitmapBuffer = new ArrowBuffer.BitmapBuilder();
int length = 0;
string query = string.Format("SELECT * FROM `{0}`.`{1}`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{2}'",
Sanitize(catalog), Sanitize(dbSchema), Sanitize(table));
if (columnNamePattern != null)
{
query = string.Concat(query, string.Format("AND column_name LIKE '{0}'", Sanitize(columnNamePattern)));
}
BigQueryResults? result = ExecuteQuery(query, parameters: null);
if (result != null)
{
foreach (BigQueryRow row in result)
{
columnNameBuilder.Append(GetValue(row["column_name"]));
ordinalPositionBuilder.Append((int)(long)row["ordinal_position"]);
remarksBuilder.Append("");
string dataType = ToTypeName(GetValue(row["data_type"]), out string suffix);
if ((dataType.StartsWith("NUMERIC") ||
dataType.StartsWith("DECIMAL") ||
dataType.StartsWith("BIGNUMERIC") ||
dataType.StartsWith("BIGDECIMAL"))
&& !string.IsNullOrEmpty(suffix))
{
ParsedDecimalValues values = ParsePrecisionAndScale(suffix);
xdbcColumnSizeBuilder.Append(values.Precision);
xdbcDecimalDigitsBuilder.Append(Convert.ToInt16(values.Scale));
}
else
{
xdbcColumnSizeBuilder.AppendNull();
xdbcDecimalDigitsBuilder.AppendNull();
}
xdbcDataTypeBuilder.AppendNull();
xdbcTypeNameBuilder.Append(dataType);
xdbcNumPrecRadixBuilder.AppendNull();
xdbcNullableBuilder.AppendNull();
xdbcColumnDefBuilder.AppendNull();
xdbcSqlDataTypeBuilder.Append((short)ToXdbcDataType(dataType));
xdbcDatetimeSubBuilder.AppendNull();
xdbcCharOctetLengthBuilder.AppendNull();
xdbcIsNullableBuilder.Append(row["is_nullable"].ToString());
xdbcScopeCatalogBuilder.AppendNull();
xdbcScopeSchemaBuilder.AppendNull();
xdbcScopeTableBuilder.AppendNull();
xdbcIsAutoincrementBuilder.AppendNull();
xdbcIsGeneratedcolumnBuilder.Append(GetValue(row["is_generated"]).ToUpper() == "YES");
nullBitmapBuffer.Append(true);
length++;
}
}
IArrowArray[] dataArrays = new IArrowArray[]
{
columnNameBuilder.Build(),
ordinalPositionBuilder.Build(),
remarksBuilder.Build(),
xdbcDataTypeBuilder.Build(),
xdbcTypeNameBuilder.Build(),
xdbcColumnSizeBuilder.Build(),
xdbcDecimalDigitsBuilder.Build(),
xdbcNumPrecRadixBuilder.Build(),
xdbcNullableBuilder.Build(),
xdbcColumnDefBuilder.Build(),
xdbcSqlDataTypeBuilder.Build(),
xdbcDatetimeSubBuilder.Build(),
xdbcCharOctetLengthBuilder.Build(),
xdbcIsNullableBuilder.Build(),
xdbcScopeCatalogBuilder.Build(),
xdbcScopeSchemaBuilder.Build(),
xdbcScopeTableBuilder.Build(),
xdbcIsAutoincrementBuilder.Build(),
xdbcIsGeneratedcolumnBuilder.Build()
};
StandardSchemas.ColumnSchema.Validate(dataArrays);
return new StructArray(
new StructType(StandardSchemas.ColumnSchema),
length,
dataArrays,
nullBitmapBuffer.Build());
}