public SqlRandomTableColumn(SqlRandomTypeInfo typeInfo, SqlRandomColumnOptions options, int? precision, int? scale) : this(typeInfo, options) { StorageSize = null; Precision = precision; Scale = scale; }
public SqlRandomTableColumn(SqlRandomTypeInfo typeInfo, SqlRandomColumnOptions options) { if (typeInfo == null) { throw new ArgumentNullException("typeInfo"); } if ((options & SqlRandomColumnOptions.ColumnSet) != 0) { if ((options & SqlRandomColumnOptions.Sparse) != 0) { throw new ArgumentException("options"); } if (typeInfo.Type != SqlDbType.Xml) { throw new ArgumentException("columnset column must be an XML column"); } } TypeInfo = typeInfo; Options = options; }
public override SqlRandomTableColumn CreateRandomColumn(SqlRandomizer rand, SqlRandomColumnOptions options) { return CreateDefaultColumn(options); }
public override SqlRandomTableColumn CreateRandomColumn(SqlRandomizer rand, SqlRandomColumnOptions options) { int size = rand.NextAllocationSizeBytes(2, MaxCharSize * 2); size = size & 0xFFFE; // clean last bit to make it even return new SqlRandomTableColumn(this, options, size); }
public override SqlRandomTableColumn CreateRandomColumn(SqlRandomizer rand, SqlRandomColumnOptions options) { int size = rand.NextAllocationSizeBytes(1, MaxCharSize); return new SqlRandomTableColumn(this, options, size); }
/// <summary> /// creates a default column instance for given type /// </summary> public virtual SqlRandomTableColumn CreateDefaultColumn(SqlRandomColumnOptions options) { return(new SqlRandomTableColumn(this, options)); }
/// <summary> /// Creates random list of columns from the given source collection. The rules are: /// * table cannot contain more than 1024 non-sparse columns /// * total row size of non-sparse columns should not exceed 8060 or 8018 (with sparse) /// * column set column must be added if number of columns in total exceeds 1024 /// </summary> public static SqlRandomTableColumn[] CreateRandTypes(SqlRandomizer rand, SqlRandomTypeInfoCollection sourceCollection, int maxColumnsCount, bool createIdColumn) { var retColumns = new List <SqlRandomTableColumn>(maxColumnsCount); bool hasTimestamp = false; double totalRowSize = 0; int totalRegularColumns = 0; bool hasColumnSet = false; bool hasSparseColumns = false; int maxRowSize = MaxBytesPerRow; // set to MaxBytesPerRowWithSparse when sparse column is first added int i = 0; if (createIdColumn) { SqlRandomTypeInfo keyType = sourceCollection[SqlDbType.Int]; SqlRandomTableColumn keyColumn = keyType.CreateDefaultColumn(SqlRandomColumnOptions.None); retColumns.Add(keyColumn); totalRowSize += keyType.GetInRowSize(keyColumn, null); i++; totalRegularColumns++; } for (; i < maxColumnsCount; i++) { // select column options (sparse/column-set) bool isSparse; // must be set in the if/else flow below bool isColumnSet = false; if (totalRegularColumns >= MaxNonSparseColumns) { // reached the limit for regular columns if (!hasColumnSet) { // no column-set yet, stop unconditionally // this can happen if large char/binary value brought the row size total to a limit leaving no space for column-set break; } // there is a column set, enforce sparse from this point isSparse = true; } else if (i == (MaxNonSparseColumns - 1) && hasSparseColumns && !hasColumnSet) { // we almost reached the limit of regular & sparse columns with, but no column set added // to increase chances for >1024 columns, enforce column set now isColumnSet = true; isSparse = false; } else if (totalRowSize > MaxBytesPerRowWithSparse) { Debug.Assert(totalRowSize <= MaxBytesPerRow, "size over the max limit"); Debug.Assert(!hasSparseColumns, "should not have sparse columns after MaxBytesPerRowWithSparse (check maxRowSize)"); // cannot insert sparse from this point isSparse = false; isColumnSet = false; } else { // check how close we are to the limit of the row size int sparseProbability; if (totalRowSize < 100) { sparseProbability = 2; } else if (totalRowSize < MaxBytesPerRowWithSparse / 2) { sparseProbability = 10; } else if (totalRowSize < (MaxBytesPerRowWithSparse - s_columnSetSafetyRange)) { sparseProbability = 50; } else { // close to the row size limit, special case if (!hasColumnSet) { // if we have not added column set column yet // column-set is a regular column and its size counts towards row size, so time to add it isColumnSet = true; sparseProbability = -1; // not used } else { sparseProbability = 90; } } if (!isColumnSet) { isSparse = (rand.Next(100) < sparseProbability); if (!isSparse && !hasColumnSet) { // if decided to add regular column, give it a (low) chance to inject a column set at any position isColumnSet = rand.Next(100) < 1; } } else { isSparse = false; } } // select the type SqlRandomTypeInfo ti; SqlRandomColumnOptions options = SqlRandomColumnOptions.None; if (isSparse) { Debug.Assert(!isColumnSet, "should not have both sparse and column set flags set"); ti = sourceCollection.NextSparse(rand); Debug.Assert(ti.CanBeSparseColumn, "NextSparse must return only types that can be sparse"); options |= SqlRandomColumnOptions.Sparse; } else if (isColumnSet) { Debug.Assert(!hasColumnSet, "there is already a column set, we should not set isColumnSet again above"); ti = sourceCollection[SqlDbType.Xml]; options |= SqlRandomColumnOptions.ColumnSet; } else { // regular column ti = sourceCollection.Next(rand); if (ti.Type == SqlDbType.Timestamp) { // while table can contain single timestamp column only, there is no way to insert values into it. // thus, do not allow this if (hasTimestamp || maxColumnsCount == 1) { ti = sourceCollection[SqlDbType.Int]; } else { // table cannot have two timestamp columns hasTimestamp = true; } } } SqlRandomTableColumn col = ti.CreateRandomColumn(rand, options); if (!isSparse) { double rowSize = ti.GetInRowSize(col, DBNull.Value); int overhead = GetRowOverhead(retColumns.Count + 1); // +1 for this column if (totalRowSize + rowSize + overhead > maxRowSize) { // cannot use this column // note that if this column is a column set column continue; } totalRowSize += rowSize; totalRegularColumns++; } // else - sparse columns are not counted towards row size when table is created (they are when inserting new row with non-null value in the sparse column)... retColumns.Add(col); // after adding the column, update the state if (isColumnSet) { hasColumnSet = true; } if (isSparse) { hasSparseColumns = true; maxRowSize = MaxBytesPerRowWithSparse; // reduce the max row size } } return(retColumns.ToArray()); }
public override SqlRandomTableColumn CreateRandomColumn(SqlRandomizer rand, SqlRandomColumnOptions options) { return(CreateDefaultColumn(options)); }
public override SqlRandomTableColumn CreateRandomColumn(SqlRandomizer rand, SqlRandomColumnOptions options) { int size = rand.NextAllocationSizeBytes(1, MaxCharSize); return(new SqlRandomTableColumn(this, options, size)); }