private StructArray GetColumnSchema()

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());
        }