private static void ReadIndexColumnData(DbDataReader reader, ref IndexReaderState state)
        {
            SqlExpression expression = null;

            state.IndexName = reader.GetString(2).Trim();
            if (state.IndexName != state.LastIndexName)
            {
                state.Table             = state.Schema.Tables[reader.GetString(1).Trim()];
                state.Index             = state.Table.CreateIndex(state.IndexName);
                state.Index.IsUnique    = ReadBool(reader, 5);
                state.Index.IsBitmap    = false;
                state.Index.IsClustered = false;
                if (!reader.IsDBNull(8))
                {
                    // expression index
                    expression = SqlDml.Native(reader.GetString(8).Trim());
                }
            }

            if (expression == null)
            {
                var column       = state.Table.TableColumns[reader.GetString(6).Trim()];
                var isDescending = ReadBool(reader, 4);
                _ = state.Index.CreateIndexColumn(column, !isDescending);
            }
            else
            {
                var isDescending = ReadBool(reader, 4);
                _ = state.Index.CreateIndexColumn(expression, !isDescending);
            }

            state.LastIndexName = state.IndexName;
        }
        private void ExtractIndexes(Catalog catalog)
        {
            using var command = Connection.CreateCommand(GetExtractIndexesQuery());
            using var reader  = command.ExecuteReader(CommandBehavior.SingleResult);
            var readerState = new IndexReaderState(catalog.DefaultSchema);

            while (reader.Read())
            {
                ReadIndexColumnData(reader, ref readerState);
            }
        }
        private async Task ExtractIndexesAsync(Catalog catalog, CancellationToken token)
        {
            var command = Connection.CreateCommand(GetExtractIndexesQuery());

            await using (command.ConfigureAwait(false)) {
                var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleResult, token).ConfigureAwait(false);

                await using (reader.ConfigureAwait(false)) {
                    var readerState = new IndexReaderState(catalog.DefaultSchema);
                    while (await reader.ReadAsync(token).ConfigureAwait(false))
                    {
                        ReadIndexColumnData(reader, ref readerState);
                    }
                }
            }
        }