diff --git a/DESCRIPTION b/DESCRIPTION
index acf84c1..c422b9e 100755
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -2,11 +2,13 @@ Package: teradataR
 Type: Package
 Title: Teradata R Package
 Version: 1.1.0
-Date: 2013-08-01
+Date: 2014-06-29
 Author: Todd Brye <todd.brye@teradata.com>
 Maintainer: Alexander Bessonov <alexander.bessonov@teradata.com>
-Depends: R (>= 2.11.0), RJDBC, RODBC
+Depends: R (>= 2.11.0)
+Suggests: RODBC (>= 1.3-9), RJDBC (>= 0.2-1)
 Description: This package allows you you access a Teradata database using the R language.  It allows programmers familiar with R to analyze Teradata objects a lot like they would access a data frame object.
 License: GPL (>= 2)
 LazyLoad: yes
-Packaged: 2013-08-01 15:36:00 UTC; nonsleepr
+Packaged: 2014-06-29 00:33:50 MSK; nonsleepr
+
diff --git a/R/CEIL.R b/R/CEIL.R
index bd534aa..04aeceb 100755
--- a/R/CEIL.R
+++ b/R/CEIL.R
@@ -7,7 +7,7 @@ CEIL <- function(x) {
     } else if (inherits(x, "td.expression") || inherits(x, "numeric")) 
         val <- paste("CEIL(", x, ")", sep = "") else if (inherits(x, "character")) 
         val <- paste("CEIL('", x, "')", sep = "") else stop("Invalid data type for 'x' in CEIL function")
-    
+
     class(val) <- "td.expression"
     return(val)
 }
diff --git a/R/CHR.R b/R/CHR.R
index d436992..acb15e8 100755
--- a/R/CHR.R
+++ b/R/CHR.R
@@ -11,10 +11,3 @@ CHR <- function(x) {
     class(val) <- "td.expression"
     return(val)
 }
-
-# CHR <- function(x) { if(inherits(x, 'td.data.frame')) { if(length(x) == 1) if(!is.null(attr(x, 'expressions'))) { val
-# <- paste('CHR(', attr(x, 'expressions')[[names(x)]], ')', sep='') class(val) <- 'td.expression' return(val) } else {
-# val <- paste('CHR(\'', names(x), '\')', sep='') class(val) <- 'td.expression' return(val) } else { message('CHR
-# warning: td.data.frame 'x' has length > 1 using first element') val <- paste('CHR(\'', names(x)[1], '\')', sep='')
-# class(val) <- 'td.expression' return(val) } } if(inherits(x, 'numeric') || inherits(x, 'character') ||
-# inherits(x,'td.expression')) { val <- paste('CHR(', x, ')', sep='') class(val) <- 'td.expression' return(val) } } 
diff --git a/R/DECODE.R b/R/DECODE.R
index e52c539..9498adb 100755
--- a/R/DECODE.R
+++ b/R/DECODE.R
@@ -1,30 +1,30 @@
-DECODE <- function(x, ...) {
-    parms <- list(...)
-    for (i in 1:length(parms)) {
-        if (is.character(parms[[i]])) 
-            parms[[i]] <- paste("'", parms[[i]], "'", sep = "")
+DECODE <- function(x, default=NULL, ...) {
+    simplePaste <- function(i) {
+      if(inherits(i, "numeric")) {
+        res <- as.numeric(paste(i))
+      }
+      else {
+        res <- paste("'",i,"'", sep="")
+      }
+      return(res)
     }
-    plist <- paste(parms, collapse = ",")
-    
+    params <- list(...)
+    res <- lapply(params, simplePaste)
+    res <- paste(res, collapse=",")
     if (inherits(x, "td.data.frame")) {
-        if (length(x) > 1) 
+        if (length(x) > 1) {
             message("DECODE warning:  td.data.frame 'x' has length > 1 using first element")
-        
-        val <- paste("DECODE(", .td.gencolumnexpr(x[1]), ",", plist, ")", sep = "")
-    } else if (inherits(x, "td.expression") || inherits(x, "numeric")) 
-        val <- paste("DECODE(", x, ",", plist, ")", sep = "") else if (inherits(x, "character")) 
-        val <- paste("DECODE('", x, "'", ",", plist, ")", sep = "") else stop("Invalid data type for 'x' in DECODE function")
-    
-    class(val) <- "td.expression"
-    return(val)
-}
-
-# DECODE <- function(x, ...) { parms <- list(...)  for(i in 1:length(parms)) { if(is.character(parms[[i]])) parms[[i]]
-# <- paste(''', parms[[i]], ''', sep='') } plist <- paste(parms, collapse=',') if(inherits(x, 'td.data.frame')) {
-# if(length(x) == 1) { if(!is.null(attr(x, 'expressions')) && names(x) %in% names(attr(x,'expressions'))) { val <-
-# paste('DECODE(', attr(x, 'expressions')[[names(x)]], ',', plist, ')', sep='') class(val) <- 'td.expression'
-# return(val) } else { val <- paste('DECODE(\'', names(x), '\',', plist, ')', sep='') class(val) <- 'td.expression'
-# return(val) } } else { message('DECODE warning: td.data.frame 'x' has length > 1 using first element') val <-
-# paste('DECODE(\'', names(x)[1], ',', plist, '\')', sep='') class(val) <- 'td.expression' return(val) } }
-# if(inherits(x, 'character') || inherits(x,'td.expression')) { val <- paste('DECODE(', x, ',', plist, ')', sep='')
-# class(val) <- 'td.expression' return(val) } } 
+        }
+        val <- paste("DECODE(", .td.gencolumnexpr(x[1]), ",", res, ",'", default, "')", sep = "")
+    } 
+   else if (inherits(x, "td.expression") || inherits(x, "numeric")) {
+        val <- paste("DECODE(", x, ",", res, ",'", default, "')", sep = "") 
+   }
+   else if (inherits(x, "character")) {
+        val <- paste("DECODE('", x, "'", ",", res, ",'", default, "')", sep = "") 
+   }    
+   else stop("Invalid data type for 'x' in DECODE function")
+   
+   class(val) <- "td.expression"
+   return(val)
+}
\ No newline at end of file
diff --git a/R/INITCAP.R b/R/INITCAP.R
new file mode 100755
index 0000000..4d4cb6a
--- /dev/null
+++ b/R/INITCAP.R
@@ -0,0 +1,17 @@
+INITCAP <- function(x) {
+  #handles condition in which x is a td data frame  
+  if (inherits(x, "td.data.frame")) {
+        if (length(x) > 1) 
+            message("INITCAP warning:  td.data.frame 'x' has length > 1 using first element")
+        
+        #sets up query expression
+        val <- paste("INITCAP(", .td.gencolumnexpr(x[1]), ")", sep = "")
+   #handles condition in which x is a td expression or numeric 
+   }
+   else if (inherits(x, "td.expression") || inherits(x, "numeric") || inherits(x, "character")) 
+        val <- paste("INITCAP(", x, ")", sep = "") 
+    else stop("Invalid data type for 'x' in INITCAP function")
+    
+    class(val) <- "td.expression"
+    return(val)
+}
\ No newline at end of file
diff --git a/R/INSTR.R b/R/INSTR.R
index 1e61ca6..8ad03fe 100755
--- a/R/INSTR.R
+++ b/R/INSTR.R
@@ -1,4 +1,5 @@
 INSTR <- function(x, y) {
+    # check type of x 
     if (inherits(x, "td.data.frame")) {
         if (length(x) > 1) 
             message("INSTR warning:  td.data.frame 'x' has length > 1 using first element")
@@ -8,6 +9,7 @@ INSTR <- function(x, y) {
         xval <- x else if (inherits(x, "character")) 
         xval <- paste("'", x, "'", sep = "") else stop("Invalid data type for 'x' in INSTR function")
     
+    # check type of y
     if (inherits(y, "td.data.frame")) {
         if (length(y) > 1) 
             message("INSTR warning:  td.data.frame 'y' has length > 1 using first element")
@@ -22,12 +24,4 @@ INSTR <- function(x, y) {
     
     class(val) <- "td.expression"
     return(val)
-}
-
-
-# INSTR <- function(x, search_string=' ') { asTdExpr <- function(x) {class(x) <- 'td.expression'; return(x)} ifmt <-
-# 'INSTR(%s,%s)' if(inherits(x, 'td.data.frame')) { if(length(x) == 1) { if(!is.null(attr(x, 'expressions'))) val <-
-# attr(x, 'expressions')[[names(x)]] else val <- names(x) } else { message('INSTR warning: td.data.frame 'x' has length
-# > 1 using first element') val <- names(x)[1] } return(asTdExpr(gettextf(ifmt, val, search_string))) } if(inherits(x,
-# 'character') || inherits(x,'td.expression')) { return(asTdExpr(paste('INSTR(', x, ',', search_string, ')', sep='')))
-# } } 
+}
\ No newline at end of file
diff --git a/R/INTCAP.R b/R/INTCAP.R
deleted file mode 100755
index 2139d7d..0000000
--- a/R/INTCAP.R
+++ /dev/null
@@ -1,21 +0,0 @@
-INTCAP <- function(x) {
-    if (inherits(x, "td.data.frame")) {
-        if (length(x) > 1) 
-            message("INTCAP warning:  td.data.frame 'x' has length > 1 using first element")
-        
-        val <- paste("INTCAP(", .td.gencolumnexpr(x[1]), ")", sep = "")
-    } else if (inherits(x, "td.expression") || inherits(x, "numeric")) 
-        val <- paste("INTCAP(", x, ")", sep = "") else if (inherits(x, "character")) 
-        val <- paste("INTCAP('", x, "')", sep = "") else stop("Invalid data type for 'x' in INTCAP function")
-    
-    class(val) <- "td.expression"
-    return(val)
-}
-
-
-# INTCAP <- function(x) { asTdExpr <- function(x) {class(x) <- 'td.expression'; return(x)} if(inherits(x,
-# 'td.data.frame')) { if(length(x) == 1) if(!is.null(attr(x, 'expressions'))) return(asTdExpr(paste('INTCAP(', attr(x,
-# 'expressions')[[names(x)]], ')', sep=''))) else return(asTdExpr(paste('INTCAP(\'', names(x), '\')', sep=''))) else
-# { message('INTCAP warning: td.data.frame 'x' has length > 1 using first element') return(asTdExpr(paste('INTCAP(\'',
-# names(x)[1], '\')', sep=''))) } } if(inherits(x, 'character') || inherits(x,'td.expression')) {
-# return(asTdExpr(paste('INTCAP(', x, ')', sep=''))) } } 
diff --git a/R/LPAD.R b/R/LPAD.R
index 9079c0f..f8827b1 100755
--- a/R/LPAD.R
+++ b/R/LPAD.R
@@ -1,10 +1,12 @@
 LPAD <- function(x, ilength, fill_string = " ") {
+    #helper function to make sure input value is of correct type
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
-    lfmt <- "LPAD(%s,%d,%s)"
+    lfmt <- "LPAD(\"%s\",%d,\'%s\')"
+    #handles conditions in which x is a td data frame
     if (inherits(x, "td.data.frame")) {
         if (length(x) == 1) {
             if (!is.null(attr(x, "expressions"))) 
@@ -18,8 +20,8 @@ LPAD <- function(x, ilength, fill_string = " ") {
         return(asTdExpr(gettextf(lfmt, val, ilength, fill_string)))
         
     }
-    
+    #handles conditions in which x is a character or td expression
     if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("LPAD(", x, ",", ilength, ",", fill_string, ")", sep = "")))
+        return(asTdExpr(paste("LPAD(\"", x, "\",", ilength, ",", fill_string, ")", sep = " ")))
     }
 } 
diff --git a/R/LTRIM.R b/R/LTRIM.R
index c10d169..8b60d73 100755
--- a/R/LTRIM.R
+++ b/R/LTRIM.R
@@ -1,11 +1,11 @@
-LTRIM <- function(x, rstring = " ") {
+LTRIM <- function(x) {
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
-    lfmt <- "LTRIM(%s,%s)"
-    if (inherits(x, "td.data.frame")) {
+    lfmt <- "LTRIM(%s)"
+
         if (length(x) == 1) {
             if (!is.null(attr(x, "expressions"))) 
                 val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
@@ -14,12 +14,5 @@ LTRIM <- function(x, rstring = " ") {
             message("LTRIM warning:  td.data.frame 'x' has length > 1 using first element")
             val <- names(x)[1]
         }
-        
-        return(asTdExpr(gettextf(lfmt, val, rstring)))
-        
-    }
-    
-    if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("LTRIM(", x, ",", fill_string, ")", sep = "")))
-    }
-} 
+            return(asTdExpr(gettextf(lfmt, val)))
+}
diff --git a/R/NGRAM.R b/R/NGRAM.R
index 06c4e30..c474ada 100755
--- a/R/NGRAM.R
+++ b/R/NGRAM.R
@@ -1,25 +1,33 @@
-NGRAM <- function(x, second_string, gram_length) {
+NGRAM <- function(x, y, gram_length) {
+    #helper function acts as a setter for class td.expression
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
-    
+    #set up base text
     ofmt <- "NGRAM(%s,%s,%d)"
-    if (inherits(x, "td.data.frame")) {
-        if (length(x) == 1) {
-            if (!is.null(attr(x, "expressions"))) 
-                val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
-            
-        } else {
-            message("NGRAM warning:  td.data.frame 'x' has length > 1 using first element")
-            val <- names(x)[1]
+    #determine datatype of parameters
+    if (inherits(x, "td.data.frame") || inherits(y, "td.data.frame")) {
+        if (length(x) == 1 && length(y) == 1) {
+            if (!is.null(attr(x, "expressions")) && (!is.null(attr(y, "expressions")))) {
+                val1 <- attr(x, "expressions")[[names(x)]] 
+                val2 <- attr(y, "expressions")[[names(y)]]
+            }
+            else {
+                val1 <- names(x)
+                val2 <- names(y)
+            }
         }
-        
-        return(asTdExpr(gettextf(ofmt, val, second_string, gram_length)))
+        else {
+            message("NGRAM warning:  td.data.frame 'x' or 'y' has length > 1 using first element")
+            val1 <- names(x)[1]
+            val2 <- names(y)[1]
+        }
+        return(asTdExpr(gettextf(ofmt, val1, val2, gram_length)))
         
     }
-    
-    if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("NGRAM(", x, ",", second_string, ",", gram_length, ")", sep = "")))
+    #check for other datatypes
+    if (inherits(x, "character") || inherits(x, "td.expression") || inherits(y, "character") || inherits(y, "td.expression")) {
+        return(asTdExpr(paste("NGRAM(", x, ",",y, ",", gram_length, ")", sep = "")))
     }
 } 
diff --git a/R/OREPLACE.R b/R/OREPLACE.R
index 5c40b79..3715c67 100755
--- a/R/OREPLACE.R
+++ b/R/OREPLACE.R
@@ -1,25 +1,35 @@
-OREPLACE <- function(x, search_string, replace_string = " ") {
+OREPLACE <- function(x, search_char, replace_char) {
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
-    rfmt <- "OREPLACE(%s,%s,%s)"
+    rfmt <- "OREPLACE(%s, %s, %s)"
     if (inherits(x, "td.data.frame")) {
-        if (length(x) == 1) {
-            if (!is.null(attr(x, "expressions"))) 
-                val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
-            
-        } else {
-            message("OREPLACE warning:  td.data.frame 'x' has length > 1 using first element")
-            val <- names(x)[1]
+        if (length(x) == 1 || length(y) == 1) {
+            if (!is.null(attr(x, "expressions")) || !is.null(attr(search_char, "expressions")) || !is.null(attr(replace_char, "expressions"))) { 
+                val1 <- attr(x, "expressions")[[names(x)]]
+                val2 <- attr(search_char, "expressions")[[names(search_char)]]
+                val3 <- attr(replace_char, "expressions")[[names(replace_char)]]
+            }
+            else {
+              val1 <- names(x)
+              val2 <- names(search_char)
+              val3 <- names(replace_char)
+            }
+        } 
+        else {
+            message("OREPLACE warning:  td.data.frame 'x' or 'search_string' or 'replace_string' has length > 1 using first element")
+            val1 <- names(x)[1]
+            val2 <- names(search_char)[1]
+            val3 <- names(replace_char)[1]
         }
         
-        return(asTdExpr(gettextf(rfmt, val, search_string, replace_string)))
+        return(asTdExpr(gettextf(rfmt, val1, val2, val3)))
         
     }
     
     if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("OREPLACE(", x, ",", search_string, ",", replace_string, ")", sep = "")))
+        return(asTdExpr(paste("OREPLACE(", val1, ", ", val2, ", ", val3, ")", sep = "")))
     }
 } 
