--TEST-- Test for inserting into and retrieving from decimal columns of different scale --SKIPIF-- --FILE-- $posExp, "Testing numbers between 1 and -1:" => $negExp); $scalesToTest = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 19); function testErrorCases($conn) { // Create a dummy table $tableName = "srv_sci_not"; $colMeta = array(new AE\ColumnMeta("decimal(38, 1)", "Column1")); AE\createTable($conn, $tableName, $colMeta); $expected = '*Invalid character value for cast specification'; $tsql = "INSERT INTO $tableName (Column1) VALUES (?)"; $input = "- 0E1.3"; $param = array( array(&$input, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_DECIMAL(38, 1)) ); $stmt = sqlsrv_prepare($conn, $tsql, $param); if (!sqlsrv_execute($stmt)) { if (!fnmatch($expected, sqlsrv_errors()[0]['message'])) { var_dump(sqlsrv_errors()); } } else { echo "Expect $input to fail"; } $input = "8e0-2"; if (!sqlsrv_execute($stmt)) { if (!fnmatch($expected, sqlsrv_errors()[0]['message'])) { var_dump(sqlsrv_errors()); } } else { echo "Expect $input to fail"; } $input = "-19e032+"; if (!sqlsrv_execute($stmt)) { if (!fnmatch($expected, sqlsrv_errors()[0]['message'])) { var_dump(sqlsrv_errors()); } } else { echo "Expect $input to fail"; } $input = "5678.5678.5678"; $expected = "*String data, right truncation"; if (!sqlsrv_execute($stmt)) { if (!fnmatch($expected, sqlsrv_errors()[0]['message'])) { var_dump(sqlsrv_errors()); } } else { echo "Expect $input to fail"; } dropTable($conn, $tableName); } $conn = AE\connect(); testErrorCases($conn); $tbname = "decimalTable"; foreach ($numSets as $testName => $numSet) { echo "\n$testName\n"; foreach ($numSet as $input) { $numInt = ceil(log10(abs($input) + 1)); $decimalTypes = array(); foreach ($scalesToTest as $scale) { if ($scale < 39 - $numInt) { array_push($decimalTypes, new AE\ColumnMeta("decimal(38, $scale)", "c$scale")); } } if (empty($decimalTypes)) { $decimalTypes = array(new AE\ColumnMeta("decimal(38, 0)", "c0")); } AE\createTable($conn, $tbname, $decimalTypes); $insertValues = array(); foreach ($decimalTypes as $decimalType) { $scale = intval(ltrim($decimalType->colName, "c")); array_push($insertValues, array($input, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR), SQLSRV_SQLTYPE_DECIMAL(38, $scale))); } $insertSql = "INSERT INTO $tbname VALUES(" . AE\getSeqPlaceholders(count($insertValues)) . ")"; $stmt = sqlsrv_prepare($conn, $insertSql, $insertValues); if (!sqlsrv_execute($stmt)) { fatalError("Failed to execute $insertSql\n"); } $stmt = sqlsrv_query($conn, "SELECT * FROM $tbname"); $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); if (empty($row)) { fatalError("Empty array is returned\n"); } foreach ($row as $key => $value) { if ($value != 0) { echo "$key: $value\n"; } } sqlsrv_query($conn, "TRUNCATE TABLE $tbname"); } } dropTable($conn, $tbname); sqlsrv_close($conn); ?> --EXPECT-- Testing numbers greater than 1 or less than -1: c0: 10 c1: 10.0 c2: 10.00 c3: 10.000 c4: 10.0000 c5: 10.00000 c6: 10.000000 c7: 10.0000000 c8: 10.00000000 c9: 10.000000000 c19: 10.0000000000000000000 c0: -13 c1: -13.3 c2: -13.33 c3: -13.330 c4: -13.3300 c5: -13.33000 c6: -13.330000 c7: -13.3300000 c8: -13.33000000 c9: -13.330000000 c19: -13.3300000000000000000 c0: 192 c1: 191.8 c2: 191.78 c3: 191.785 c4: 191.7846 c5: 191.78465 c6: 191.784647 c7: 191.7846470 c8: 191.78464696 c9: 191.784646962 c19: 191.7846469620226500000 c0: -833 c1: -833.3 c2: -833.33 c3: -833.330 c4: -833.3300 c5: -833.33000 c6: -833.330000 c7: -833.3300000 c8: -833.33000000 c9: -833.330000000 c19: -833.3300000000000000000 c0: 850 c1: 850.0 c2: 850.00 c3: 850.000 c4: 850.0000 c5: 850.00000 c6: 850.000000 c7: 850.0000000 c8: 850.00000000 c9: 850.000000000 c19: 850.0000000000000600000 c0: -852 c1: -851.6 c2: -851.65 c3: -851.648 c4: -851.6484 c5: -851.64835 c6: -851.648352 c7: -851.6483516 c8: -851.64835165 c9: -851.648351648 c19: -851.6483516483516800000 c0: 316000 c1: 316000.0 c2: 316000.00 c3: 316000.000 c4: 316000.0000 c5: 316000.00000 c6: 316000.000000 c7: 316000.0000000 c8: 316000.00000000 c9: 316000.000000000 c19: 316000.0000000000000000000 c0: -500000 c1: -500000.0 c2: -500000.00 c3: -500000.000 c4: -500000.0000 c5: -500000.00000 c6: -500000.000000 c7: -500000.0000000 c8: -500000.00000000 c9: -500000.000000000 c19: -500000.0000000000000000000 c0: 1535020 c1: 1535020.0 c2: 1535020.00 c3: 1535020.000 c4: 1535020.0000 c5: 1535020.00000 c6: 1535020.000000 c7: 1535020.0000000 c8: 1535020.00000000 c9: 1535020.000000000 c19: 1535020.0000000000000000000 c0: -7501300 c1: -7501300.0 c2: -7501300.00 c3: -7501300.000 c4: -7501300.0000 c5: -7501300.00000 c6: -7501300.000000 c7: -7501300.0000000 c8: -7501300.00000000 c9: -7501300.000000000 c19: -7501300.0000000000000000000 c0: 7540010 c1: 7540010.0 c2: 7540010.00 c3: 7540010.000 c4: 7540010.0000 c5: 7540010.00000 c6: 7540010.000000 c7: 7540010.0000000 c8: 7540010.00000000 c9: 7540010.000000000 c19: 7540010.0000000000000000000 c0: -7540450 c1: -7540450.0 c2: -7540450.00 c3: -7540450.000 c4: -7540450.0000 c5: -7540450.00000 c6: -7540450.000000 c7: -7540450.0000000 c8: -7540450.00000000 c9: -7540450.000000000 c19: -7540450.0000000000000000000 c0: 8200000000000 c1: 8200000000000.0 c2: 8200000000000.00 c3: 8200000000000.000 c4: 8200000000000.0000 c5: 8200000000000.00000 c6: 8200000000000.000000 c7: 8200000000000.0000000 c8: 8200000000000.00000000 c9: 8200000000000.000000000 c19: 8200000000000.0000000000000000000 c0: -11225500 c1: -11225500.0 c2: -11225500.00 c3: -11225500.000 c4: -11225500.0000 c5: -11225500.00000 c6: -11225500.000000 c7: -11225500.0000000 c8: -11225500.00000000 c9: -11225500.000000000 c19: -11225500.0000000000000000000 c0: 1234567890 c1: 1234567890.0 c2: 1234567890.00 c3: 1234567890.000 c4: 1234567890.0000 c5: 1234567890.00000 c6: 1234567890.000000 c7: 1234567890.0000000 c8: 1234567890.00000000 c9: 1234567890.000000000 c19: 1234567890.0000000000000000000 c0: -12345679 c1: -12345678.9 c2: -12345678.90 c3: -12345678.901 c4: -12345678.9012 c5: -12345678.90123 c6: -12345678.901235 c7: -12345678.9012346 c8: -12345678.90123460 c9: -12345678.901234600 c19: -12345678.9012346000000000000 c0: 13775320000 c1: 13775320000.0 c2: 13775320000.00 c3: 13775320000.000 c4: 13775320000.0000 c5: 13775320000.00000 c6: 13775320000.000000 c7: 13775320000.0000000 c8: 13775320000.00000000 c9: 13775320000.000000000 c19: 13775320000.0000000000000000000 c0: -53687 c1: -53687.1 c2: -53687.09 c3: -53687.092 c4: -53687.0919 c5: -53687.09185 c6: -53687.091854 c7: -53687.0918543 c8: -53687.09185426 c9: -53687.091854260 c19: -53687.0918542600000000000 c0: 1000 c1: 999.9 c2: 999.90 c3: 999.900 c4: 999.9000 c5: 999.90000 c6: 999.900000 c7: 999.9000000 c8: 999.90000000 c9: 999.900000000 c19: 999.9000000000000000000 Testing numbers between 1 and -1: c0: -10 c1: -10.0 c2: -10.00 c3: -10.000 c4: -10.0000 c5: -10.00000 c6: -10.000000 c7: -10.0000000 c8: -10.00000000 c9: -10.000000000 c19: -10.0000000000000000000 c1: .1 c2: .13 c3: .133 c4: .1333 c5: .13330 c6: .133300 c7: .1333000 c8: .13330000 c9: .133300000 c19: .1333000000000000000 c2: -.02 c3: -.019 c4: -.0192 c5: -.01918 c6: -.019178 c7: -.0191785 c8: -.01917846 c9: -.019178465 c19: -.0191784646962022650 c1: .1 c2: .08 c3: .083 c4: .0833 c5: .08333 c6: .083333 c7: .0833330 c8: .08333300 c9: .083333000 c19: .0833330000000000000 c1: -.1 c2: -.09 c3: -.085 c4: -.0850 c5: -.08500 c6: -.085000 c7: -.0850000 c8: -.08500000 c9: -.085000000 c19: -.0850000000000000060 c1: .1 c2: .09 c3: .085 c4: .0852 c5: .08516 c6: .085165 c7: .0851648 c8: .08516484 c9: .085164835 c19: .0851648351648351680 c1: -.3 c2: -.32 c3: -.316 c4: -.3160 c5: -.31600 c6: -.316000 c7: -.3160000 c8: -.31600000 c9: -.316000000 c19: -.3160000000000000000 c2: .01 c3: .005 c4: .0050 c5: .00500 c6: .005000 c7: .0050000 c8: .00500000 c9: .005000000 c19: .0050000000000000000 c4: -.0002 c5: -.00015 c6: -.000154 c7: -.0001535 c8: -.00015350 c9: -.000153502 c19: -.0001535020000000000 c3: .001 c4: .0008 c5: .00075 c6: .000750 c7: .0007501 c8: .00075013 c9: .000750130 c19: .0007501300000000000 c3: -.001 c4: -.0008 c5: -.00075 c6: -.000754 c7: -.0007540 c8: -.00075400 c9: -.000754001 c19: -.0007540010000000000 c3: .001 c4: .0008 c5: .00075 c6: .000754 c7: .0007540 c8: .00075405 c9: .000754045 c19: .0007540450000000000 c0: -82 c1: -82.0 c2: -82.00 c3: -82.000 c4: -82.0000 c5: -82.00000 c6: -82.000000 c7: -82.0000000 c8: -82.00000000 c9: -82.000000000 c19: -82.0000000000000000000 c4: .0001 c5: .00011 c6: .000112 c7: .0001123 c8: .00011226 c9: .000112255 c19: .0001122550000000000 c3: -.001 c4: -.0012 c5: -.00123 c6: -.001235 c7: -.0012346 c8: -.00123457 c9: -.001234568 c19: -.0012345678900000000 c4: .0001 c5: .00012 c6: .000123 c7: .0001235 c8: .00012346 c9: .000123457 c19: .0001234567890123460 c1: -.1 c2: -.14 c3: -.138 c4: -.1378 c5: -.13775 c6: -.137753 c7: -.1377532 c8: -.13775320 c9: -.137753200 c19: -.1377532000000000000 c1: .1 c2: .05 c3: .054 c4: .0537 c5: .05370 c6: .053697 c7: .0536971 c8: .05369709 c9: .053697092 c19: .0536970918542600000 c3: .001 c4: .0010 c5: .00100 c6: .001000 c7: .0009999 c8: .00099990 c9: .000999900 c19: .0009999000000000000