github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/opt/props/multiplicity_test.go (about)

     1  // Copyright 2020 The Cockroach Authors.
     2  //
     3  // Use of this software is governed by the Business Source License
     4  // included in the file licenses/BSL.txt.
     5  //
     6  // As of the Change Date specified in that file, in accordance with
     7  // the Business Source License, use of this software will be governed
     8  // by the Apache License, Version 2.0, included in the file
     9  // licenses/APL.txt.
    10  
    11  package props
    12  
    13  import (
    14  	"testing"
    15  
    16  	"github.com/cockroachdb/cockroach/pkg/sql/opt"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  var bothIndeterminate = JoinMultiplicity{
    21  	UnfilteredCols:    opt.ColSet{},
    22  	LeftMultiplicity:  MultiplicityIndeterminateVal,
    23  	RightMultiplicity: MultiplicityIndeterminateVal,
    24  }
    25  
    26  var bothNoDup = JoinMultiplicity{
    27  	UnfilteredCols:    opt.ColSet{},
    28  	LeftMultiplicity:  MultiplicityNotDuplicatedVal,
    29  	RightMultiplicity: MultiplicityNotDuplicatedVal,
    30  }
    31  
    32  var bothPreserved = JoinMultiplicity{
    33  	UnfilteredCols:    opt.ColSet{},
    34  	LeftMultiplicity:  MultiplicityPreservedVal,
    35  	RightMultiplicity: MultiplicityPreservedVal,
    36  }
    37  
    38  var bothNoDupBothPreserved = JoinMultiplicity{
    39  	UnfilteredCols:    opt.ColSet{},
    40  	LeftMultiplicity:  MultiplicityNotDuplicatedVal | MultiplicityPreservedVal,
    41  	RightMultiplicity: MultiplicityNotDuplicatedVal | MultiplicityPreservedVal,
    42  }
    43  
    44  var leftIndeterminateRightPreserved = JoinMultiplicity{
    45  	UnfilteredCols:    opt.ColSet{},
    46  	LeftMultiplicity:  MultiplicityIndeterminateVal,
    47  	RightMultiplicity: MultiplicityPreservedVal,
    48  }
    49  
    50  var leftIndeterminateRightNoDup = JoinMultiplicity{
    51  	UnfilteredCols:    opt.ColSet{},
    52  	LeftMultiplicity:  MultiplicityIndeterminateVal,
    53  	RightMultiplicity: MultiplicityNotDuplicatedVal,
    54  }
    55  
    56  var rightIndeterminateLeftPreserved = JoinMultiplicity{
    57  	UnfilteredCols:    opt.ColSet{},
    58  	LeftMultiplicity:  MultiplicityPreservedVal,
    59  	RightMultiplicity: MultiplicityIndeterminateVal,
    60  }
    61  
    62  var rightIndeterminateLeftNoDup = JoinMultiplicity{
    63  	UnfilteredCols:    opt.ColSet{},
    64  	LeftMultiplicity:  MultiplicityNotDuplicatedVal,
    65  	RightMultiplicity: MultiplicityIndeterminateVal,
    66  }
    67  
    68  var bothNoDupLeftPreserved = JoinMultiplicity{
    69  	UnfilteredCols:    opt.ColSet{},
    70  	LeftMultiplicity:  MultiplicityNotDuplicatedVal | MultiplicityPreservedVal,
    71  	RightMultiplicity: MultiplicityNotDuplicatedVal,
    72  }
    73  
    74  var bothPreservedLeftNoDup = JoinMultiplicity{
    75  	UnfilteredCols:    opt.ColSet{},
    76  	LeftMultiplicity:  MultiplicityPreservedVal | MultiplicityNotDuplicatedVal,
    77  	RightMultiplicity: MultiplicityPreservedVal,
    78  }
    79  
    80  var bothNoDupRightPreserved = JoinMultiplicity{
    81  	UnfilteredCols:    opt.ColSet{},
    82  	LeftMultiplicity:  MultiplicityNotDuplicatedVal,
    83  	RightMultiplicity: MultiplicityNotDuplicatedVal | MultiplicityPreservedVal,
    84  }
    85  
    86  var bothPreservedRightNoDup = JoinMultiplicity{
    87  	UnfilteredCols:    opt.ColSet{},
    88  	LeftMultiplicity:  MultiplicityPreservedVal,
    89  	RightMultiplicity: MultiplicityPreservedVal | MultiplicityNotDuplicatedVal,
    90  }
    91  
    92  func TestJoinMultiplicity_JoinDoesNotDuplicateLeftRows(t *testing.T) {
    93  	require.Equal(t, false, bothIndeterminate.JoinDoesNotDuplicateLeftRows())
    94  	require.Equal(t, true, bothNoDup.JoinDoesNotDuplicateLeftRows())
    95  	require.Equal(t, false, bothPreserved.JoinDoesNotDuplicateLeftRows())
    96  	require.Equal(t, true, bothNoDupBothPreserved.JoinDoesNotDuplicateLeftRows())
    97  	require.Equal(t, false, leftIndeterminateRightPreserved.JoinDoesNotDuplicateLeftRows())
    98  	require.Equal(t, false, leftIndeterminateRightNoDup.JoinDoesNotDuplicateLeftRows())
    99  	require.Equal(t, false, rightIndeterminateLeftPreserved.JoinDoesNotDuplicateLeftRows())
   100  	require.Equal(t, true, rightIndeterminateLeftNoDup.JoinDoesNotDuplicateLeftRows())
   101  	require.Equal(t, true, bothNoDupLeftPreserved.JoinDoesNotDuplicateLeftRows())
   102  	require.Equal(t, true, bothPreservedLeftNoDup.JoinDoesNotDuplicateLeftRows())
   103  	require.Equal(t, true, bothNoDupRightPreserved.JoinDoesNotDuplicateLeftRows())
   104  	require.Equal(t, false, bothPreservedRightNoDup.JoinDoesNotDuplicateLeftRows())
   105  }
   106  
   107  func TestJoinMultiplicity_JoinDoesNotDuplicateRightRows(t *testing.T) {
   108  	require.Equal(t, false, bothIndeterminate.JoinDoesNotDuplicateRightRows())
   109  	require.Equal(t, true, bothNoDup.JoinDoesNotDuplicateRightRows())
   110  	require.Equal(t, false, bothPreserved.JoinDoesNotDuplicateRightRows())
   111  	require.Equal(t, true, bothNoDupBothPreserved.JoinDoesNotDuplicateRightRows())
   112  	require.Equal(t, false, leftIndeterminateRightPreserved.JoinDoesNotDuplicateRightRows())
   113  	require.Equal(t, true, leftIndeterminateRightNoDup.JoinDoesNotDuplicateRightRows())
   114  	require.Equal(t, false, rightIndeterminateLeftPreserved.JoinDoesNotDuplicateRightRows())
   115  	require.Equal(t, false, rightIndeterminateLeftNoDup.JoinDoesNotDuplicateRightRows())
   116  	require.Equal(t, true, bothNoDupLeftPreserved.JoinDoesNotDuplicateRightRows())
   117  	require.Equal(t, false, bothPreservedLeftNoDup.JoinDoesNotDuplicateRightRows())
   118  	require.Equal(t, true, bothNoDupRightPreserved.JoinDoesNotDuplicateRightRows())
   119  	require.Equal(t, true, bothPreservedRightNoDup.JoinDoesNotDuplicateRightRows())
   120  }
   121  
   122  func TestJoinMultiplicity_JoinPreservesLeftRows(t *testing.T) {
   123  	require.Equal(t, false, bothIndeterminate.JoinPreservesLeftRows())
   124  	require.Equal(t, false, bothNoDup.JoinPreservesLeftRows())
   125  	require.Equal(t, true, bothPreserved.JoinPreservesLeftRows())
   126  	require.Equal(t, true, bothNoDupBothPreserved.JoinPreservesLeftRows())
   127  	require.Equal(t, false, leftIndeterminateRightPreserved.JoinPreservesLeftRows())
   128  	require.Equal(t, false, leftIndeterminateRightNoDup.JoinPreservesLeftRows())
   129  	require.Equal(t, true, rightIndeterminateLeftPreserved.JoinPreservesLeftRows())
   130  	require.Equal(t, false, rightIndeterminateLeftNoDup.JoinPreservesLeftRows())
   131  	require.Equal(t, true, bothNoDupLeftPreserved.JoinPreservesLeftRows())
   132  	require.Equal(t, true, bothPreservedLeftNoDup.JoinPreservesLeftRows())
   133  	require.Equal(t, false, bothNoDupRightPreserved.JoinPreservesLeftRows())
   134  	require.Equal(t, true, bothPreservedRightNoDup.JoinPreservesLeftRows())
   135  }
   136  
   137  func TestJoinMultiplicity_JoinPreservesRightRows(t *testing.T) {
   138  	require.Equal(t, false, bothIndeterminate.JoinPreservesRightRows())
   139  	require.Equal(t, false, bothNoDup.JoinPreservesRightRows())
   140  	require.Equal(t, true, bothPreserved.JoinPreservesRightRows())
   141  	require.Equal(t, true, bothNoDupBothPreserved.JoinPreservesRightRows())
   142  	require.Equal(t, true, leftIndeterminateRightPreserved.JoinPreservesRightRows())
   143  	require.Equal(t, false, leftIndeterminateRightNoDup.JoinPreservesRightRows())
   144  	require.Equal(t, false, rightIndeterminateLeftPreserved.JoinPreservesRightRows())
   145  	require.Equal(t, false, rightIndeterminateLeftNoDup.JoinPreservesRightRows())
   146  	require.Equal(t, false, bothNoDupLeftPreserved.JoinPreservesRightRows())
   147  	require.Equal(t, true, bothPreservedLeftNoDup.JoinPreservesRightRows())
   148  	require.Equal(t, true, bothNoDupRightPreserved.JoinPreservesRightRows())
   149  	require.Equal(t, true, bothPreservedRightNoDup.JoinPreservesRightRows())
   150  }