diff --git a/R/OTRANSLATE.R b/R/OTRANSLATE.R
index fa5b372..1210b42 100755
--- a/R/OTRANSLATE.R
+++ b/R/OTRANSLATE.R
@@ -1,25 +1,35 @@
-OTRANSLATE <- function(x, from_string, to_string = " ") {
+OTRANSLATE <- function(x, search_char, replace_char) {
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
     ofmt <- "OTRANSLATE(%s,%s,%s)"
-    if (inherits(x, "td.data.frame")) {
-        if (length(x) == 1) {
-            if (!is.null(attr(x, "expressions"))) 
-                val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
-            
-        } else {
-            message("OTRANSLATE warning:  td.data.frame 'x' has length > 1 using first element")
-            val <- names(x)[1]
+    if (inherits(x, "td.data.frame") && inherits(search_char, "td.data.frame") && inherits(replace_char, "td.data.frame")) {
+        if (length(x) == 1 && length(search_char) == 1 && length(replace_char) == 1) {
+            if (!is.null(attr(x, "expressions")) || !is.null(attr(search_char, "expressions")) || !is.null(attr(replace_char, "expressions"))) {
+                val1 <- attr(x, "expressions")[[names(x)]] 
+                val2 <- attr(search_char, "expressions")[[names(search_char)]]
+                val3 <- attr(replace_char, "expressions")[[names(replace_char)]]
+            }
+            else {
+              val1 <- names(x)
+              val2 <- names(search_char)
+              val3 <- names(replace_char)
+          } 
         }
-        
-        return(asTdExpr(gettextf(ofmt, val, from_string, to_string)))
-        
     }
+    else {
+      message("OTRANSLATE warning:  td.data.frame 'x' or 'search_char' or 'replace_char' has length > 1 using first element")
+      val1 <- names(x)[1]
+      val2 <- names(search_char)[1]
+      val3 <- names(replace_char)[1]
+    }
+
+        return(asTdExpr(gettextf(ofmt, val1, val2, val3)))
     
-    if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("OTRANSLATE(", x, ",", from_string, ",", to_string, ")", sep = "")))
+    if (inherits(x, "character") || inherits(x, "td.expression") || inherits(search_char, "character") ||
+        inherits(search_char,"td.expression") || inherits(replace_char, "character") || inherits(replace_char, "td.expression")) {
+        return(asTdExpr(paste("OTRANSLATE(", x, ",", search_char, ",", replace_char, ")", sep = "")))
     }
 } 
diff --git a/R/POWER.R b/R/POWER.R
index 861c888..2cdbc28 100755
--- a/R/POWER.R
+++ b/R/POWER.R
@@ -4,22 +4,33 @@ POWER <- function(x, exponent = 1) {
         return(x)
     }
     
-    pfmt <- "POWER(CAST(%s AS FLOAT),%d)"
+    pfmt <- "POWER(%s, %s)"
     if (inherits(x, "td.data.frame")) {
-        if (length(x) == 1) {
-            if (!is.null(attr(x, "expressions"))) 
-                val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
-            
-        } else {
-            message("POWER warning:  td.data.frame 'x' has length > 1 using first element")
-            val <- names(x)[1]
+        if (length(x) == 1 || length(exponent) == 1) {
+            if (!is.null(attr(x, "expressions"))) {
+                val1 <- attr(x, "expressions")[[names(x)]]
+            }
+            else {
+                val1 <- names(x)
+            }
+            if (!is.null(attr(exponent, "expressions"))) {
+                val2 <- attr(exponent, "expressions")[[names(exponent)]]
+            }
+            else {
+              val2 <- names(exponent)
+            }
+        }
+        else {
+            message("POWER warning:  td.data.frame 'x' or 'exponent' has length > 1 using first element")
+            val1 <- names(x)[1]
+            val2 <- names(exponent)[1]
         }
         
-        return(asTdExpr(gettextf(pfmt, val, exponent)))
+        return(asTdExpr(gettextf(pfmt, val1, val2)))
         
     }
     
     if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("POWER(CAST(", x, " AS FLOAT),", exponent, ")", sep = "")))
