Skip to content

Commit

Permalink
Check that ordering is supported before adding sort order annotations
Browse files Browse the repository at this point in the history
  • Loading branch information
khellang committed Feb 19, 2019
1 parent 6f33b6d commit c72ac08
Showing 1 changed file with 19 additions and 15 deletions.
34 changes: 19 additions & 15 deletions src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ static void GetIndexes(
idxcls.relname AS idx_relname,
indisunique,
{(connection.PostgreSqlVersion >= new Version(11, 0) ? "indnkeyatts" : "indnatts AS indnkeyatts")},
{(connection.PostgreSqlVersion >= new Version(9, 6) ? "pg_indexam_has_property(am.oid, 'can_order') as amcanorder" : "amcanorder")},
indkey,
amname,
indclass,
Expand Down Expand Up @@ -548,27 +549,30 @@ NOT indisprimary AND
if (opClassNames.Any(op => op != null))
index[NpgsqlAnnotationNames.IndexOperators] = opClassNames;

var options = record.GetValueOrDefault<ushort[]>("indoption");
if (record.GetValueOrDefault<bool>("amcanorder"))
{
var options = record.GetValueOrDefault<ushort[]>("indoption");

// The first bit specifies whether values are sorted in descending order.
const ushort indoptionDescFlag = 0x0001;
// The first bit specifies whether values are sorted in descending order.
const ushort indoptionDescFlag = 0x0001;

var sortOrders = options
.Select(val => (val & indoptionDescFlag) != 0 ? SortOrder.Descending : SortOrder.Ascending)
.ToArray();
var sortOrders = options
.Select(val => (val & indoptionDescFlag) != 0 ? SortOrder.Descending : SortOrder.Ascending)
.ToArray();

if (!SortOrderHelper.IsDefaultSortOrder(sortOrders))
index[NpgsqlAnnotationNames.IndexSortOrder] = sortOrders;
if (!SortOrderHelper.IsDefaultSortOrder(sortOrders))
index[NpgsqlAnnotationNames.IndexSortOrder] = sortOrders;

// The second bit specifies whether NULLs are sorted first instead of last.
const ushort indoptionNullsFirstFlag = 0x0002;
// The second bit specifies whether NULLs are sorted first instead of last.
const ushort indoptionNullsFirstFlag = 0x0002;

var nullSortOrders = options
.Select(val => (val & indoptionNullsFirstFlag) != 0 ? NullSortOrder.NullsFirst : NullSortOrder.NullsLast)
.ToArray();
var nullSortOrders = options
.Select(val => (val & indoptionNullsFirstFlag) != 0 ? NullSortOrder.NullsFirst : NullSortOrder.NullsLast)
.ToArray();

if (!SortOrderHelper.IsDefaultNullSortOrder(nullSortOrders, sortOrders))
index[NpgsqlAnnotationNames.IndexNullSortOrder] = nullSortOrders;
if (!SortOrderHelper.IsDefaultNullSortOrder(nullSortOrders, sortOrders))
index[NpgsqlAnnotationNames.IndexNullSortOrder] = nullSortOrders;
}

table.Indexes.Add(index);

Expand Down

0 comments on commit c72ac08

Please sign in to comment.