+        return(asTdExpr(paste("POWER(", x, exponent, ")", sep = "")))
     }
 } 
diff --git a/R/RPAD.R b/R/RPAD.R
index e63d32a..3fc2fd6 100755
--- a/R/RPAD.R
+++ b/R/RPAD.R
@@ -4,7 +4,7 @@ RPAD <- function(x, ilength, fill_string = " ") {
         return(x)
     }
     
-    rfmt <- "RPAD(%s,%d,%s)"
+    rfmt <- "RPAD(\"%s\",%d,\'%s\')"
     if (inherits(x, "td.data.frame")) {
         if (length(x) == 1) {
             if (!is.null(attr(x, "expressions"))) 
@@ -20,6 +20,6 @@ RPAD <- function(x, ilength, fill_string = " ") {
     }
     
     if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("RPAD(", x, ",", ilength, ",", fill_string, ")", sep = "")))
+        return(asTdExpr(paste("RPAD(\"", x, "\",", ilength, ",", fill_string, ")", sep = "")))
     }
 } 
diff --git a/R/RTRIM.R b/R/RTRIM.R
index 5181c67..fe96314 100755
--- a/R/RTRIM.R
+++ b/R/RTRIM.R
@@ -1,10 +1,10 @@
-RTRIM <- function(x, rstring = " ") {
+RTRIM <- function(x) {
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
-    rfmt <- "RTRIM(%s,%s)"
+    rfmt <- "RTRIM(%s)"
     if (inherits(x, "td.data.frame")) {
         if (length(x) == 1) {
             if (!is.null(attr(x, "expressions"))) 
@@ -15,11 +15,6 @@ RTRIM <- function(x, rstring = " ") {
             val <- names(x)[1]
         }
         
-        return(asTdExpr(gettextf(rfmt, val, rstring)))
-        
-    }
-    
-    if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("RTRIM(", x, ",", fill_string, ")", sep = "")))
-    }
-} 
+        return(asTdExpr(gettextf(rfmt, val)))
+  } 
+}
\ No newline at end of file
diff --git a/R/TO_CHAR.R b/R/TO_CHAR.R
index 4e583e3..9acf2ce 100755
--- a/R/TO_CHAR.R
+++ b/R/TO_CHAR.R
@@ -1,25 +1,36 @@
-TO_CHAR <- function(x, format = " ") {
+TO_CHAR <- function(x, format) {
     asTdExpr <- function(x) {
         class(x) <- "td.expression"
         return(x)
     }
     
-    tfmt <- "TO_CHAR(%s,%s)"
-    if (inherits(x, "td.data.frame")) {
-        if (length(x) == 1) {
-            if (!is.null(attr(x, "expressions"))) 
-                val <- attr(x, "expressions")[[names(x)]] else val <- names(x)
-            
-        } else {
-            message("TO_CHAR warning:  td.data.frame 'x' has length > 1 using first element")
-            val <- names(x)[1]
+    tfmt <- "TO_CHAR(%s, %s)"
+    if (inherits(x, "td.data.frame") || inherits(format, "td.data.frame")) {
+        if (length(x) == 1 || length(format) == 1) {
+            if (!is.null(attr(x, "expressions"))) {
+                val1 <- attr(x, "expressions")[[names(x)]] 
+            }
+            else {
+                val1 <- names(x)
+            }
+            if (!is.null(attr(format, "expressions"))) {
+                val2 <- attr(format, "expressions")[[names(format)]]
+            }
+            else {
+              val2 <- names(format)
+            }
+        } 
+        else {
+            message("TO_CHAR warning:  td.data.frame 'x' or 'format' has length > 1 using first element")
+            val1 <- names(x)[1]
+            val2 <- names(format)[1]
         }
         
-        return(asTdExpr(gettextf(tfmt, val, format)))
+        return(asTdExpr(gettextf(tfmt, val1, val2)))
         
     }
     
     if (inherits(x, "character") || inherits(x, "td.expression")) {
-        return(asTdExpr(paste("TO_CHAR(", x, ",", format, ")", sep = "")))
+        return(asTdExpr(paste("TO_CHAR(", x, format, ")", sep = "")))
     }
 } 
diff --git a/R/as.td.data.frame.R b/R/as.td.data.frame.R
index 8d18d24..ef78b80 100755
--- a/R/as.td.data.frame.R
+++ b/R/as.td.data.frame.R
@@ -1,5 +1,5 @@
 as.td.data.frame <- function(x, ...) {
-    if (inherits(x, "td.data.frame")) {
+  if (inherits(x, "td.data.frame")) {
         args <- list(...)
         if (is.null(args[["tableName"]])) 
             tbl <- deparse(substitute(x)) else tbl <- args[["tableName"]]
@@ -13,6 +13,7 @@ as.td.data.frame <- function(x, ...) {
         query <- gettextf("CREATE TABLE %s AS (%s) WITH DATA", oObj, selectText)
         df <- try(tdQueryUpdate(query))
         if (length(df) == 1L && df == "No Data") 
+            
             return(td.data.frame(tbl, oDatabase)) else stop(gettextf("Error: %s", paste(df, collapse = "")))
     }
     if (inherits(x, "data.frame")) {
diff --git a/R/on.R b/R/on.R
new file mode 100755
index 0000000..79e2a28
--- /dev/null
+++ b/R/on.R
@@ -0,0 +1,41 @@
+on <- function(target=NULL, from=NULL, subQuery=NULL, partition=NULL, hash=NULL, order=NULL, local_order=NULL, null_order=NULL, dimension=NULL, as=NULL) {
+    if(!is.null(subQuery)) {
+      baseText <- paste("on %s%s%s%s", subQuery, "%s")
+    }
+    else {
+      baseText <- "on %s%s%s%s%s"
+    }
+    if (grepl("select", target)) {
+       if(!is.null(from)) {
+        returnString <- gettextf(baseText, "(", target," from ", from,  ")")
+       }
+       else {
+         returnString <- gettextf(baseText, "(", target, ")", "", "")
+       }
+    }
+    else {
+      returnString <- gettextf(baseText, target, "", "", "", "","")
+    }
+    
+    if(!is.null(as)) {
+      returnString <- paste(returnString, .td.makeAs(as), sep="\n")
+    }
+    if (!is.null(partition)) {
+      returnString <- paste( returnString, .td.makePartition(partition), sep = "\n")
+    }
+    if (!is.null(hash)) {
+      returnString <- paste(returnString, .td.makeHash(hash), sep="\n")
+    }
+    if (!is.null(order)) {
+      returnString <- paste(returnString, .td.makeOrder(order), sep="\n")
+    }
+
+    if (!is.null(local_order)) {
+      returnString <- paste(returnString, .td.makeLocalOrder(null_order, local_order), sep="\n")
+    }
+    if (!is.null(dimension)) {
+      returnString <- paste(returnString, .td.makeDimension(), sep="\n")
+    }
+    returnString <- gsub(";", "", returnString)   
+    return(returnString)
+}
diff --git a/R/td.CalcMatrix.R b/R/td.CalcMatrix.R
new file mode 100755
index 0000000..c242036
--- /dev/null
+++ b/R/td.CalcMatrix.R
@@ -0,0 +1,10 @@
+td.CalcMatrix <- function(selectPhrase=string, ons=string, phase=NULL, calctype=NULL, output=NULL, null_handling=NULL, optional_operators=NULL, as=NULL) {
+
+  ons <- unlist(ons)
+  ons <- paste(ons, sep="", collapse="\n")
+  using <- .td.usingClause(phase=phase, calctype=calctype, output=output, null_handling=null_handling)
+  queryText <- paste(selectPhrase, "(\n", ons, using, ") ", optional_operators, " as ", as, ";")
+    
+  print(queryText)
+  return(queryText)
+}
diff --git a/R/td.ExecR.R b/R/td.ExecR.R
new file mode 100755
index 0000000..3671ea7
--- /dev/null
+++ b/R/td.ExecR.R
@@ -0,0 +1,10 @@
+td.ExecR <- function(selectPhrase=string, ons=list(), returns=NULL, contract=NULL, operator=string, optional_operators=NULL) {
+  ons<- unlist(ons)
+  ons <- paste(ons, sep="", collapse="\n")
+  using <- .td.usingClause(returns=returns, contract=contract, operator=operator)
+  queryText <- paste(selectPhrase, "(\n", ons, using, ") ", optional_operators, ") as db;")
+  print(queryText)
+
+  return(queryText)
+
+}
\ No newline at end of file
diff --git a/R/td.data.frame.R b/R/td.data.frame.R
index 1e23908..19a7d1d 100755
--- a/R/td.data.frame.R
+++ b/R/td.data.frame.R
@@ -4,7 +4,7 @@ td.data.frame <- function(table, database = "") {
     query <- gettextf("SELECT * FROM %s SAMPLE 0", obj)
     res <- try(tdQuery(query))
     if (is.null(attr(res, "class"))) {
-        res <- data.frame()
+        res <- data.frame(stringsAsFactors = FALSE)
         attr(res, "totalRows") <- 0
         warning("Teradata table not found.  Result is empty data frame.")
     } else {
diff --git a/R/td.kmeans.R b/R/td.kmeans.R
index 345f630..d49ab3f 100755
--- a/R/td.kmeans.R
+++ b/R/td.kmeans.R
@@ -16,7 +16,7 @@ td.kmeans <- function(x, centers, iter.max = 10, nstart = 1) {
     nms <- paste(gettextf("\"%s\"", names(x)), collapse = ",")
     maxD <- 0
     for (i in 1:nstart) {
-        testClusters <- tdQuery(gettextf("SELECT %s FROM %s %s SAMPLE %d", nms, obj, wc, centers))
+        testClusters <- tdQuery(gettextf("SELECT DISTINCT %s FROM %s %s SAMPLE %d", nms, obj, wc, centers))
         curD <- 0
         for (j in 1:centers - 1) {
             for (k in (j + 1):centers) curD <- curD + sum(dist(testClusters[c(j, k), ]))
diff --git a/R/tdQuery.R b/R/tdQuery.R
index 1f2d594..eba0a7b 100755
--- a/R/tdQuery.R
+++ b/R/tdQuery.R
@@ -1,6 +1,6 @@
 tdQuery <- function(q, ...) {
     if (class(tdConnection) == "RODBC") 
-        return(sqlQuery(tdConnection, q, ...))
+        return(sqlQuery(tdConnection, q, stringsAsFactors=FALSE, ...))
     if (class(tdConnection) == "JDBCConnection") 
         return(dbGetQuery(tdConnection, q, ...))
 }
diff --git a/R/teradataR-internal.R b/R/teradataR-internal.R
index 02e9e17..cdfd08a 100755
--- a/R/teradataR-internal.R
+++ b/R/teradataR-internal.R
@@ -884,3 +884,46 @@
     
     return(query)
 } 
+
+.td.makeHash <- function(...) {
+  baseText = "hash by %s"
+  dependents = paste(...)
+  return(gettextf(baseText, dependents))
+}
+
+.td.makePartition <- function(...) {
+  baseText = "partition by %s"
+  dependents = paste(...)
+  return(gettextf(baseText, dependents))
+} 
+
+.td.makeOrder <- function(...) {
+  baseText = "order by %s"
+  dependents = paste(...)                       
+  return(gettextf(baseText, dependents))
+}                       
+
+.td.makeLocalOrder <- function(null_order=NULL, local_order=NULL, ...) {
+  baseText = "local order by %s"
+  if (!is.null(nullOrder)) {
+    specialValue = paste(nullOrder)
+    orderByList = paste(...)
+    dependents = paste(orderByList, specialValue)
+    return(gettextf(baseText, dependents))
+  }
+  else {
+    dependents = paste(...)
+    return(gettextf(baseText, dependents))
+  }
+}                           
+
+.td.makeDimension <- function() {
+  baseText = "dimension"
+  return(baseText)
+}
+
+.td.makeAs <- function(...) {
+  baseText = "as %s"
+  dependents = paste(...)
+  return(gettextf(baseText, dependents))
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 8669b92..e0be237 100644
--- a/README.md
+++ b/README.md
@@ -4,3 +4,20 @@ teradataR
 R package to perform in-database analytics using Teradata database.
 
 Compatible with both R version 2 and 3.
+
+Prebuilt package could be found [here](https://github.com/Teradata/teradataR/raw/master/build/teradataR_1.1.0.tar.gz).
+
+## Dependencies
+
++ RJDBC
+ + rJava
++ RODBC
+
+## Installation
+
+To install the package, issue the following command from R REPL:
+
+    install.packages("C:\\Documents and Settings\\User\\My Documents\\Downloads\\teradataR_1.1.0.tar.gz", repos=NULL,type="source");
+
+Where first argument is the path to the package file.
+
diff --git a/build/teradataR_1.1.0.tar.gz b/build/teradataR_1.1.0.tar.gz
index 6fea732..3296158 100644
Binary files a/build/teradataR_1.1.0.tar.gz and b/build/teradataR_1.1.0.tar.gz differ
diff --git a/man/INITCAP.Rd b/man/INITCAP.Rd
new file mode 100644
index 0000000..1b4f258
--- /dev/null
+++ b/man/INITCAP.Rd
@@ -0,0 +1,46 @@
+\name{INITCAP}
+\alias{INITCAP}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper Function INITCAP
+}
+\description{
+Makes a wrapper around the fastpath function INITCAP
+}
+\usage{
+INITCAP(x)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x}{
+a teradata dataframe that contains columns of characters that will be capitalized
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A teradata data frame of the columns that have their first letters capitalized
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Todd Brye, Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+tdf["col2"] <- INITCAP(tdf["col1"]) 
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/LPAD.Rd b/man/LPAD.Rd
new file mode 100644
index 0000000..b667f1d
--- /dev/null
+++ b/man/LPAD.Rd
@@ -0,0 +1,51 @@
+\name{LPAD}
+\alias{LPAD}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper Function LPAD
+}
+Makes a wrapper around the fastpath function LPAD
+}
+\usage{
+LPAD(x, ilength, fill_string = " ")
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x}{
+a teradata dataframe that contains column(s) of characters that will be padded
+}
+  \item{ilength} {
+the amount of padding to append to the beginning of the character  
+}
+  \item{fill_string} {
+the character used to pad the the column(s) of characters that are passed into the function.  Default character is the empty character
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A teradata data frame of the columns that have been padded at the beginning
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Todd Brye, Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+tdf["col2"] <- LPAD(tdf["col1", 15, " "]) 
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/LTRIM.Rd b/man/LTRIM.Rd
new file mode 100644
index 0000000..745915a
--- /dev/null
+++ b/man/LTRIM.Rd
@@ -0,0 +1,47 @@
+\name{LTRIM}
+\alias{LTRIM}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper Function LTRIM
+}
+\description{
+Makes a wrapper around the fastpath function LTRIM
+}
+\usage{
+LTRIM(x)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x}{
+a teradata dataframe that contains column(s) of characters whose padding to their left will be trimmed
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A teradata data frame of the columns that will be trimmed at the beginning of each character
+%% ...
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Todd Brye, Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+tdf["col2"] <- LTRIM(tdf["col1"]) 
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/RPAD.Rd b/man/RPAD.Rd
new file mode 100644
index 0000000..9d1e621
--- /dev/null
+++ b/man/RPAD.Rd
@@ -0,0 +1,52 @@
+\name{RPAD}
+\alias{RPAD}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper Function RPAD
+}
+\description{
+Makes a wrapper around the fastpath function RPAD
+}
+\usage{
+RPAD(x, ilength, fill_string = " ")
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x}{
+a teradata dataframe that contains column(s) of characters that will be padded
+}
+  \item{ilength} {
+the amount of padding to append to the beginning of the character  
+}
+  \item{fill_string} {
+the character used to pad the the column(s) of characters that are passed into the function.  Default character is the empty character
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A teradata data frame of the columns that will be padded at the beginning of each character
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Todd Brye, Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+tdf["col2"] <- RPAD(tdf["col1", 15, " "]) 
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/RTRIM.Rd b/man/RTRIM.Rd
new file mode 100644
index 0000000..9bffe06
--- /dev/null
+++ b/man/RTRIM.Rd
@@ -0,0 +1,46 @@
+\name{RTRIM}
+\alias{RTRIM}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper Function RTRIM
+}
+\description{
+Makes a wrapper around the fastpath function RTRIM
+}
+\usage{
+RTRIM(x)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{x}{
+a teradata dataframe that contains column(s) of characters whose padding to their right will be trimmed
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A teradata data frame of the columns that will be trimmed at the end of each character
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Todd Brye, Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+tdf["col2"] <- RTRIM(tdf["col1"]) 
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/on.Rd b/man/on.Rd
new file mode 100644
index 0000000..9169d12
--- /dev/null
+++ b/man/on.Rd
@@ -0,0 +1,73 @@
+\name{on}
+\alias{on}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+On Function
+}
+\description{
+Creates A representation of an ON Clause in an ExecR Table Operator query.
+}
+\usage{
+on(target=NULL, from=NULL, subQuery=NULL, partition=NULL, hash=NULL, order=NULL, local_order=NULL, null_order=NULL, dimension=NULL, as=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{target}{
+a character that represents a name of a table or a query expression
+}
+  \item{from} {
+a character that represents a name of the origin of a query expression
+}
+  \item{subQuery}{
+a character that represents a nested ON Clause or nested query expression that is part of an ON Clause
+}
+  \item{partition} {
+the parallel option, partition by <column>, or partition by <any>  
+}
+ \item{hash} {
+the parallel option, hash by <column>
+}
+  \item{order}{
+the parallel option, order by <column> 
+}
+  \item{local_order}{
+the parallel option, local order by <column>
+}
+  \item{null_order}{
+specification for the parallel option local_order 
+}
+  \item{dimension} {
+the parallel option, dimension 
+}
+  \item{as} {
+creates and alias    
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+a string representation of an ON Clause for a table operator
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+o <- on(target="select *" from="tab1", partition="any")
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/td.CalcMatrix.Rd b/man/td.CalcMatrix.Rd
new file mode 100644
index 0000000..c576da5
--- /dev/null
+++ b/man/td.CalcMatrix.Rd
@@ -0,0 +1,70 @@
+\name{td.CalcMatrix}
+\alias{td.CalcMatrix}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+Wrapper function for CalcMatrix
+}
+\description{
+Creates A wrapper around the CalcMatrix table operator, using R Code.
+}
+\usage{
+td.CalcMatrix(selectPhrase=string, ons=string, phase=NULL, calctype=NULL, output=NULL, null_handling=NULL, optional_operators=NULL, as=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{selectPhrase}{
+ a character that represents the select clause for a query expression
+}
+  \item{ons} {
+a character or list representation of the needed ON Clauses 
+}
+  \item{phase} {
+the character representation of the input of the optional PHASE clause  
+}
+  \item{calctype} {
+the character representation of the input of the optional CALCTYPE clause  
+}
+  \item{output} {
+the character representation of the input of the optional OUTPUT clause  
+}
+  \item{null_handling} {
+the character representation of the input of the optional specfication for null handling  
+}
+  \item{optional_operators} {
+the character representation of the other operators that can be specified  
+}
+  \item{as} {
+creates and alias  
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+a character representation of a query that can be passed into TdQuery to use the CalcMatrix table operator.
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+%% ~~objects to See Also as \code{\link{help}}, ~~~
+}
+\examples{
+on2 <- on(target= "select * from tab1") 
+query <- td.CalcMatrix(selectPhrase="select session as ampkey, D1.* from TD_SYSFNLIB.calcmatrix", ons=on1, phase="LOCAL", as="D1")
+res <- tdQuery(query)
+print(res)
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/man/td.ExecR.Rd b/man/td.ExecR.Rd
new file mode 100644
index 0000000..eeecd93
--- /dev/null
+++ b/man/td.ExecR.Rd
@@ -0,0 +1,64 @@
+\name{td.ExecR}
+\alias{td.ExecR}
+%- Also NEED an '\alias' for EACH other topic documented here.
+\title{
+ExecR Wrapper Function
+}
+\description{
+This function is a wrapper function around the table operator ExecR.  It generates a string that can be passed into the function tdQuery to make a query that uses ExecR.
+}
+\usage{
+td.ExecR(selectPhrase=string, ons=list(), returns=NULL, contract=NULL, operator=string, optional_operators=NULL)
+}
+%- maybe also 'usage' for other objects documented here.
+\arguments{
+  \item{selectPhrase}{
+a character that represents a select phrase
+}
+  \item{ons} {
+a list or character representation of on clauses 
+}
+  \item{returns} {
+a file or character representation of a returns clause  
+}
+  \item{contract} {
+a file or character representation of a contract clause  
+}
+  \item{operator} {
+a file or character representation of an operator clause 
+}
+  \item{optional_operators} {
+a character representation of any other needed operators 
+}
+}
+\details{
+%%  ~~ If necessary, more details than the description above ~~
+}
+\value{
+A character representation of a query that will use the ExecR table operator when passed into the tdQuery function.
+}
+\references{
+%% ~put references to the literature/web site here ~
+}
+\author{
+Erin Cole
+}
+\note{
+%%  ~~further notes~~
+}
+
+%% ~Make other sections like Warning with \section{Warning }{....} ~
+
+\seealso{
+\code{\link{on}}
+}
+\examples{
+on1 <- on(target="select *", from="tab1", hash="c1", local_order="c2")
+query <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=on1, contract="~/Documents/contract.txt", operator="~/Documents/operator.txt")
+res <- tdQuery(query)
+print(res)
+}
+% Add one or more standard keywords, see file 'KEYWORDS' in the
+% R documentation directory.
+\keyword{ ~kwd1 }% use one of  RShowDoc("KEYWORDS")
+\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line
diff --git a/test/.DS_Store b/test/.DS_Store
new file mode 100644
index 0000000..abba6a8
Binary files /dev/null and b/test/.DS_Store differ
diff --git a/test/basicContract.txt b/test/basicContract.txt
new file mode 100755
index 0000000..3fd0f1c
--- /dev/null
+++ b/test/basicContract.txt
@@ -0,0 +1 @@
+library(tdr);
\ No newline at end of file
diff --git a/test/basicOperator.txt b/test/basicOperator.txt
new file mode 100755
index 0000000..3fd0f1c
--- /dev/null
+++ b/test/basicOperator.txt
@@ -0,0 +1 @@
+library(tdr);
\ No newline at end of file
diff --git a/test/setup.R b/test/setup.R
new file mode 100644
index 0000000..a29e594
--- /dev/null
+++ b/test/setup.R
@@ -0,0 +1,106 @@
+# Although this file is an R file, for the sake of consistency with the other
+# files, the code is in SQL.  It is all commented out so that the file does not
+# produce compile errors.  Please copy and past the desired code into bteq in 
+# order to make the needed tables
+
+# Table Name: numTab
+# This table is used for testing numeric functions.  It works with the tests for
+# AVG(), DECODE(), POWER(), and TO_CHAR().
+# 
+# drop table numTab;
+# drop table numTab2;
+# create table numTab (
+# c1 integer,
+# c2 integer,
+# c3 character(1));
+#
+# insert into numTab (c1, c2, c3) values (5, 2, '9');
+# insert into numTab (c1, c2, c3) values (8, 3, '9');
+# insert into numTab (c1, c2, c3) values (2, 4, '9');
+# insert into numTab (c1, c2, c3) values (6, 3, '9');
+# insert into numTab (c1, c2, c3) values (3, 2, '9');
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Table Name: negNums
+# This table is used for testing the SIGN() function
+#
+# drop table negNums;
+# drop table negNums2;
+# create table negNums (
+# c1 integer);
+#
+# insert into negNums values(-11);
+# insert into negNums values(3);
+# insert into negNums values(-2);
+# insert into negNums values(4);
+# insert into negNums values(555);
+# insert into negNums values(0);
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Table Name: test
+# This table is used for testing functions for character manipulation.  It 
+# works with the tests for CHR(), INITCAP(), and NGRAM().
+#
+# drop table test;
+# drop table test2;
+# create table test (
+# c1 integer,
+# c2 varchar(100),
+# c3 varchar(100));
+#
+# insert into test (c1, c2, c3) values (1, 'mouse', 'house');
+# insert into test (c1, c2, c3) values (2, 'fork', 'spoon');
+# insert into test (c1, c2, c3) values (3, 'ball', 'bat');
+# insert into test (c1, c2, c3) values (4, 'robot', 'human');
+# insert into test (c1, c2, c3) values (5, 'cat', 'dog');
+# insert into test (c1, c2, c3) values (6, 'horse', 'force');
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Table Name: charTab
+# This table is used for testing functions that search characters under 
+# certain conditions.  It works with tests for INSTR(), OREPLACE(), OTRANSLATE().
+# 
+# drop table charTab;
+# drop table charTab2;
+# create table charTab (
+# c1 varchar(50),
+# c2 varchar(50),
+# c3 varchar(50),
+# c4 varchar(50),
+# c5 varchar(50));
+#
+# insert into charTab (c1, c2, c3, c4, c5) values ('explore', 'lo', 'xx', 'e', 'z');
+# insert into charTab (c1, c2, c3, c4, c5) values ('interrupt', 'ter', 'xyz', 'u', 'z');
+# insert into charTab (c1, c2, c3, c4, c5) values ('disappear', 'ar', 'yy', 's', 'z');
+# insert into charTab (c1, c2, c3, c4, c5) values ('factor', 'ac', 'xy', 'c', 'z');
+# insert into charTab (c1, c2, c3, c4, c5) values ('appreciate', 'pp', 'xx', 'r', 'z');
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Table Name: padTab
+# This table is used for testing functions that manipulate white space.  It
+# works with tests for LPAD(), LTRIM(), RPAD(), and RTRIM().
+# 
+# drop table padTab;
+# drop table padTab2;
+# create table padTab (
+# c1 varchar(10),
+# c2 varchar(10),
+# c3 varchar(10));
+#
+# insert into padTab (c1, c2, c3) values ('Emily      ','     Emily', 'Emily');
+# insert into padTab (c1, c2, c3) values ('Daisy      ', '     Daisy', 'Daisy');
+# insert into padTab (c1, c2, c3) values ('Hank       ', '      Hank', 'Hank');
+# insert into padTab (c1, c2, c3) values ('Amy        ', '       Amy', 'Amy');
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# Table Name: numManip
+# This table is used for testing functions that manupulate numbers.  It works 
+# with tests for TO_NUMBER() and TRUNC().
+#
+#
+# drop table numManip;
+# drop table numManip2;
+# create table numManip (
+# c1 character(5),
+# c2 number);
+#
+# insert into numManip (c1, c2) values ('1', 555.3);
+# insert into numManip (c1, c2) values ('2', 8.289);
+# insert into numManip (c1, c2) values ('3', 48.1);
+# insert into numManip (c1, c2) values ('4', 17.06);
+# insert into numManip (c1, c2) values ('5', 13.99);
\ No newline at end of file
diff --git a/test/testCHR.R b/test/testCHR.R
new file mode 100644
index 0000000..7e2a445
--- /dev/null
+++ b/test/testCHR.R
@@ -0,0 +1,25 @@
+# Below is the table used for the test, called "test"
+#        c1         c2          c3        
+# ---------- ----------- ----------
+#         5          cat        dog
+#         4        robot      human
+#         6        horse      force
+#         3         ball        bat
+#         1        mouse      house
+#         2         fork      spoon
+tdf <- td.data.frame("test")
+tdf["c4"] <- CHR(tdf["c1"])
+as.td.data.frame(tdf, tableName="test2")
+
+# the resulting table is below, called "test2"
+#        c1         c2          c3         c4    
+# ---------- ----------- ---------- ---------
+#         5          cat        dog       
+#         4        robot      human
+#         6        horse      force
+#         3         ball        bat
+#         1        mouse      house
+#         2         fork      spoon
+
+#Although the resulting table does not seem to give the expected output, the same output occurs in bteq and in RStudio.
+#Further testing is recommended
\ No newline at end of file
diff --git a/test/testCalcMatrix.R b/test/testCalcMatrix.R
new file mode 100755
index 0000000..465deea
--- /dev/null
+++ b/test/testCalcMatrix.R
@@ -0,0 +1,66 @@
+#on1 <- on(target="select var1, var2, var3, var4, var5", from="testCM")
+#res1 <- td.CalcMatrix(selectPhrase='select * from TD_SYSFNLIB.calcmatrix', ons=on1, phase="local", as= "D1")
+#query1 <- tdQuery(res1)
+#print(query1)
+
+#on2 <- on(target= "select * from numbers") 
+#res2 <- td.CalcMatrix(selectPhrase="select session as ampkey, D1.* from TD_SYSFNLIB.calcmatrix", ons=on2, phase="LOCAL", as="D1")
+#query2 <- tdQuery(res2)
+#print(query2)
+
+#on3 <- on(target="select var1, var2, var3, var4, var5 from TestCM2")
+#res4 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on3, phase="local", as="D1")
+#query4 <- tdQuery(res4)
+#print(query4)
+
+#on4 <- on(target ="select * from TestCMLocal", hash="p")
+#res5 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on4, phase="combine", calctype="sscp", output="columns", as="D1")
+#query5 <- tdQuery(res5)
+#print(query5)
+
+#on5 <- on(target ="select * from TestCMLocal", hash="p")
+#res6 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on5, phase="combine", calctype="CSSCP", output="columns", as="D1")
+#query6 <- tdQuery(res6)
+#print(query6)
+
+#on6 <-on(target="select * from TestCMLocal", hash="p")
+#res7 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on6, phase="combine", calctype="COV", output="columns", as="D1")
+#query7 <- tdQuery(res7)
+#print(query7)
+
+#on7 <- on(target="select * from TestCMLocal", hash="p")
+#res8 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on7, phase="combine", calctype="COR", output="varbyte", as="D1")
+#query8 <- tdQuery(res8)
+#print(query8)
+
+#on8 <- on(target="select * from TestCMLocal", hash="p")
+#res9 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on8, phase="combine", calctype="SSCP", output="varbyte", as="D1")
+#query9 <- tdQuery(res9)
+#print(query9)
+
+#on9 <- on(target="select var1, var2, var3, var4, var5 from TestCMNull")
+#res10 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on9, phase="local", null_handling="ignore", as="D1")
+#query10 <- tdQuery(res10)
+#print(query10)
+
+#on10 <- on(target="select var1, var2, var3, var4, var5", from="TestCMNull")
+#res11 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on10, phase="local", null_handling="zero", as="D1")
+#query11 <- tdQuery(res11)
+#print(query11)
+
+#on11 <- on(target="select p, var1, var2, var3, var4, var5 from TestCM_Mult", local_order="p")
+#res12 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on11, phase="local", as="D1")
+#query12 <- tdQuery(res12)
+#print(query12)
+
+#on12 <- on(target="select p, var1, var2, var3, var4, var5 from TestCM_Mult", local_order="p")
+#res13 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on12, phase="local", as="D1")
+#query13 <- tdQuery(res13)
+#print(query13)
+
+#on14 <- on(target="select p, var1, var2, var3, var4,var5", from="TESTCM_Mult", local_order = "p")
+#sub1 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on14, phase="local", as="D1")
+#on15 <- on(target=sub1, hash="p", local_order="p")
+#res14 <- td.CalcMatrix(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on15, phase="combine", calctype="esscp", as="D2")
+#query14 <- tdQuery(res14)
+#print(query14)
diff --git a/test/testDECODE.R b/test/testDECODE.R
new file mode 100644
index 0000000..ecca1f6
--- /dev/null
+++ b/test/testDECODE.R
@@ -0,0 +1,38 @@
+# Below is the table used for the test, called "numTab"
+#
+# c1                    c2  c3
+# -----------  -----------  --
+# 5                     2   9
+# 6                     3   9
+# 3                     2   9
+# 8                     3   9
+# 2                     4   9
+
+tdf <- td.data.frame("numTab")
+tdf["c4"] <- DECODE(tdf["c1"], default='none', 1, 'Alpha', 2, 'Bravo', 3, 'Charlie', 4, 'Delta', 5, 'Echo')
+as.td.data.frame(tdf, tableName="numTab2")
+
+# This is the resulting table, called "numTab2"
+# c1           c2           c3  c4
+# -----------  -----------  --  -------
+# 5            2            9   Echo
+# 6            3            9   none
+# 3            2            9   Charlie
+# 8            3            9   none
+# 2            4            9   Bravo
+
+# To verify each entry of c4:
+res1 = tdQuery("select c4 from numTab2 where c1=5") == "Echo"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from numTab2 where c1=6") == "none"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from numTab2 where c1=3") == "Charlie"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from numTab2 where c1=8") == "none"
+stopifnot(res4)
+
+res5 = tdQuery("select c4 from numTab2 where c1=2") == "Bravo"
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testExecR.R b/test/testExecR.R
new file mode 100755
index 0000000..ffedda6
--- /dev/null
+++ b/test/testExecR.R
@@ -0,0 +1,75 @@
+source("~/Documents/RRR/Code/ExecR.R")
+
+#on1 <- on(target= "select * from test", hash="c1", local_order="c2")
+#onList <- list(on1)
+#res1 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=onList, contract="~/Documents/RRR/contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query1 <- tdQuery(res1)
+#print(query1)
+
+#on2 <- on(target="test", dimension="")
+#onList2 <-list( on3)
+#print(onList2)
+#res2 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=onList2, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query2 <- tdQuery(res2)
+#print(query2)
+
+#on4 <- on(target="numbers", partition="1")
+#on5 <- on(target="numbers", dimension="")
+#onList3 <- list(on4, on5)
+#res3 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=onList3, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators=NULL)
+#query3 <- tdQuery(res3)
+#print(query3)
+
+#on6 <- on(target="select 1", partition="1")
+#on7 <- on(target="select * from test", dimension = "")
+#onList4 <- list(on6, on7)
+#res4 <- td.ExecR(selectPhrase = "select * from TD_SYSGPL.ExecR", ons=onList4, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators = "keeolog(1)\nlogdebug(1)")
+#query4 <- tdQuery(res4)
+#print(query4)
+
+#on8 <- on(target="select * from test", as="test")
+#res5 <- td.ExecR(selectPhrase = "select * from TD_SYSGPL.ExecR", ons=on8, contract= "~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query5 <- tdQuery(res5)
+#print(query5)
+
+#on9 <- on(target="test", as="test1", partition="c1")
+#on10 <- on(target ="test", as="test2", dimension="")
+#onList5 <- list(on9, on10)
+#res6 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=onList5, contract= "~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query6 <- tdQuery(res6)
+#print(query6)
+
+#on11 <- on(target="test", as="test1", partition="c1")
+#on12 <- on(target="test", as="test2", dimension=" ")
+#on13 <- on(target="test", as="test3", dimension=" ")
+#onList6 <- list(on11, on12, on13)
+#res7 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=onList6, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators = "keeplog(1)\nlogdebug(1)")
+#query7 <- tdQuery(res7)
+#print(query7)
+
+#on14 <- on(target="select *", from ="test", hash="c1", local_order="c1")
+#res8 <- td.ExecR(selectPhrase="select distinct * from TD_SYSGPL.ExecR", ons=on14, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt")
+#query8 <- tdQuery(res8)
+#print(query8)
+
+#on15 <- on(target= "select * from test", partition="c1")
+#res9 <- td.ExecR(selectPhrase="select * from TD_SYSGPL.ExecR", ons=on15, contract="~/Documents/RRR/Contract.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query9 <- tdQuery(res9)
+#print(query9)
+
+#on16 <- on(target="twm_customer_analysis", partition="marital_status")
+#res10 <- td.ExecR(selectPhrase="select * from TD_SYSGPL.ExecR", ons=on16, returns="~/Documents/RRR/returns.txt", operator="~/Documents/RRR/Test/basicOperator.txt", optional_operators="keeplog(1)\nlogdebug(1)")
+#query10 <- tdQuery(res10)
+#print(query10)
+
+#test case does not work
+#on17 <- on(target="select * from test")
+#res11 <- td.ExecR(selectPhrase="select * from TD_SYSGPL.ExecR", ons=on17, returns="testout", operator="~/Documents/RRR/Test/basicOperator.txt")
+#query11 <- tdQuery(res11)
+#print(query11)
+
+#test case missing contract clause.  Should get an error
+#on18 <- on(target="select *", from="test")
+#res12 <- td.ExecR(selectPhrase="select * from TD_SYSGPL.ExecR", ons=on18, operator="~/Documents/RRR/Test/basicOperator.txt")
+#query12 <- tdQuery(res12)
+#print(query12)
\ No newline at end of file
diff --git a/test/testINITCAP.R b/test/testINITCAP.R
new file mode 100644
index 0000000..4560285
--- /dev/null
+++ b/test/testINITCAP.R
@@ -0,0 +1,42 @@
+# Below is the table used for the test, called "test"
+#        c1         c2          c3        
+# ---------- ----------- ----------
+#         5          cat        dog
+#         4        robot      human
+#         6        horse      force
+#         3         ball        bat
+#         1        mouse      house
+#         2         fork      spoon
+# the R code is below:
+tdf <- td.data.frame("test")
+tdf["c4"] <- INITCAP(tdf["c2"])
+as.td.data.frame(tdf, tableName="test2")
+
+# Below are the results of the table, when you type "select * from test2"
+#        c1         c2          c3         c4    
+# ---------- ----------- ---------- ---------
+#         5          cat        dog       Cat
+#         4        robot      human     Robot
+#         6        horse      force     Horse
+#         3         ball        bat      Ball
+#         1        mouse      house     Mouse
+#         2         fork      spoon      Fork
+#
+# To verify each entry of test2
+res1 = tdQuery("select c4 from test2 where c1=5") == "Cat"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from test2 where c1=4") == "Robot"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from test2 where c1=6") == "Horse"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from test2 where c1=3") == "Ball"
+stopifnot(res4)
+
+res5 = tdQuery("select c4 from test2 where c1=1") == "Mouse"
+stopifnot(res5)
+
+res6 = tdQuery("select c4 from test2 where c1=2") == "Fork"
+stopifnot(res6)
\ No newline at end of file
diff --git a/test/testINSTR.R b/test/testINSTR.R
new file mode 100644
index 0000000..acc23e5
--- /dev/null
+++ b/test/testINSTR.R
@@ -0,0 +1,24 @@
+# Below is the table used for the test, called "charTab"
+# c1          c2        c3        c4        c5
+# ----------  ---- ------- --------- ---------
+# explore     lo        xx         e         z
+# interrupt   ter      xyz         u         z
+# disappear   ar        yy         s         z
+# factor      ac        xy         c         z
+# appreciate  pp        xx         r         z
+
+tdf <- td.data.frame("charTab")
+tdf["c6"] <- INSTR(tdf["c1"], tdf["c2"])
+as.td.data.frame(tdf, tableName="charTab2")
+
+# This is the resulting table, called "charTab2"
+# c1          c2        c3        c4        c5        c6
+# ----------  ---- ------- --------- --------- ---------
+# explore     lo        xx         e         z         4
+# interrupt   ter      xyz         u         z         3
+# disappear   ar        yy         s         z         8
+# factor      ac        xy         c         z         2
+# appreciate  pp        xx         r         z         2                
+
+# While running the equivalent code in bteq produces the same table, this test does not seem to give the expected output
+# I recommend further testing.
\ No newline at end of file
diff --git a/test/testLPAD.R b/test/testLPAD.R
new file mode 100644
index 0000000..b8feb86
--- /dev/null
+++ b/test/testLPAD.R
@@ -0,0 +1,33 @@
+# Below is the table used for the test, called "padTab"
+# c1               c2               c3
+# ---------------  ---------------  ---------------
+# Emily                 Emily       Emily
+# Daisy                 Daisy       Daisy
+# Hank                   Hank       Hank
+# Amy                     Amy       Amy
+#
+# the R code is below:
+tdf <- td.data.frame("padTab")
+tdf["c4"] <- LPAD(tdf["c3"], 15, "x")
+as.td.data.frame(tdf, tableName="padTab2")
+
+# Below are the results of the table, when you type "select * from padTab2"
+# c1              c2              c3              c4
+# --------------- --------------- --------------- ---------------------------
+# Emily                 Emily     Emily           xxxxxxxxxxEmily
+# Daisy                Daisy      Daisy           xxxxxxxxxxDaisy
+# Hank                  Hank      Hank            xxxxxxxxxxxHank
+# Amy                    Amy      Amy             xxxxxxxxxxxxAmy
+
+# To verify each entry of c4:
+res1 = tdQuery("select c4 from padTab2 where c3='Emily'") == "xxxxxxxxxxEmily"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from padTab2 where c3='Daisy'") == "xxxxxxxxxxDaisy"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from padTab2 where c3='Hank'") == "xxxxxxxxxxxHank"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from padTab2 where c3='Amy'") == "xxxxxxxxxxxxAmy"
+stopifnot(res4)
\ No newline at end of file
diff --git a/test/testLTRIM.R b/test/testLTRIM.R
new file mode 100644
index 0000000..c680571
--- /dev/null
+++ b/test/testLTRIM.R
@@ -0,0 +1,31 @@
+# Below is the table used for the test, called "padTab"
+# c1               c2               c3
+# ---------------  ---------------  ---------------
+# Emily                 Emily       Emily
+# Daisy                 Daisy       Daisy
+# Hank                   Hank       Hank
+# Amy                     Amy       Amy
+
+tdf <- td.data.frame("padTab")
+tdf["c4"] <- LTRIM(tdf["c2"])
+as.td.data.frame(tdf, tableName="padTab2")
+
+#this is the resulting table caled "padTab2"
+# c1          c2          c3          c4
+# ----------  ----------  ----------  ----------
+# Emily            Emily  Emily       Emily
+# Daisy            Daisy  Daisy       Daisy
+# Hank              Hank  Hank        Hank
+# Amy                Amy  Amy         Amy
+
+res1 = tdQuery("select c4 from padTab2 where c3='Emily'") == "Emily"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from padTab2 where c3='Daisy'") == "Daisy"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from padTab2 where c3='Hank'") == "Hank"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from padTab2 where c3='Amy'") == "Amy"
+stopifnot(res4)
\ No newline at end of file
diff --git a/test/testNGRAM.R b/test/testNGRAM.R
new file mode 100644
index 0000000..da911ae
--- /dev/null
+++ b/test/testNGRAM.R
@@ -0,0 +1,41 @@
+# Below is the table used for the test, called "test"
+#        c1         c2          c3        
+# ---------- ----------- ----------
+#         5          cat        dog
+#         4        robot      human
+#         6        horse      force
+#         3         ball        bat
+#         1        mouse      house
+#         2         fork      spoon
+
+tdf <- td.data.frame("test")
+tdf["c4"] <- NGRAM(tdf["c2"], tdf["c3"], 2)
+as.td.data.frame(tdf, tableName="test2")
+
+#this is the resulting table, called "test2"
+#        c1         c2          c3         c4     
+# ---------- ----------- ---------- ---------
+#         5          cat        dog         0
+#         4        robot      human         0
+#         6        horse      force         1
+#         3         ball        bat         1
+#         1        mouse      house         3
+#         2         fork      spoon         0
+#
+res1 = tdQuery("select c4 from test2 where c1=5") == 0
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from test2 where c1=4") == 0
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from test2 where c1=6") == 1
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from test2 where c1=3") == 1
+stopifnot(res4)
+
+res5 = tdQuery("select c4 from test2 where c1=1") == 3
+stopifnot(res5)
+
+res6 = tdQuery("select c4 from test2 where c1=2") == 0
+stopifnot(res6)
\ No newline at end of file
diff --git a/test/testOREPLACE.R b/test/testOREPLACE.R
new file mode 100644
index 0000000..3b20a50
--- /dev/null
+++ b/test/testOREPLACE.R
@@ -0,0 +1,37 @@
+# Below is the table used for the test, called "charTab"
+# c1          c2        c3        c4        c5
+# ----------  ---- ------- --------- ---------
+# explore     lo        xx         e         z
+# interrupt   ter      xyz         u         z
+# disappear   ar        yy         s         z
+# factor      ac        xy         c         z
+# appreciate  pp        xx         r         z
+
+tdf <- td.data.frame("charTab")
+tdf["c6"] <- OREPLACE(tdf["c1"], tdf["c2"], tdf["c3"])
+as.td.data.frame(tdf, tableName="charTab2")
+
+#this is the resulting table, charTab2
+# c1          c2        c3        c4        c5         c6
+# ----------  ---- ------- --------- --------- ----------
+# explore     lo        xx         e         z    expxxre
+# interrupt   ter      xyz         u         z  inxyzrupt
+# disappear   ar        yy         s         z  disappeyy
+# factor      ac        xy         c         z     fxytor
+# appreciate  pp        xx         r         z axxreciate
+#
+# To verify each entry of c6:
+res1 = tdQuery("select c6 from charTab2 where c1='explore'") == "expxxre"
+stopifnot(res1)
+
+res2 = tdQuery("select c6 from charTab2 where c1='interrupt'") == "inxyzrupt"
+stopifnot(res2)
+
+res3 = tdQuery("select c6 from charTab2 where c1='disappear'") == "disappeyy"
+stopifnot(res3)
+
+res4 = tdQuery("select c6 from charTab2 where c1='factor'") == "fxytor"
+stopifnot(res4)
+
+res5 = tdQuery("select c6 from charTab2 where c1='appreciate'") == "axxreciate"
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testOTRANSLATE.R b/test/testOTRANSLATE.R
new file mode 100644
index 0000000..0a98f2a
--- /dev/null
+++ b/test/testOTRANSLATE.R
@@ -0,0 +1,38 @@
+# Below is the table used for the test, called "charTab"
+# c1          c2        c3        c4        c5
+# ----------  ---- ------- --------- ---------
+# explore     lo        xx         e         z
+# interrupt   ter      xyz         u         z
+# disappear   ar        yy         s         z
+# factor      ac        xy         c         z
+# appreciate  pp        xx         r         z
+
+tdf <- td.data.frame("charTab")
+tdf["c6"] <- OTRANSLATE(tdf["c1"], tdf["c4"], tdf["c5"])
+as.td.data.frame(tdf, tableName="charTab2")
+
+#this is the resulting table, charTab2
+#
+# c1          c2        c3        c4        c5         c6
+# ----------  ---- ------- --------- --------- ----------
+# explore     lo        xx         e         z    zxplorz
+# interrupt   ter      xyz         u         z  interrzpt
+# disappear   ar        yy         s         z  dizappear
+# factor      ac        xy         c         z     faztor
+# appreciate  pp        xx         r         z appzeciate
+
+# To verify each entry of c6:
+res1 = tdQuery("select c6 from charTab2 where c1='explore'") == "zxplorz"
+stopifnot(res1)
+
+res2 = tdQuery("select c6 from charTab2 where c1='interrupt'") == "interrzpt"
+stopifnot(res2)
+
+res3 = tdQuery("select c6 from charTab2 where c1='disappear'") == "dizappear"
+stopifnot(res3)
+
+res4 = tdQuery("select c6 from charTab2 where c1='factor'") == "faztor"
+stopifnot(res4)
+
+res5 = tdQuery("select c6 from charTab2 where c1='appreciate'") == "appzeciate"
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testOn.R b/test/testOn.R
new file mode 100644
index 0000000..006cc43
--- /dev/null
+++ b/test/testOn.R
@@ -0,0 +1,31 @@
+#test On()
+#res1 = on(target="select *", from="tab1", partition = "any", hash = "col1") == "on (select * from tab1)\npartition by any\nhash by col1"
+#print(res1)
+#stopifnot(res1)
+
+#res2 = on(target="select *", from="tab1", hash="col1", local_order="col2") == "on (select * from tab1)\nhash by col1\nlocal order by col2"
+#stopifnot(res2)
+
+#res3 = on(target="tab1", partition="col1") == "on tab1\npartition by col1"
+#print(res3)
+#stopifnot(res3)
+
+#res4 = on(target="tab1", dimension= " ") == "on tab1\ndimension"
+#stopifnot(res4)
+
+#res5 = on(target="select 1", partition="1") == "on (select 1)\npartition by 1"
+#print(res5)
+#stopifnot(res5)
+
+#res6 = on(target="select *", from="tab1", hash="col1", local_order="col1, col2") == "on (select * from tab1)\nhash by col1\nlocal order by col1, col2"
+#print(res6)
+#stopifnot(res6)
+
+#res7 = on(target="select *", from="tab1", as="test") == "on (select * from tab1)\nas test"
+#print(res7)
+#stopifnot(res7)
+
+#on1 = on(target="select p, var1, var2, var3, var4, var5", from="TestCM_Mult", local_order="p")
+#littleOnClause= toQuery(selectPhrase="select * from TD_SYSFNLIB.calcmatrix", ons=on1, phase="local", as="D1")
+#ons2 = on(target="select *", from="TD_SYSFNLIB.calcmatrix", subQuery=on1, hash="p", local_order="p")
+#print(ons2)
\ No newline at end of file
diff --git a/test/testPOWER.R b/test/testPOWER.R
new file mode 100644
index 0000000..0f73292
--- /dev/null
+++ b/test/testPOWER.R
@@ -0,0 +1,38 @@
+# Below is the table used for the test, called "numTab"
+#
+# c1                    c2  c3
+# -----------  -----------  --
+# 5                     2   9
+# 6                     3   9
+# 3                     2   9
+# 8                     3   9
+# 2                     4   9
+
+tdf <- td.data.frame("numTab")
+tdf['c4'] <- POWER(tdf['c1'], tdf['c2'])
+as.td.data.frame(tdf, tableName="numTab2")
+
+# this is the resulting table, called "numTab2"
+# c1           c2           c3                                        c4
+# -----------  -----------  --  ----------------------------------------
+# 5            2            9                                         25
+# 6            3            9                                        216
+# 3            2            9                                          9
+# 8            3            9                                        512
+# 2            4            9                                         16
+
+# To verify each entry of c4:
+res1 = tdQuery("select c4 from numTab2 where c1=5") == 25
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from numTab2 where c1=6") == 216
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from numTab2 where c1=3") == 9
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from numTab2 where c1=8") == 512
+stopifnot(res4)
+
+res5 = tdQuery("select c4 from numTab2 where c1=2") == 16
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testRPAD.R b/test/testRPAD.R
new file mode 100644
index 0000000..8761d80
--- /dev/null
+++ b/test/testRPAD.R
@@ -0,0 +1,33 @@
+# Below is the table used for the test, called "padTab"
+# c1               c2               c3
+# ---------------  ---------------  ---------------
+# Emily                 Emily       Emily
+# Daisy                 Daisy       Daisy
+# Hank                   Hank       Hank
+# Amy                     Amy       Amy
+#
+# the R code is below:
+tdf <- td.data.frame("padTab")
+tdf["c4"] <- RPAD(tdf["c3"], 15, "x")
+as.td.data.frame(tdf, tableName="padTab2")
+
+# Below are the results of the table, when you type "select * from padTab2" 
+# into bteq
+# c1         c2         c3         c4
+# ---------- ---------- ---------- ------------------------------------------
+# Emily           Emily Emily      Emilyxxxxxxxxxx
+# Daisy           Daisy Daisy      Daisyxxxxxxxxxx
+# Hank             Hank Hank       Hankxxxxxxxxxxx
+# Amy               Amy Amy        Amyxxxxxxxxxxxx
+#
+res1 = tdQuery("select c4 from padTab2 where c3='Emily'") == "Emilyxxxxxxxxxx"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from padTab2 where c3='Daisy'") == "Daisyxxxxxxxxxx"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from padTab2 where c3='Hank'") == "Hankxxxxxxxxxxx"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from padTab2 where c3='Amy'") == "Amyxxxxxxxxxxxx"
+stopifnot(res4)
\ No newline at end of file
diff --git a/test/testRTRIM.R b/test/testRTRIM.R
new file mode 100644
index 0000000..793c5a1
--- /dev/null
+++ b/test/testRTRIM.R
@@ -0,0 +1,28 @@
+# Below is the table used for the test, called "padTab"
+# c1               c2               c3
+# ---------------  ---------------  ---------------
+# Emily                 Emily       Emily
+# Daisy                 Daisy       Daisy
+# Hank                   Hank       Hank
+# Amy                     Amy       Amy
+
+tdf <- td.data.frame("padTab")
+tdf["c4"] <- RTRIM(tdf["c1"])
+as.td.data.frame(tdf, tableName="padTab2")
+# c1          c2          c3          c4
+# ----------  ----------  ----------  ----------
+# Emily            Emily  Emily       Emily
+# Daisy            Daisy  Daisy       Daisy
+# Hank              Hank  Hank        Hank
+# Amy                Amy  Amy         Amy
+res1 = tdQuery("select c4 from padTab2 where c3='Emily'") == "Emily"
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from padTab2 where c3='Daisy'") == "Daisy"
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from padTab2 where c3='Hank'") == "Hank"
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from padTab2 where c3='Amy'") == "Amy"
+stopifnot(res4)
\ No newline at end of file
diff --git a/test/testSIGN.R b/test/testSIGN.R
new file mode 100644
index 0000000..3a8b9e0
--- /dev/null
+++ b/test/testSIGN.R
@@ -0,0 +1,43 @@
+# Below is the table used for the test, called "negNums"
+#
+#          c1
+# -----------
+#           3
+#         -11
+#           0
+#           4
+#          -2
+#         555 
+
+tdf <- td.data.frame("negNums")
+tdf["c2"] <- SIGN(tdf["c1"])
+as.td.data.frame(tdf, tableName="negNums2")
+
+#this is the resulting table, called "negNums2"
+#          c1                                        c2
+# -----------  ----------------------------------------
+#           3                                         1
+#         -11                                        -1
+#           0                                         0
+#           4                                         1
+#          -2                                        -1
+#         555                                         1
+
+# To verify each entry of c2:
+res1 = tdQuery("select c2 from negNums2 where c1=3") ==1
+stopifnot(res1)
+
+res2 = tdQuery("select c2 from negNums2 where c1=-11") == -1
+stopifnot(res2)
+
+res3 = tdQuery("select c2 from negNums2 where c1=0") == 0
+stopifnot(res3)
+
+res4 = tdQuery("select c2 from negNums2 where c1=4") == 1
+stopifnot(res4)
+
+res5 = tdQuery("select c2 from negNums2 where c1=-2") == -1
+stopifnot(res5)
+
+res6 = tdQuery("select c2 from negNums2 where c1=555") == 1
+stopifnot(res6)
\ No newline at end of file
diff --git a/test/testTO_CHAR.R b/test/testTO_CHAR.R
new file mode 100644
index 0000000..89af1e3
--- /dev/null
+++ b/test/testTO_CHAR.R
@@ -0,0 +1,40 @@
+# Below is the table used for the test, called "numTab"
+# c1                    c2  c3
+# -----------  -----------  --
+# 5                     2   9
+# 6                     3   9
+# 3                     2   9
+# 8                     3   9
+# 2                     4   9
+
+tdf <- td.data.frame("numTab")
+tdf["c4"] <- TO_CHAR(tdf["c1"], tdf["c3"])
+as.td.data.frame(tdf, tableName="numTab2")
+
+# this is the resulting table, called "numTab2"  Although the values look 
+# unchanged, the type of 'c4' is a varchar, while the type of 'c1' is an 
+# integer. This can be verified by typing "show table numTab2" into bteq or 
+# "tdQuery("show table numTab2")" into RStudio.
+# c1                   c2 c3 c4
+# ----------- ----------- -- ------------------------------------------------
+# 5                     2 9   5
+# 6                     3 9   6
+# 3                     2 9   3
+# 8                     3 9   8
+# 2                     4 9   2
+
+# To verify each entry of c4:
+res1 = tdQuery("select c4 from numTab2 where c1=5") == '5'
+stopifnot(res1)
+
+res2 = tdQuery("select c4 from numTab2 where c1=6") == '6'
+stopifnot(res2)
+
+res3 = tdQuery("select c4 from numTab2 where c1=3") == '3'
+stopifnot(res3)
+
+res4 = tdQuery("select c4 from numTab2 where c1=8") == '8'
+stopifnot(res4)
+
+res5 = tdQuery("select c4 from numTab2 where c1=2") == '2'
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testTO_NUMBER.R b/test/testTO_NUMBER.R
new file mode 100644
index 0000000..6c12cf9
--- /dev/null
+++ b/test/testTO_NUMBER.R
@@ -0,0 +1,50 @@
+# Below is the table used for the test, called "numManip"
+# c1                                           c2
+# -----  ----------------------------------------
+# 2                                         8.289
+# 5                                         13.99
+# 4                                         17.06
+# 3                                          48.1
+# 1                                         555.3
+#
+# the R code is below:
+tdf <- td.data.frame("numManip")
+tdf["c3"] <- TO_NUMBER(tdf['c1'])
+as.td.data.frame(tdf, tableName="numManip2")
+#
+# Below are the results of the table, when you type "select * from numManip2"
+# c1                                          c2                           c3
+# ----- ---------------------------------------- ----------------------------
+# 2                                        8.289                            2
+# 5                                        13.99                            5
+# 4                                        17.06                            4
+# 3                                         48.1                            3
+# 1                                        555.3                            1
+#
+# To verify the data type of c3, type 'show table numManip2' into bteq:
+# CREATE SET TABLE ECOLE.numManip2 ,NO FALLBACK ,
+# NO BEFORE JOURNAL,
+# NO AFTER JOURNAL,
+# CHECKSUM = DEFAULT,
+# DEFAULT MERGEBLOCKRATIO
+# (
+# c1 CHAR(5) CHARACTER SET LATIN NOT CASESPECIFIC,
+# c2 NUMBER,
+# c3 NUMBER)
+# PRIMARY INDEX ( c1 );
+#
+# To verify each entry of c3:
+res1 = tdQuery("select c3 from numManip2 where c1='2'") == 2
+stopifnot(res1)
+
+res2 = tdQuery("select c3 from numManip2 where c1='5'") == 5
+stopifnot(res2)
+
+res3 = tdQuery("select c3 from numManip2 where c1='4'") == 4
+stopifnot(res3)
+
+res4 = tdQuery("select c3 from numManip2 where c1='3'") == 3
+stopifnot(res4)
+
+res5 = tdQuery("select c3 from numManip2 where c3='1'") == 1
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testTRUNC.R b/test/testTRUNC.R
new file mode 100644
index 0000000..52a5d13
--- /dev/null
+++ b/test/testTRUNC.R
@@ -0,0 +1,37 @@
+# Below is the table used for the test, called "numManip"
+# c1                                           c2
+# -----  ----------------------------------------
+# 2                                         8.289
+# 5                                         13.99
+# 4                                         17.06
+# 3                                          48.1
+# 1                                         555.3
+#
+# the R code is below:
+tdf <- td.data.frame("numManip")
+tdf["c3"] <- TRUNC(tdf["c2"], 1)
+as.td.data.frame(tdf, tableName="numManip2")
+# Below are the results of the table, when you type "select * from numManip2"
+# c1                                           c2                        c3
+# -----  ---------------------------------------- -------------------------
+# 2                                         8.289                        8.2
+# 5                                         13.99                       13.9
+# 4                                         17.06                         17
+# 3                                          48.1                       48.1
+# 1                                         555.3                      555.3  
+#
+# To verify each entry of c3:
+res1 = tdQuery("select c3 from numManip2 where c1='2'") == 8.2
+stopifnot(res1)
+
+res2 = tdQuery("select c3 from numManip2 where c1='5'") == 13.9
+stopifnot(res2)
+
+res3 = tdQuery("select c3 from numManip2 where c1='4'") == 17
+stopifnot(res3)
+
+res4 = tdQuery("select c3 from numManip2 where c1='3'") == 48.1
+stopifnot(res4)
+
+res5 = tdQuery("select c3 from numManip2 where c1='1'") == 555.3
+stopifnot(res5)
\ No newline at end of file
diff --git a/test/testUtil.R b/test/testUtil.R
new file mode 100755
index 0000000..baeec57
--- /dev/null
+++ b/test/testUtil.R
@@ -0,0 +1,25 @@
+#test makePartition()
+#res= .td.makePartition("col1, col2") == "partition by col1, col2"
+#print(res)
+#stopifnot(res)
+
+#res = .td.makePartition(partition = "any") == "partition by any"
+#stopifnot(res)
+
+#test makeHash()
+#res = .td.makeHash("col1") == "hash by col1"
+#stopifnot(res)
+
+#res = .td.makeHash("col1") == "nope"
+#stopifnot(res)
+
+#test makeOrder()
+#res = .td.makeOrder("col1, col2") == "order by col1, col2"
+#stopifnot(res)
+
+#test makeDimension()
+#res = .td.makeDimension() == "dimension"
+#stopifnot(res)
+
+#test makeLocalOrder()
+#res = .td.makeLocalOrder("col1")